AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sub-Komponenten serialisieren

Offene Frage von "DGL-luke"
Ein Thema von DGL-luke · begonnen am 30. Aug 2006 · letzter Beitrag vom 7. Okt 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Sub-Komponenten serialisieren

  Alt 2. Sep 2006, 14:23
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

Pfff... nervig...

Ich will .Net
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#12

Re: Sub-Komponenten serialisieren

  Alt 2. Sep 2006, 14:36
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
Das is die zweite Möglichkeit.

Zitat:
Ich will .Net
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...?
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 12:38
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#14

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 13:56
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 14:28
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
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#16

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 14:33
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?
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 14:40
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...
EDIT: jetzt kommt "ungültiger pfad für eigenschaft" was ist das denn?
EDIT: EReadError wollte ich sagen. hmm... "formulardatei beschädigt" sagt die OH.. soso... kann ich nix von sehen...

EDIT:

Das muss der auslöser sein:

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...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#18

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 15:11
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...
Die brauchst du natürlich zum Serialisieren...

Zitat:
EDIT: jetzt kommt "ungültiger pfad für eigenschaft" 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:

Das muss der auslöser sein:

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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 15:16
öhm.... ich muss das im konstruktor erstellen?! ich dachte, der zweck vom deserialisieren ist, dass mans eben nicht erstellt....

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

Aber nach DFM sieht das nicht aus

Code:
‘   TPF0
TFormPanel Control.Left¨  Control.Topš 
Control.WidthControl.HeightControl.TabOrder LeftPx¨ TopPxš HeightPxWidthPx
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#20

Re: Sub-Komponenten serialisieren

  Alt 3. Sep 2006, 15:38
Zitat von DGL-luke:
öhm.... ich muss das im konstruktor erstellen?! ich dachte, der zweck vom deserialisieren ist, dass mans eben nicht erstellt....
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

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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 01:49 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