Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassen per String instanhziieren (https://www.delphipraxis.net/146033-klassen-per-string-instanhziieren.html)

mannewolff 12. Jan 2010 15:23


Klassen per String instanhziieren
 
Moin.

Ich meine mal sowas gemacht zu haben, dass man in Delphi eine Klasse nur mit einem String instanziieren kann. Ich möchte nämlich in einer Datei einen Klassennamen konfigurieren um dann eine Klasse zu laden:

Irgendwie so:

Delphi-Quellcode:
var
  s : String;
  o : TCommand;
begin
  s := 'TMyObject';
  o := Class.Load(s);
  o.doSomeThing();
Ich meine mal sowas gesehen zu haben (lang lang ists her), um Objekte aus einem Stream zu lesen. Ich meine Turbo Vision (Turbo Pascal 6) hat das mal so gemacht um Dialogelemente zu lesen.

Uwe Raabe 12. Jan 2010 15:28

Re: Klassen per String instanhziieren
 
Ich denke, FindClass sollte dir da weiterhelfen.

himitsu 12. Jan 2010 15:46

Re: Klassen per String instanhziieren
 
FindClass findet aber nur Klassen, welche vorher auch entsprechend registriert wurden.

mannewolff 12. Jan 2010 16:17

Re: Klassen per String instanhziieren
 
Es ist etwas kompizierter aber es geht.

Zunächst die Klasse definieren.

Delphi-Quellcode:
type

  TCommand = class(TPersistent)
  public
    function execute(AContext: TContext) : boolean; virtual;
  end;

  TCommandClass = class of TCommand;
Dann über FindClass eine Klassenreferenz laden und mit newinstance eine Instanz der Klasse (zuvor natürlich die Klasse registrieren) und (!!) die Klasse muss von TPersistenz erben.

Delphi-Quellcode:
procedure TCatalogFactory.loadCatalogData(fname: String; ac : TContext);
var
  o : TCommand;
  tc : TCommandClass;
  s : String;
begin
   s := 'TCommand'; //..... Name der Klasse laden, später aus Datei
   tc := TCommandClass(FindClass(s));
   o := TCommand(tc.newinstance);
   o.execute(ac);

end;

initialization
   RegisterClass(TCommand);
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz