Hallo zusammen.
Ich baue gerade an ein paar Komponenten herum, die als Erweiterung an schon länger bestehenden Komponenten benutzt
werden sollen. Ausgangssituation ist in etwa folgendes:
Delphi-Quellcode:
TSubThing = Class(TComponent) //Die zu entwickelnde Komponente
private
FTestString : string;
FTestBool : Boolean;
published
property TestString : String read FTestString write FTestString;
property TestBool : Boolean read FTestBool write FTestBool ;
End;
TSubThingOwner = Class(TComponent) // Eine bestehende Komponente, die das SubThing initialisieren / befüllen soll
constructor Create(AOwner : TComponent);override;
private
FSubThing : TSubThing;
published
property SubThing : TSubThing read FSubThing write FSubThing;
End;
TSubThingUser = Class(TComponent) // Eine neue Komponente, die mit dem befüllten Subthing arbeiten soll.
private
FReferencedSubThing : TSubThing;
published
property ReferencedSubThing : TSubThing read FReferencedSubThing write FReferencedSubThing;
End;
Alle Komponenten sind per Register in die Palette aufgenommen und lassen sich auf die Forms klicken. Der SubThingOwner
erstellt seine Instanz folgendermaßen:
Delphi-Quellcode:
constructor TSubThingOwner.Create(AOwner: TComponent);
begin
inherited;
FSubThing := TSubThing.Create(self);
// FSubThing.SetSubComponent(true);
FSubThing.Name:=Self.Name + 'SUB';
end;
Das Problem ist jetzt, das ich nicht durchblicke, wer das speichern soll. Setze ich SetSubComponent(true) und verknüpfe SubThingUser.ReferencedSubThing
mit der Instanz, die von SubThingOwner erstellt wurde, landet sowas im
DFM:
Delphi-Quellcode:
object TheOwner: TSubThingOwner
SubThing.TestString = 'ABCD'
SubThing.TestBool = True
...
end
object TheUser: TSubThingUser
ReferencedSubThing.TestString = 'ABCD'
ReferencedSubThing.TestBool = True
...
end
Da das SetSubComponent eine Eigenschaft des SubThings und nicht der übergeordneten Komponenten setzt, wird das wohl für jeden Verweis auf die Instanz
mehrfach abgelegt und beim Laden erhalte ich "TheUser.ReferencedSubThing.TestString - Ungültiger Pfad für Eigenschaft", was ja auch Sinn macht, da dort
beim Laden keine Instanz vorhanden ist.
Setze ich SetSubComponent(False), werden die Eigenschaften von SubThing gar nicht mehr gespeichert. Das liegt wohl daran, dass SubThing nicht
die Form als Owner hat, so dass es nicht automatisch serialisiert wird. Gespeichert wird dann nur der Name, ohne die Eigenschaften.
Delphi-Quellcode:
object TheOwner: TSubThingOwner
SubThing = TheOwner.SUB
...
end
object TheUser: TSubThingUser
ReferencedSubThing = TheOwner.SUB
...
end
Die Form als Owner von SubThing zu nehmen, damit das automatisch serialisiert wird, würde ich wegen den ganzen Zusatzkomponenten im Formulardesigner gerne vermeiden.
Wenn es geht, würde ich auch gerne weiter per Referenz auf SubThing arbeiten. Ich schätze mal die Alternative wäre, die Werte per SubThing.Assign hin- und herzugeben,
wodurch ich aber zwangsläufig mit mehreren SubThing-Instanzen arbeiten müsste - oder? Insbesondere bei abgeleiteten / geerbten Forms macht das glaube ich Probleme
innerhalb des Form-Designers.
Gibt es für sowas ein vernünftiges Entwurfsmuster und wenn ja, wonach suche ich da oder bin ich gerade komplett auf dem Holzweg?