Delphi-PRAXiS
Seite 2 von 3     12 3      

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 Sub-Komponenten serialisieren (https://www.delphipraxis.net/76134-sub-komponenten-serialisieren.html)

DGL-luke 2. Sep 2006 13:23

Re: Sub-Komponenten serialisieren
 
lol?
Serialisierung hat mit Deserialisierung nix zu tun? Das ist doch... bescheuert... aber leider hast du anscheinend recht.

Also muss ich die doch extra speichern :wall:

Pfff... nervig...

Ich will .Net :cry:

r2c2 2. Sep 2006 13:36

Re: Sub-Komponenten serialisieren
 
Zitat:

Zitat von DGL-luke
lol?
Serialisierung hat mit Deserialisierung nix zu tun? Das ist doch... bescheuert... aber leider hast du anscheinend recht.

Mit SetSubComponent legst du nur fest, ob das Objekt serialisiert wird. Das wird es auch nur dann wenn der Owner entsprechend gesetzt ist. Ergo: Owner auf deine Komponente, SetSubComponent nicht anfassen oder von mir aus auch mit true ausführen. Dann serialisieren. Bei Deserialisieren zuerst sicherstellen, dass das Control erstellt wird(am besten im Konstruktor deiner Komponente) und deserialisieren. Das sollte dann auch funktionieren. Du musst eben nur gucken, dass das Control auch existiert bzw. erstellt wird...

Zitat:

Also muss ich die doch extra speichern :wall:
Das is die zweite Möglichkeit.

Zitat:

Ich will .Net :cry:
Wie gesagt: Ich bin mir nicht sicher, ob es in .NET so funktioniert. Da müsstest du Khabarakh, Elvis und Co fragen. Die kennen sich da bedeutend besser aus...

mfg

Christian

P.S.: ggf. könnte es auch Helfen zu wissen, was genau du amchen willst. Wird das Control von deiner Komponente erstellt? Übergibst du n Pointer zur Laufzeit...?

DGL-luke 3. Sep 2006 11:38

Re: Sub-Komponenten serialisieren
 
OK... ich werd mich malö noch ein bisschen ausbreiten, da jetzt ein anderes Problem auftaucht.

.Net? Also unter .Net 2.0 mit VC# Express muss ich nur [(Serializable)] als attribut zu meiner Klasse hinzufügen und kann das ganze mit z.B. einem BinarySerializer (oder so ähnlich, wie die Klasse genau heisst, weiß ich grade nicht) serialisieren und genau so einfach wieder deserialisieren. :)

Und hier hab ich jetzt das problem, dass ich einen Owner brauche.
Und zwar läuft das ganze so ab:

- Ich erstelle das Managerobjekt (über einen Index in einer Klassenliste; ich weiß nicht mehr, als dass es von einer Basisklase abstammt)
- Ich rufe die Methode CreateElement des Managerobjektes auf, dann wird ein Control erstellt, mit dem Owner(!) auf dem Managerobjekt.

Dann serialisiere ich sowohl managerobjekt als auch Control (einzeln) und deserialisiere das auch wieder. Dabei geht der owner verloren - den ich aber unbedingt brauche. Und den ich nciht wieder zuweisen kann.

Ich bräuchte also eine Lösung, die sowohl managerobjekt als auch Control kompakt serialisiert und wieder deserialisiert.

r2c2 3. Sep 2006 12:56

Re: Sub-Komponenten serialisieren
 
Ich hoffe ich hab dich richtig verstanden. Versuch mal das(wenn du das noch nicht gemacht hast):
Delphi-Quellcode:
//Pseudocode:

procedure Start;
var
  ManagerObj: TManager;
begin
  ManagerObj := TButtonManager.Create; // ManagerObjekt erzeugen dabei wird automatisch ein Button erstellt
  Serialize(ManagerObj);
  ...
  ManagerObj.Free; // Manager und Button werden freigegeben
  ...
  DeSerialize(ManagerObj);
end;

constructor TButtonManager.Create;
begin
  inherited Create;
  // FButton is n privates Feld Button eine publishes Property
  FButton := TButton.Ceate(self); // owner zuweisen
end;

procedure Serialize(AManager: TManager);
begin
  ...
  FileStream.WriteComponent(AManager); // ggf. könnte hier n TypeCast erforderlich sein, dass die RTTI weiß, dass es sich um einen TButtonManager handelt. Bin mir da aber nicht sicher(ich glaubs aber eigentlich nicht). Kenn mich dazu mit RTII noch zu wenig aus
  ...
end;

procedure DeSerialize(out AManager: TManager);
begin
  ...
  FileStream.ReadComponent(AManager);
  ...
end;
Du könntest dir auch mal die erzeugte Datei angucken. Dann merkt man zuerst mal obs Serialisieren richtig geklappt hat...

mfg

Christian

DGL-luke 3. Sep 2006 13:28

Re: Sub-Komponenten serialisieren
 
Naja... ich hatte das so ungefähr schon mal. Es sieht so aus:

1. Ich serialisiere nur den Manager -> dann bekommt der Manager keinen Pointer auf das Control, und ich auch nicht
2. Ich serialisiere beides getrennt und weise danach alles wieder zu -> Ich kann den Owner des Controls nicht zuweisen

r2c2 3. Sep 2006 13:33

Re: Sub-Komponenten serialisieren
 
Zitat:

Zitat von DGL-luke
1. Ich serialisiere nur den Manager -> dann bekommt der Manager keinen Pointer auf das Control, und ich auch nicht

Warum denn das? In meinem Beispiel hab ich ne Button-Property, die auf n FButton-Feld verweist. Da is doch der Pointer...

mfg

Christian

P.S.: Hhast du dir mal die serialisierte Klasse als Datei angeguckt?

DGL-luke 3. Sep 2006 13:40

Re: Sub-Komponenten serialisieren
 
Ja, ich habs mir angesehen....

sieht eigentlich ganz gut aus... Ich werd das jetzt (mal wieder^^) umstellen, so dass nur der Manager gespeichert wird, und dann mal gründlich debuggen, vielleicht liegts ja ganz woanders.

EDIT: ah ja richtig... entsprechende property hab ich nicht... :gruebel:
EDIT: jetzt kommt "ungültiger pfad für eigenschaft" :shock: was ist das denn?
EDIT: EReadError wollte ich sagen. hmm... "formulardatei beschädigt" sagt die OH.. soso... kann ich nix von sehen...

EDIT: :shock:

Das muss der auslöser sein:

Delphi-Quellcode:
if not (PropValue is TPersistent) then PropPathError;
aber das kann ja gar nicht sein... und in die classes.pas kann ich natürlich keinen haltepunkt setzen...

r2c2 3. Sep 2006 14:11

Re: Sub-Komponenten serialisieren
 
Zitat:

Zitat von DGL-luke
Ja, ich habs mir angesehen....

sieht eigentlich ganz gut aus... I

Was heißt "sieht ganz gut aus"? Is dein Control mitserialisiert worden? Die Datei müsste ja in etwa so aussehen, wie ne DFM-datei...

Zitat:

EDIT: ah ja richtig... entsprechende property hab ich nicht... :gruebel:
Die brauchst du natürlich zum Serialisieren...

Zitat:

EDIT: jetzt kommt "ungültiger pfad für eigenschaft" :shock: was ist das denn?
Das bekommt man IMHO, wenn das Objekt(in diesem Beispiel der Button) (noch) nicht erstellt ist. Hast du den Button(oder was auch immer) im Konstruktor erstellt?

Zitat:

EDIT: :shock:

Das muss der auslöser sein:

Delphi-Quellcode:
if not (PropValue is TPersistent) then PropPathError;

N TControl is aber ein TPersistent. Definitiv... Wie gesagt: Wenn das Control im Konstruktor nicht erstellt wurde, dann liefert is Persistent auch false, da der Pointer noch auf nil zeigt...

mfg

Christian

DGL-luke 3. Sep 2006 14:16

Re: Sub-Komponenten serialisieren
 
öhm.... ich muss das im konstruktor erstellen?! ich dachte, der zweck vom deserialisieren ist, dass mans eben nicht erstellt.... :stupid:

hab das mal geändert... und es hat sich nix geändert^^

Aber nach DFM sieht das nicht aus :gruebel:

Code:
‘   TPF0
TFormPanel Control.Left¨  Control.Topš 
Control.WidthControl.HeightControl.TabOrder LeftPx¨ TopPxš HeightPxWidthPx

r2c2 3. Sep 2006 14:38

Re: Sub-Komponenten serialisieren
 
Zitat:

Zitat von DGL-luke
öhm.... ich muss das im konstruktor erstellen?! ich dachte, der zweck vom deserialisieren ist, dass mans eben nicht erstellt.... :stupid:

Ich hab schon oben mal angedeutet, dass beim Deserialisieren nur folgendes passiert:
- Der entsprechende Konstruktor wird aufgerufen
- die published Properties werden einzeln aus der Datei geparst und per RTTI dem gerade erstellten Objekt zugewiesen.

Was aber passiert, wenn das Unterobjekt(dein Control) nicht im Konstruktor erstellt wird? Richtig es gibt ne exception, weil kein weiterer Konstruktor mehr aufgerufen wird. Warum is das aber so? Angenommen es würde wirklich der Konstruktor des Unterobjekts aufgerufen werden. Dann wird dieses neu erstellt. Angenommen du hast sowas im Konstruktor deiner manager-Klasse:
Delphi-Quellcode:
constructor TButtonManager.Create;
begin
  inherited Create;
  FButton := TButton.Create;
  AndererPointer := FButton;
  ...
end;
Und dann such mal den Fehler, wenn du dich wunderst, dass es beim Zugriff auf AndererPointer ne AV gibt...

Zitat:

Aber nach DFM sieht das nicht aus :gruebel:

Code:
‘  TPF0
TFormPanel Control.Left¨ Control.Topš
Control.WidthControl.HeightControl.TabOrder LeftPx¨ TopPxš HeightPxWidthPx

Sieht für mich nach ner Binär-DFM aus. Da gibts 2 Möglichkeiten: a) au öffnest die Datei mit nem Editor der das lesen kann(z.B. Delphi) oder b) du serialisierst in Text-DFMs: Delphi-Referenz durchsuchenObjectBinaryToText. Wenn du n funktionierendes Beispiel brauchst: Hier im Forum suchenTOptions

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.
Seite 2 von 3     12 3      

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