Fun fact:
Wenn du niemals auf deinen Button im Sourcecode zugreifst, kannst du sogar die Feldvariable entfernen (nicht empfohlen) und dein Programm funktioniert noch - mit der kleinen Einschränkung, dass diese Klasse mit RegisterClass registriert werden muss, da sonst der
dfm Streaming Mechanismus fehlschlagen würde, weil in diesem Fall aus dem Klassennamen, die in der
dfm steht, eine Instanz der entsprechenden Klasse erzeugen muss.
Fun Fact 2:
Der Typ der Feldvariablen muss nicht mal der Klasse in der
dfm entsprechen, solange beide von TComponent abgeleitet sind.
Delphi-Quellcode:
program FunFact2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Classes;
type
TChild1 =
class(TComponent)
private
FValue: Integer;
public
property Value: Integer
read FValue
write FValue;
end;
TChild2 =
class(TComponent)
private
FValue: Boolean;
public
property Value: Boolean
read FValue
write FValue;
end;
TParent =
class(TComponent)
published
Child: TChild1;
end;
procedure Main;
var
parent: TParent;
child: TChild2;
begin
parent := TParent.Create(
nil);
try
child := TChild2.Create(
nil);
child.
Name := '
Child';
child.Value := true;
parent.InsertComponent(child);
Writeln(Parent.Child.Value);
child.Value := false;
Writeln(Parent.Child.Value);
finally
parent.Free;
end;
end;
begin
try
Main;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
Readln;
end.