Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FindClass Bug (https://www.delphipraxis.net/52821-findclass-bug.html)

r4id3n 4. Sep 2005 20:51


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:
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!

GuenterS 4. Sep 2005 21:02

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...

jbg 4. Sep 2005 21:49

Re: FindClass Bug
 
Zitat:

Zitat von GuenterS
und in der abgeleiteten als overload.

Das die Leute overload und override immer wieder verwechseln.

Robert_G 4. Sep 2005 21:52

Re: FindClass Bug
 
Zitat:

Zitat von jbg
Zitat:

Zitat von GuenterS
und in der abgeleiteten als overload.

Das die Leute overload und override immer wieder verwechseln.

Richtig.
Und für Tommie wäre das hier mal ein Fall für MetaClasses. (also virtuelle Konstruktoren ;) )

r4id3n 5. Sep 2005 08:23

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 22:24 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