Thema: Delphi FindClass Bug

Einzelnen Beitrag anzeigen

r4id3n

Registriert seit: 11. Jan 2005
28 Beiträge
 
#1

FindClass Bug

  Alt 4. Sep 2005, 21:51
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:
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.
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.

Ä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!
  Mit Zitat antworten Zitat