Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TPersistent über Findclass erzeugen und Constructor (https://www.delphipraxis.net/124798-tpersistent-ueber-findclass-erzeugen-und-constructor.html)

Rainer Wolff 25. Nov 2008 13:48


TPersistent über Findclass erzeugen und Constructor
 
Hallo Delphi-User,

Ich will Klassen über FindClass nach folgendem Schema erzeugen. Ich wundere mich aber, warum kein Constructor der Klasse TTest aufgerufen wird. Anscheinend wird nur der Constructor von TObject aufgerufen, aber nicht der von TTest.
Erzeuge ich jedoch TTest direkt über einen Aufruf TTest.Create, scheint der Constructor aufgerufen zu werden.

Wo liegt hier noch mein Fehler?

Vielen Dank

Rainer

Delphi-Quellcode:
  TTest = class(TPersistent)
  private
    FX: Integer;
  public
    constructor Create; virtual;
    property X: Integer read FX write FX;
  end;

constructor TTest.Create;
begin
  x:=5;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  tc: TPersistentClass;
begin
  tc:=FindClass('TTest');
  p:=TPersistent(tc.Create);
end;

initialization
  RegisterClass(TTest);

finalization
  UnRegisterClass(TTest);

mkinzler 25. Nov 2008 13:52

Re: TPersistent über Findclass erzeugen und Constructor
 
Versuch es mal so:

Delphi-Quellcode:
TTest = class(TPersistent)
  private
    FX: Integer;
  public
    constructor Create; virtual; override;
    property X: Integer read FX write FX;
  end;

constructor TTest.Create;
begin
  inherited Create;
  FX:=5;
end;

Rainer Wolff 25. Nov 2008 14:00

Re: TPersistent über Findclass erzeugen und Constructor
 
Geht nicht

Delphi-Quellcode:
    constructor Create; virtual; override;
Zitat:

[Pascal Fehler] Unit1.pas(19): E2169 Felddefinition nicht erlaubt nach Methoden oder Eigenschaften
Delphi-Quellcode:
    constructor Create; override; virtual;
Zitat:

[Pascal Fehler] Unit1.pas(19): E2170 Eine nichtvirtuelle Methode kann nicht überschrieben werden
Ausserdem funktioniert der Constructor ja, wenn ich ihn über TTest.Create erzeuge.

Ich habe ein funktionierendes Beispiel aus der DP, das aber mit Objekten arbeitet, die von TComponent statt TPersistent abgeleitet sind, da funktionierts komischerweise.

Hawkeye219 25. Nov 2008 14:35

Re: TPersistent über Findclass erzeugen und Constructor
 
Hallo Rainer,

der Konstruktor von TPersistent ist statisch, du benötigst also eine eigene Klassenreferenz, um dem Compiler deinen Wunsch mitzuteilen:

Delphi-Quellcode:
type
  TTestClass = class of TTest;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  tc: TPersistentClass;
  p : TPersistent; // oder TTest
begin
  tc:=FindClass('TTest');
  p:=TTestClass(tc).Create;
end;
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 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