Einzelnen Beitrag anzeigen

SurelyNot

Registriert seit: 3. Dez 2013
4 Beiträge
 
#1

Referenzierung u. Serialisierung von Subkomponenten

  Alt 16. Feb 2015, 12:35
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?
  Mit Zitat antworten Zitat