Also in meinem Editor meiner
Desktop Widget Engine hab ich es so gelöst:
Zuerst hab ich mal eine Liste, in der alle Komponenten sind, die ich für die Widget-Engine zur Verfügung stelle. Das Grundgerüst sieht folgendermaßen aus:
Delphi-Quellcode:
type
TwgComponentClass =
class of TwgComponent;
// meine Grundkomponente
PwgClassListEntry = ^TwgClassListEntry;
TwgClassListEntry =
record
ClassName :
string;
ClassType : TwgComponentClass;
InPalette : boolean;
PaletteEntry:
string;
end;
TwgClassList =
class(TObject)
private
FList : TList;
protected
function GetCount: integer;
function FindClassByName(
Name:
string): TwgComponentClass;
function FindClassByIndex(
index: integer): TwgComponentClass;
function GetItem(
index: integer): PwgClassListEntry;
function IndexOf(ClassName:
string): integer;
function IndexOfClass(aClass: TwgComponentClass): integer;
procedure Clear;
public
constructor Create;
destructor Destroy;
override;
procedure AddClass(ClassName:
string; aClass: TwgComponentClass; InPalette: boolean; PaletteEntry:
string);
function HasClass(ClassName:
string): boolean;
function GetClassName(aClass: TwgComponentClass):
string;
property Items[
index: integer] : PwgClassListEntry
read GetItem;
property GetClass[
Name:
string]: TwgComponentClass
read FindClassByName;
default;
property Count : integer
read GetCount;
end;
var
// eine globale Variable, die im initialization-Teil der Unit erstellt wird
wgClassList: TwgClassList
So, jetzt füge ich erst alle verfügbaren Klassen in die Liste hinzu. Beim Label schaut das z.B. so aus:
wgClassList.AddClass(TwgLabel.ClassName, TwgLabel, True, 'Standard');
Im Editor gibt es dann eine einfache Methode, eine neue Klasse zu erstellen:
Delphi-Quellcode:
function TWidgetEditor.DoAddClass(ClassName: string; var NewObject: TwgComponent): boolean;
var CompClass: TwgComponentClass;
begin
CompClass := wgClassList.GetClass[ClassName];
if CompClass = nil then
result := False
else
begin
NewObject := CompClass.Create;
result := True;
// Und nun die Klasse bei dir im JvInspector anzeigen
AddControls(result, 'Irgendwas');
end;
end;
Ach noch was: Ich verwende nicht TControl als Basis, sondern eine eigene Basisklasse. Daher ist bei mir TwgComponent bei dir TControl
Hoffe das Hilft dir etwas.