![]() |
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: |
Re: Sub-Komponenten serialisieren
Zitat:
Zitat:
Zitat:
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...? |
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. |
Re: Sub-Komponenten serialisieren
Ich hoffe ich hab dich richtig verstanden. Versuch mal das(wenn du das noch nicht gemacht hast):
Delphi-Quellcode:
Du könntest dir auch mal die erzeugte Datei angucken. Dann merkt man zuerst mal obs Serialisieren richtig geklappt hat...
//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; mfg Christian |
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 |
Re: Sub-Komponenten serialisieren
Zitat:
mfg Christian P.S.: Hhast du dir mal die serialisierte Klasse als Datei angeguckt? |
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:
aber das kann ja gar nicht sein... und in die classes.pas kann ich natürlich keinen haltepunkt setzen...
if not (PropValue is TPersistent) then PropPathError;
|
Re: Sub-Komponenten serialisieren
Zitat:
Zitat:
Zitat:
Zitat:
mfg Christian |
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 |
Re: Sub-Komponenten serialisieren
Zitat:
- 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:
Und dann such mal den Fehler, wenn du dich wunderst, dass es beim Zugriff auf AndererPointer ne AV gibt...
constructor TButtonManager.Create;
begin inherited Create; FButton := TButton.Create; AndererPointer := FButton; ... end; Zitat:
![]() ![]() mfg Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz