Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponenten(struktur) serialisieren mit WriteComponentResFile? (https://www.delphipraxis.net/177971-komponenten-struktur-serialisieren-mit-writecomponentresfile.html)

Zacherl 8. Dez 2013 21:30

Komponenten(struktur) serialisieren mit WriteComponentResFile?
 
Hallo zusammen,

ich spiele grade mit
Delphi-Quellcode:
WriteComponentResFile
rum und würde gerne eine Instanz von TComponent serialisieren. Soweit so gut. Erstelle ich mir folgende Klasse, kann ich deren Eigenschaften wunderbar speichern und auch wieder laden:
Delphi-Quellcode:
type
  TMyRootClass = class(TComponent)
  private
    FX: Integer
  published
    property X: Integer read FX write FX;
  end;
Nun möchte ich aber einen Schritt weiter gehen und (im Style vom Formulardesigner) eine Klasse mit diversen Child Komponenten speichern. Bei meinen Tests habe ich verschiedene Szenarien ausprobiert:
Delphi-Quellcode:
type
  TMyRootClass = class(TComponent)
  published
    A1: TComponent;
  end;
  { ... }
  R := TMyRootClass.Create(nil);
  A := TComponent.Create(R);
  A.Name := 'A1'; { <-- sorgt indirekt dafür, dass die published property "A1" des Owners (R) auf die Instanz A gesetz wird }
:arrow: Funktioniert NICHT
Delphi-Quellcode:
type
  TMyRootClass = class(TWinControl)
  published
    A1: TWinControl;
  end;
  { ... }
  R := TMyRootClass.Create(nil);
  A := TWinControl.Create(R);
  A.Name := 'A1'; { <-- sorgt indirekt dafür, dass die published property "A1" des Owners (R) auf die Instanz A gesetz wird }
:arrow: Funktioniert NICHT
Delphi-Quellcode:
type
  TMyRootClass = class(TWinControl)
  published
    A1: TWinControl;
  end;
  { ... }
  R := TMyRootClass.Create(nil);
  A := TWinControl.Create(R);
  A.Name := 'A1'; { <-- sorgt indirekt dafür, dass die published property "A1" des Owners (R) auf die Instanz A gesetz wird }
  A.Parent := R;
:arrow: FUNKTNIONIERT

Jetzt meine Frage:
:?: Wie entscheidet Delphi, ob ein published Feld, welches von TComponent ableitet serialisiert wird, oder nicht? Scheinbar werden die Felder standardmäßig nur gesichert, wenn die Komponente im Feld von TWinControl ableitet UND den Parent gesetzt hat.

Kann ich dieses Verhalten in meinen von TComponent abgeleiteten Klassen beeinflussen (ich kann in meinem Falle nicht von TWinControl ableiten)?

Bin dankbar für jede Antwort
Zacherl

Sir Rufo 8. Dez 2013 21:39

AW: Komponenten(struktur) serialisieren mit WriteComponentResFile?
 
AFAIK musst du deine Klasse und auch die SubKlassen, wenn vorhanden, noch registrieren
Delphi-Quellcode:
initialization
  RegisterClasses([TRootClass]);
Joar, siehe hier http://docwiki.embarcadero.com/Libra...egisterClasses

himitsu 8. Dez 2013 21:42

AW: Komponenten(struktur) serialisieren mit WriteComponentResFile?
 
Delphi-Referenz durchsuchenSetSubComponent
Und die Klasse muß registriert sein, beim Deserialisieren. (macht die VCL auch so)

Zacherl 8. Dez 2013 22:16

AW: Komponenten(struktur) serialisieren mit WriteComponentResFile?
 
Danke euch, für eure Antwort!

Zitat:

Zitat von Sir Rufo (Beitrag 1239027)
AFAIK musst du deine Klasse und auch die SubKlassen, wenn vorhanden, noch registrieren

Das hatte ich versucht, obwohl in der OH steht, dass das nur notwendig ist, wenn man den Instance Parameter der Read/WriteComponentResFile auf nil setzt. Funktionierte leider auch damit nicht.

Zitat:

Zitat von himitsu (Beitrag 1239029)

Bin mir nicht sicher, ob das für meinen Zweck brauchbar ist.

Ich habe noch etwas weiter geforscht und glaube nun eine Lösung gefunden zu haben. TWinControl überschreibt die Methode
Delphi-Quellcode:
GetChildren
, um alle SubControls zurückzugeben. TCustomWindow überschreibt die Methode nochmal und fügt zusätzlich alle SubComponents hinzu.

Diese Funktion wird von Read/WriteComponentResFile indirekt aufgerufen, um zu ermitteln, welche Child Komponenten der Root besitzt :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:54 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