![]() |
FindClass Bug
Hallo Community,
ich habe ein großes Problem an dem ich nun mitlerweile schon eine ganze weile Bastel, jedoch nicht auf die Lösug komme. Ich arbeite an einer erweiterten Version einer Objekt orientierten Datenbank, vielmehr an einer Komponente, die dies mit relationalen Datenbanken ermöglicht. Bis jetzt hat auch alles wunderbar funktioniert, bis jetzt ... Nachdem ich nun auch Klassenobjekte einbinden möchte, habe ich folgendes Problem. Es wird der falsche konstruktor aufgerufen! Kleines Beispiel zur besseren rekonstruktion:
Delphi-Quellcode:
Das Problem ist hier, dass nicht der Konstruktor der Klasse TTestKlasse2 sondern nur der Konstruktor der Klasse TTestKlasse aufgerufen wird! Wenn ich jedoch den Debugger bemühe, sehe ich, dass die Variable TCC eindeutig vom Typ TTestKlasse2 ist! Auch wird der Speicher korrekt Allokiert, so ist die Variable T zugreifbar, auch wenn sie leer ist.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TTestKlasse=class(TPersistent) public procedure LoadChild; private Child:TTestKlasse; published Constructor create; destructor destroy; override; end; TTestKlasse2=class(TTestKlasse) public List:TStringList; T:String; published constructor create; destructor destroy; override; end; TTestKlasseClass = class of TTestKlasse; var Form1: TForm1; implementation {$R *.dfm} { TTestKlasse2 } constructor TTestKlasse2.create; begin List:=TstringList.create; List.add('Hallo'); T:='Hallo'; end; destructor TTestKlasse2.destroy; begin List.free; inherited; end; { TTestKlasse } constructor TTestKlasse.create; begin end; destructor TTestKlasse.destroy; begin inherited; end; procedure TTestKlasse.LoadChild; var TCC:TTestKlasseClass; begin TCC:=TTestKlasseClass(FindClass('TTestKlasse2')); Child:=TCC.create; showmessage(TTestKlasse2(Child).T); showmessage(TTestKlasse2(Child).List.Text); end; procedure TForm1.Button1Click(Sender: TObject); var TC:TTestKlasse; begin registerclass(TTestKlasse2); TC:=TTestklasse.create; TC.loadChild end; end. Änder ich das class of in class of TTestKlasse2 funktioniert das ganze, was aber nicht sinn der Sache ist! Ich hoffe ihr könnt mir helfen! Danke! |
Re: FindClass Bug
TCC ist als Class of TTestKlasse definiert (ohne 2).
Ansonsten solltest Du den Construktor als virtual definieren und in der abgeleiteten als override. @jbg: Irgendwas verwechseln Leute immer wieder... |
Re: FindClass Bug
Zitat:
|
Re: FindClass Bug
Zitat:
Und für Tommie wäre das hier mal ein Fall für MetaClasses. (also virtuelle Konstruktoren ;) ) |
Re: FindClass Bug
Ihr seid meine Retter! Funktioniert wunderbar!
Hier für alle, die den Thread mitlesen die Lösung:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TTestKlasse=class(TPersistent) public procedure LoadChild; private Child:TTestKlasse; T1:String; published Constructor create; virtual; destructor destroy; override; end; TTestKlasse2=class(TTestKlasse) public List:TStringList; T:String; published constructor create; override; destructor destroy; override; end; TTestKlasseClass = class of TTestKlasse; var Form1: TForm1; implementation {$R *.dfm} { TTestKlasse2 } constructor TTestKlasse2.create; begin List:=TstringList.create; List.add('Hallo'); T:='Hallo'; inherited; end; destructor TTestKlasse2.destroy; begin List.free; inherited; end; { TTestKlasse } constructor TTestKlasse.create; begin T1:='Hallo von Test'; end; destructor TTestKlasse.destroy; begin inherited; end; procedure TTestKlasse.LoadChild; var TCC:TTestKlasseClass; begin TCC:=TTestKlasseClass(FindClass('TTestKlasse2')); Child:=TCC.create; showmessage(TTestKlasse2(Child).T); showmessage(self.T1); showmessage(TTestKlasse2(Child).List.Text); end; procedure TForm1.Button1Click(Sender: TObject); var TC:TTestKlasse; begin registerclass(TTestKlasse2); TC:=TTestklasse.create; TC.loadChild end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz