AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FindClass Bug

Ein Thema von r4id3n · begonnen am 4. Sep 2005 · letzter Beitrag vom 5. Sep 2005
Antwort Antwort
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
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: FindClass Bug

  Alt 4. Sep 2005, 22:02
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...
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: FindClass Bug

  Alt 4. Sep 2005, 22:49
Zitat von GuenterS:
und in der abgeleiteten als overload.
Das die Leute overload und override immer wieder verwechseln.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

Re: FindClass Bug

  Alt 4. Sep 2005, 22:52
Zitat von jbg:
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 )
  Mit Zitat antworten Zitat
r4id3n

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

Re: FindClass Bug

  Alt 5. Sep 2005, 09:23
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 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