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 1 von 3  1 23      
Benutzerbild von DGL-luke
DGL-luke

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

Sub-Komponenten serialisieren

  Alt 30. Aug 2006, 14:51
Hallo, ich habe folgende Konstellation:

Delphi-Quellcode:
type
  TBaseFormElementManager = class abstract(TComponent)
    protected
      FControl: TControl; //<--- der da
      FNaturalDimensions: TDRect;

      MouseUpEvents: TEventList;
      MouseDownEvents: TEventList;
      MouseMoveEvents: TEventList;
    public
      procedure SetElement(Value: TControl); virtual;
      function GetElement: TControl; virtual;

      procedure SetLeftMm(Value: Double);
      procedure SetTopMm(Value: Double);
      procedure SetWidthMm(Value: Double);
      procedure SetHeightMm(Value: Double);

      procedure SetLeftPx(Value: Integer); //<--- hier
      procedure SetTopPx(Value: Integer);
      procedure SetWidthPx(Value: Integer);
      procedure SetHeightPx(Value: Integer);
das will ich speichern und vor allem laden:

Delphi-Quellcode:
procedure TFormElementSupplier.Save(FileName: string);
var i,size: Integer;
    m: TBaseFormElementManager;
    ms,msc: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  msc := TMemoryStream.Create;
  try
    for i := 0 to Elements.Count -1 do
    begin
      ms.Size := 0;
      ms.WriteComponent(Elements[i]);
      ms.Position := 0;
      size := ms.Size;
      msc.Write(size,SizeOf(size));
      msc.CopyFrom(ms, size);
    end;
    msc.Position := 0;
    msc.SaveToFile(FileName);
  finally
    ms.Free;
    msc.Free;
  end;
end;
Delphi-Quellcode:
procedure TFormElementSupplier.Load(FileName: string);
var c: TComponent;
    ms,msc: TMemoryStream;
    size: Integer;
begin
  ms := TMemoryStream.Create;
  msc := TMemoryStream.Create;
  try
    ms.LoadFromFile(FileName);
    while ms.Position < ms.Size do
    begin
      ms.Read(size,SizeOf(size));
      msc.Clear;
      msc.CopyFrom(ms,size);
      msc.Position := 0;
      c := nil;
      c := msc.ReadComponent(nil); //<--- HIER
      Elements.Add(c as TBaseFormElementManager);
    end;
  finally
    ms.Free;
    msc.Free;
  end;
end;
Im ReadComponent wird aber gleich ins SetLeftPx gesprungen, was ich auch nachvollziehen kann:

Delphi-Quellcode:
procedure TBaseFormElementManager.SetLeftPx(Value: Integer);
begin
  if Assigned(FControl) then
    FControl.Left := Value
  else
    raise EElementNotCreated.Create('No Element Created yet.');
end;
Wo dann FControl auf nil ausgewertet wird und die Exception kommt.

Wie bringe ich das ganze System dazu, dass das Control ordentlich zugewiesen wird? Bzw. überhaupt mitgespeichert, ich weiß ja nicht, ob das überhaupt passiert.

Ich sollte vielleicht noch einmal erwähnen, dass TBaseFormElementManager nie instanziiert wird, sondern es sich immer um nachfahren handelt.

EDIT: hab inzwischen "Setsubcomponent" gefunden... ändert nix...
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
Benutzerbild von DGL-luke
DGL-luke

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

Re: Sub-Komponenten serialisieren

  Alt 1. Sep 2006, 14:14
Niemand einen Tipp für mich?
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
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Sub-Komponenten serialisieren

  Alt 1. Sep 2006, 14:25
Zitat von DGL-luke:
Im ReadComponent wird aber gleich ins SetLeftPx gesprungen, was ich auch nachvollziehen kann:
Hm, ich leider nicht . Im von dir geposteten Code deutet aber auch nichts darauf hin, also liegts (hoffentlich) nicht an mir . Wenn dahinter eine published Property steckt, wäre die nächste Frage, warum sie published ist. Denn Left wird ja schon in FControl serialisiert, einmal reicht.
Sebastian
Moderator in der EE
  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
 
#4

Re: Sub-Komponenten serialisieren

  Alt 1. Sep 2006, 14:33
published property ist es deswegen, weil ich sie veröffentlichen will

Ich will es im jedi-runtime-OI drin haben(TJvInspector, imo), allerdings nicht das komplette Control, sondern eben nur ausgewählte über diesen Umweg.

Ich werde wohl einfach noch irgendwie eine Weiche einbauen, die mir sagt, dass gerade deserialisiert wird. dann muss ich nicht die exception werfen...
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
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Sub-Komponenten serialisieren

  Alt 1. Sep 2006, 16:20
Hab ich doch glatt vergessen, dass in Delphi OI-Binding und Serialization dämlicherweise verbunden sind .
Da du also nicht die Serialisierung von Left verhindern kannst, musst du - wie du schon selbst erkannt hast - stattdessen die Property beim Deserialisieren ignorieren -> TComponentState.csReading.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
r2c2

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

Re: Sub-Komponenten serialisieren

  Alt 1. Sep 2006, 16:25
Das Problem ist IMHO, dass du - wo wies aussieht das Control zur Designtime erstellst und dann der property zuweist. Wenn das Objekt dann wieder deserialisiert wird, is der Pointer noch nil ==> AV.

Du müsstest also sicherstellen, dass zum Zeitpunkt des Zugriffs - am besten schon im Konstruktor - der Property n Control zugewiesen wurde. Also entweder im Konstruktor das Control zuweisen oder gleich dort erstellen...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Sub-Komponenten serialisieren

  Alt 1. Sep 2006, 16:28
Zitat von r2c2:
Das Problem ist IMHO, dass du - wo wies aussieht das Control zur Designtime erstellst und dann der property zuweist. Wenn das Objekt dann wieder deserialisiert wird, is der Pointer noch nil ==> AV.
Genau diesen Fall fängt er doch im Setter schon längst ab .

Zitat:
Du müsstest also sicherstellen, dass zum Zeitpunkt des Zugriffs - am besten schon im Konstruktor - der Property n Control zugewiesen wurde. Also entweder im Konstruktor das Control zuweisen oder gleich dort erstellen...
Wozu sollte man ein leeres Control erstellen, wenn es eine Zehntelsekunde danach vom Deserialisierer überschrieben wird?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
r2c2

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

Re: Sub-Komponenten serialisieren

  Alt 1. Sep 2006, 16:51
Zitat von Khabarakh:
Zitat von r2c2:
Das Problem ist IMHO, dass du - wo wies aussieht das Control zur Designtime erstellst und dann der property zuweist. Wenn das Objekt dann wieder deserialisiert wird, is der Pointer noch nil ==> AV.
Genau diesen Fall fängt er doch im Setter schon längst ab .
Indem er eine weitere Exception auslöst... jo...

Zitat:
Zitat:
Du müsstest also sicherstellen, dass zum Zeitpunkt des Zugriffs - am besten schon im Konstruktor - der Property n Control zugewiesen wurde. Also entweder im Konstruktor das Control zuweisen oder gleich dort erstellen...
Wozu sollte man ein leeres Control erstellen, wenn es eine Zehntelsekunde danach vom Deserialisierer überschrieben wird?
Ähm... zu viel .NET gemacht? Da wird man verwöhnt, nicht? Is jetzt nur geraten. Ich könnt mir aber vorstellen, dass das in .NET geht(Hab in .NET bisher noch nicht viel gemacht. Serialisierung steht noch auf der Liste...). In Delphi muss man sich aber um so manches noch selber kümmern...

Spaß beiseite: IMHO wird durch ReadComponent nur das serialisierte Objekt *ohne* Unterobjekte created. Für das Createn der Unterobjekte is das Objekt selbst verantwortlich. Wenn also das Control nicht im Konstruktor erstellt wird und auch sonst nirgendwo, dann produziert ReadComponent eine Exception, weil es ein bereits erstelltes Objekt erwartet, aber nicht findet...

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
 
#9

Re: Sub-Komponenten serialisieren

  Alt 2. Sep 2006, 12:35
SetSubComponent sollte doch eigentlich genau das machen...

Wie bereits gesagt, ich werde jetzt eine globale variable "IsUnserializing" einführen, die in der initialization auf false, beim laden auf true setzen und das ganze entsprechend behandeln.
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
 
#10

Re: Sub-Komponenten serialisieren

  Alt 2. Sep 2006, 13:52
Zitat von DGL-luke:
SetSubComponent sollte doch eigentlich genau das machen...
Dann hast du entweder ne andere Hilfe, als ich oder sie nicht richtig gelesen. SetSubComponent regelt ob eine Komponente serialisiert wird. Mit dem Deserialisieren hat das nix zu tun. Dass es damit auch nicht klappt is also kein Wunder...

Zitat:
Wie bereits gesagt, ich werde jetzt eine globale variable "IsUnserializing" einführen, die in der initialization auf false, beim laden auf true setzen und das ganze entsprechend behandeln.
Probiers aus. Ich vermute, dass das auch nix hilft, da das Control immer noch nicht existiert. Außer du Createst aufgrund des Flags das Control bzw. setzt den Pointer entsprechend. Alleine das raisen deiner Exception zu verhindern wird IMHO nicht funktionieren. Kann mich aber auch irren...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 06:31 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