Delphi-PRAXiS
Seite 3 von 3     123   

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 6. Okt 2006 15:53

Re: Sub-Komponenten serialisieren
 
soo... hab jetzt das text-dfm:

Code:
object TPanel
  Left = 16
  Top = 68
  Width = 207
  Height = 186
  TabOrder = 0
end
das ist das, was geschrieben werden sollte. ich paste jetzt einfach noch mal meinen code:

Delphi-Quellcode:
procedure TFormElementSupplier.Load(FileName: string; Parent: TWinControl; Add: Boolean);
var Manager: TBaseFormElementManager;
    ManagerClass: TBaseFormElementManagerClass;
    ms,msc: TMemoryStream;
    size: Integer;
    Index: Integer;
begin
  IsUnSerializing := True;
  if not Add then
    Elements.Clear;

  ms := TMemoryStream.Create;
  msc := TMemoryStream.Create;
  try
    ms.LoadFromFile(FileName);
    ms.Position := 0;
    while ms.Position < ms.Size do
    begin
      //read class and size of element
      ms.Read(ManagerClass,sizeof(ManagerClass));
      ms.Read(size,SizeOf(size));

      //copy element into temporary stream to isolate it
      msc.Clear;
      msc.CopyFrom(ms,size);

      //create manager
      Manager := ManagerClass.Create;
      //create element
      Manager.FControl := ManagerClass.ElementClass.Create(Manager);
      //unserialize element
      msc.ReadComponent(Manager.FControl); //<--- knallt hier... "Stream-Lesefehler"
      Manager.InitElement(Parent);
    end;
  finally
    ms.Free;
    msc.Free;
  end;
  IsUnSerializing := False;
end;

procedure TFormElementSupplier.Save(FileName: string);
var i,size: Integer;
    ms,msc,textstream: TMemoryStream;
    ManagerClass: TClass;
    s: string;
begin
  ms := TMemoryStream.Create;
  msc := TMemoryStream.Create;
  textstream := TMemoryStream.Create;
  try
    for i := 0 to Elements.Count -1 do
    begin
      //write the control
      msc.Clear;
      msc.WriteComponent(Elements[i].FControl);
      msc.Position := 0;

      size := msc.Size;
      ObjectBinaryToText(msc,textstream);
      msc.Position := 0;

      //write the manager's class
      ManagerClass := Elements[i].ClassType;
      ms.Write(ManagerClass, SizeOf(ManagerClass));

      //write the size of the control
      ms.Write(size,SizeOf(size));
      //write the control
      ms.CopyFrom(msc, msc.Size);
    end;
    ms.Position := 0;
    ms.SaveToFile(FileName);
    textstream.SaveToFile(Filename + 'txt');
  finally
    ms.Free;
    msc.Free;
    textstream.Free;
  end;
end;
Nicht, weil ich zu faul bin zum debuggen, sondern weil ich einfach schon alles versucht habe. "knallt hier" ist markiert in der load-procedure... :cry:

r2c2 6. Okt 2006 16:35

Re: Sub-Komponenten serialisieren
 
Nur ne Vermutung: Vor dem ReadComponent fehlt evtl. n Position := 0;

BTW:
Delphi-Quellcode:
Manager.FControl
Du greifst doch nicht etwa von außen auf ein Feld zu oder? :?

mfg

Christian

oki 6. Okt 2006 16:42

Re: Sub-Komponenten serialisieren
 
Hi jungs,

als ich das hier gelesen habe hab ich mich daran erinnert, dass ich ähnliches auch mal am Wickel hatte. das aber unter D5.

Bei mir war es so, dass beim Lesen der Serialisierung die Instanz der Komponente existieren mußte. Also bei nil ging es sowiso in die Hose. es reichte aus einfach erst mal ein Create auszuführen.

Ich geb euch hier mal meinen code für das Schreiben und Lesen der Serialisierung. Ich hoffe es hilft. Bei mir war es dann eigentlich kein Problem mehr.

Schreiben:
Delphi-Quellcode:
procedure TSercheThread.WriteListToFile;
var Stream : TFileStream;
begin
  IF not Assigned(FMahnListView) then Exit;
  Stream := TFileStream.Create(MahnFileName, fmCreate or fmShareDenyNone);
  try
    Stream.WriteComponent(FMahnListView);
  finally
    Stream.Free;
  end;
end;
Lesen:
Delphi-Quellcode:
procedure TSercheThread.ReadListFromFile;
var Stream : TFileStream;
begin
  IF not Assigned(FMahnListView) then Exit;

  IF not FileExists(ExtractFilePath(Application.ExeName) + MahnFileName) then
    Stream := TFileStream.Create(MahnFileName, fmCreate or fmShareDenyNone)
  else
    Stream := TFileStream.Create(MahnFileName, fmOpenReadWrite or fmShareDenyNone);

  try
    IF Stream.Size = 0 then Exit;
    FMahnListView := TListView(Stream.ReadComponent(FMahnListView));
  finally
    Stream.Free;
  end;
end;
Das war dann auch wirklich ein TListView. Ob das alles so mit TControl funzt wage ich zu bezweifeln. Ich hoffe ich konnte euch einen Hinweis geben der hilft (bin grad knapp in der Zeit und habe diesen Thread nur diagonal gelesen).

gruß oki

DGL-luke 6. Okt 2006 23:00

Re: Sub-Komponenten serialisieren
 
Hmmm...

Zitat:

Nur ne Vermutung: Vor dem ReadComponent fehlt evtl. n Position := 0;
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:

Zitat:

Du greifst doch nicht etwa von außen auf ein Feld zu oder? :?
Tu ich. Sollte aber funktionieren, ich initialisiere alles was nötig ist.

r2c2 7. Okt 2006 07:31

Re: Sub-Komponenten serialisieren
 
Zitat:

Zitat von DGL-luke
Tu ich. Sollte aber funktionieren, ich initialisiere alles was nötig ist.

Für sowas gibts eigentlich properties... Warum man properties nehmen sollte und keine public fields? Wart ma ich hab da vor einiger Zeit n lustigen Text dazu gelesen... *sucht* Ah da haben wirs: http://tut.php-q.net/klassen.html Interessant is hier das Kapitel "6. Vererbung in PHP und typische Fallen". Der Rest dürfte Kalter Kaffee sein... Is zwar für PHP und da gibts leider keine properties(komischerweise nennen die da Felder Eigenschaften, aber was solls). Anhand der Evolution der Meerschweinchen sieht man da ganz gut, warum öffentliche Felder böse sind... *g*

mfg

Christian

DGL-luke 7. Okt 2006 14:59

Re: Sub-Komponenten serialisieren
 
Properties? Ja, da muss ich nur das "F" aus dem aufrufenden Source entfernen :mrgreen:

r2c2 7. Okt 2006 15:32

Re: Sub-Komponenten serialisieren
 
Zitat:

Zitat von DGL-luke
Properties? Ja, da muss ich nur das "F" aus dem aufrufenden Source entfernen :mrgreen:

:roll:

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 3 von 3     123   

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