Aahhhhh! oO *Licht aufgeh*
Nagut, wenn man mit zu hohen Erwartungen an Sachen rangeht ist klar, dass man oft enttäuscht wird:
Ich dachte dass alle
VCL Komponenten quasi "von Hause aus" mit einem funktionierenden "Assign" ausgeliefert werden. Sind sie aber nicht. Wieder was dazugelernt.
Nimmt man nun eine Komponente, die Assign implementiert hat (z.B. TFont), dann klappt auch mein Beispiel vollwertig (inherited wird bei Assign aufgerufen):
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;
TKlasse1 =
class(TFont)
public
X, Y : Integer;
procedure Assign(Source: TPersistent);
override;
end;
TKlasse2 =
class(TKlasse1)
public
Text :
String;
procedure Assign(Source: TPersistent);
override;
end;
TKlasse3 =
class(TKlasse2)
public
Z : Integer;
procedure Assign(Source: TPersistent);
override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
K1 : TKlasse1;
K3 : TKlasse3;
begin
K1 := TKlasse1.Create;
K1.Color := 11;
K3 := TKlasse3.Create;
K3.X := 5778;
K3.Y := 135;
K3.Z := 9788;
K3.Text := '
Bla';
K3.Color := 22;
K1.Assign(K3);
MessageDlg(Format('
X = %d Y = %d Tag = %d', [K1.X, K1.Y, K1.Color]), mtWarning, [mbOK], 0);
// Korrekte Ausgabe: 5778 135 22
end;
{ TKlasse1 }
procedure TKlasse1.Assign(Source: TPersistent);
begin
if Source
is TKlasse1
then
begin
X := TKlasse1(Source).X;
Y := TKlasse1(Source).Y;
end;
INHERITED;
// funktioniert
end;
{ TKlasse2 }
procedure TKlasse2.Assign(Source: TPersistent);
begin
if Source
is TKlasse2
then
begin
Text := TKlasse2(Source).Text;
inherited;
end
else
inherited;
end;
{ TKlasse3 }
procedure TKlasse3.Assign(Source: TPersistent);
begin
if Source
is TKlasse3
then
begin
Z := TKlasse3(Source).Z;
inherited;
end
else
inherited;
end;
end.
Danke für die Erleuchtung