AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Komponenten(struktur) serialisieren mit WriteComponentResFile?
Thema durchsuchen
Ansicht
Themen-Optionen

Komponenten(struktur) serialisieren mit WriteComponentResFile?

Ein Thema von Zacherl · begonnen am 8. Dez 2013 · letzter Beitrag vom 8. Dez 2013
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Komponenten(struktur) serialisieren mit WriteComponentResFile?

  Alt 8. Dez 2013, 22:30
Hallo zusammen,

ich spiele grade mit 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 }
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 }
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;
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Komponenten(struktur) serialisieren mit WriteComponentResFile?

  Alt 8. Dez 2013, 22:39
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: Komponenten(struktur) serialisieren mit WriteComponentResFile?

  Alt 8. Dez 2013, 22:42
Delphi-Referenz durchsuchenSetSubComponent
Und die Klasse muß registriert sein, beim Deserialisieren. (macht die VCL auch so)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Komponenten(struktur) serialisieren mit WriteComponentResFile?

  Alt 8. Dez 2013, 23:16
Danke euch, für eure Antwort!

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.

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 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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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