Einzelnen Beitrag anzeigen

Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Aus einem String eine Klasse erzeugen

  Alt 25. Nov 2010, 12:42
vielleicht gibt es doch Fälle bei denen man es einsetzen möchte.

Für Controls funktioniert es wie gewünscht, für eigene Klassen könnte man gegf. Statt TClass syn. TObject beiliegnde TBaseObject verwenden.

nur als Vorschlag.. btw. wenn die Klassen im Code nur deklariert sind und nirgends verwendet werden, läuft das ganze nicht da der Linker den Code wegoptimiert.

Delphi-Quellcode:
unit EXCreateByClassName;
// 20101125 Thomas Wassermann
interface
uses RTTI,TypInfo,Controls,Classes;


type
  TBaseObject=Class
     Constructor Create(a:TValue);virtual;
  End;
TBaseObjectClass= Class of TBaseObject;

Function CreateClassByClassName(const s:String;a:Tvalue):TObject;
Function CreateControlClassByClassName(const s:String;Owner:TComponent):TControl;
implementation

Function CreateClassByClassName(const s:String;a:Tvalue):TObject;
var
  aClass : TClass;
  context : TRttiContext;
  types : TArray<TRttiType>;
  aType : TRttiType;
begin
  Result := nil;
  context := TRttiContext.Create;
  types := context.GetTypes;
  for aType in types do
  begin
    if aType.TypeKind = tkClass then
    begin
      aClass := aType.AsInstance.MetaclassType;
      if aClass.ClassName = s then
        begin
        Result := TBaseObjectClass(aClass).Create(a);
        end;
    end;
  end;
end;

Function CreateControlClassByClassName(const s:String;Owner:TComponent):TControl;
var
  aClass : TClass;
  context : TRttiContext;
  types : TArray<TRttiType>;
  aType : TRttiType;
  StrClass:TControl;
begin
  Result := nil;
  context := TRttiContext.Create;
  types := context.GetTypes;
  for aType in types do begin
    if aType.TypeKind = tkClass then begin
      aClass := aType.AsInstance.MetaclassType;
      if aClass.ClassName = s then begin
        Result := TControlClass(aClass).Create(Owner);
      end;
    end;
  end;
end;


{ TBaseObject }

constructor TBaseObject.Create(a: TValue);
begin
  inherited Create;
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat