Delphi-PRAXiS

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 ganze Forms abspeichern (https://www.delphipraxis.net/24347-ganze-forms-abspeichern.html)

orakel 19. Jun 2004 16:23


ganze Forms abspeichern
 
Hi,
ich habe bei meinem Proggi eine Form, von der aus weitere zur Laufzeit erstellt werden können. Ich möchte nun eine Speicher/Laden -Funktion mit einbauen. Da sollen dann die ganzen Forms (mit Inhalt) abgespeichert werden.
Dazu hab ich folgenden Code aus der Hilfe mal getestet.
Aber irgendwie funktioniert das nicht.(Beispiel)

Delphi-Quellcode:
function ComponentToString(Component: TComponent): string;

var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;

    end;
  finally
    BinStream.Free
  end;
end;

function StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result := BinStream.ReadComponent(nil);

    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;
Hier mein Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Fenster1:=TForm.Create(self);
  Fenster1.show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.Memo2.Text:=ComponentToString(Fenster1);
end;

procedure TForm1.Button3Click(Sender: TObject);
var Fenster2:TComponent;
begin
  Fenster2:=StringToComponent(Memo2.Text).Create(self);
end;
Was mach ich beim erstellen der neuen Form falsch?

THX orakel

maximov 19. Jun 2004 16:42

Re: ganze Forms abspeichern
 
Zitat:

Zitat von orakel
...
Dazu hab ich folgenden Code aus der Hilfe mal getestet.
Aber irgendwie funktioniert das nicht.(Beispiel)

'irgendwie geht nicht' ist keine, mir bekannte, fehlermeldung! Wenn du mal etwas präziser wirst, dann helfe ich dir gerne, da ich mich mit dem scheiss bestens auskenne :wink:

orakel 19. Jun 2004 16:51

Re: ganze Forms abspeichern
 
Er compiliert ohne probleme,aber beim ausführen bzw. beim Klick auf Button3 kommt Fehlermeldung:"Class TForm not found"

in dieser Zeile:
Delphi-Quellcode:
Result := BinStream.ReadComponent(nil);

Jens Schumann 19. Jun 2004 17:08

Re: ganze Forms abspeichern
 
Hallo,
so kommst Du glaube ich auch zum Ziel
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  Fenster2 : TForm;
begin
  Fenster2:=TForm1.Create(Self);
  Fenster2.ShowModal;
end;
[edit]Habe gerade gelesen, dass der Inhalt auch übernommen werden soll. Das geht so nicht[/edit]

maximov 19. Jun 2004 17:54

Re: ganze Forms abspeichern
 
Zitat:

Zitat von orakel
Er compiliert ohne probleme,aber beim ausführen bzw. beim Klick auf Button3 kommt Fehlermeldung:"Class TForm not found"

in dieser Zeile:
Delphi-Quellcode:
Result := BinStream.ReadComponent(nil);

Das liegt wohl daran, dass TForm keine installierte komponente ist. Du kannst klassen aber nachträglich registrieren:

Delphi-Quellcode:
initialization
  registerClass(TForm);
Die restlichen komponenten müssten eigentlich registriert sein.

Jens Schumann 20. Jun 2004 11:02

Re: ganze Forms abspeichern
 
Hallo orakel
eigentlich habe diesen Beitrag schon gestern gepostet. Ist aber irgendwie nicht angekommen.

Also hier die Lösung:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Fenster2 : TForm1;
  MStream : TMemoryStream;
begin
  Fenster2:=TForm1.CreateNew(Application); // CreateNew mal in der OH nachschlagen
  MStream:=TMemoryStream.Create;
  Try
    MStream.WriteComponent(Self);
    MStream.Position:=0;
    MStream.ReadComponent(Fenster2);
    Fenster2.Visible:=False; // Für Visible wird True aus dem Stream gelesen. Muss aber False sein
      // nicht notwendig ->
      Fenster2.Left:=Left+20;
      Fenster2.Top:=Top+20;
      // <- nicht notwendig
     Fenster2.ShowModal;
  Finally
    MStream.Free;
 //   Fenster2.Release;
    end;
end;
Der Tip von Maximov mit RegisterClass ist natürlich Voraussetzung damit es funktioniert.

orakel 20. Jun 2004 20:29

Re: ganze Forms abspeichern
 
werds gleich mal ausprobieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 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