Announcement

Collapse
No announcement yet.

Komponenten Speichern/lesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Komponenten Speichern/lesen

    Ich habe folgendes Problem,
    Ich erzeuge zur Laufzeit einge Komponenten in ein Panel. Diese Komponenten möchte ich in eine Datei speichern und später wieder einlesen.
    Ich kann ich sowas am einfachsten realisieren ?

  • #2
    Hallo,

    Zitat aus der Delphi-Hilfe zu <b>TStream.WriteComponent</B>:

    <i>Die Methode WriteComponent leitet das Schreiben von Komponenten und deren Eigenschaften in einen Stream ein.

    procedure WriteComponent(Instance: TComponent);

    Beschreibung

    Intern wird WriteComponent im Komponenten-Streaming-System verwendet. Die Methode kann aber auch direkt aufgerufen werden, wenn Komponenten in Speicher-Streams oder Datenbank-BLOBs geschrieben werden sollen.

    WriteComponent erstellt ein Writer-Objekt und ruft dessen Methode WriteRootComponent auf, um die in Instance angegebene Komponente und deren untergeordnete Objekte in den Stream zu schreiben.</i>

    In der Delphi-Hilfe wird die Umwandlung von Komponenten in Strings (und umgekehrt) als Beispiel gezeigt. Ein praktische Einsatzfall (Speichern und Einlesen von Instanzen zur Laufzeit) kann zum Beispiel wie folgt aussehen:

    <pre>
    procedure TForm1.spdOpenFileClick(Sender: TObject);
    begin
    dlgOpen.FileName := '';
    if dlgOpen.Execute then
    begin
    DeleteObjects;
    FS := TFileStream.Create(dlgOpen.FileName,fmOpenRead or fmShareDenyWrite);
    try
    while FS.Position < FS.Size do
    begin
    NewObj := TDrawShape.Create(Self);
    NewObj.Parent := Self;
    NewObj.PopupMenu := FormatMenu;
    FS.ReadComponent(NewObj);
    end;
    finally FS.Free; end;
    end;
    CountObjects;
    end;

    procedure TForm1.spdSaveFileClick(Sender: TObject);
    var
    a : Integer;
    begin
    if dlgSave.Execute then
    begin
    FS := TFileStream.Create(dlgSave.FileName,fmCreate or fmShareDenyWrite);
    try
    for a := 0 to ControlCount-1 do
    if Controls[a] is TDrawShape then
    FS.WriteComponent(Controls[a] as TDrawShape);
    finally FS.Free; end;
    end;
    end;
    </pre&gt

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für die Antwort. Das speichern der Komponenten, die ich zur Laufzeit erzeuge, läuft einwandfrei. Ich habe jedoch das Problem mit der Lese-Routine

      procedure TForm1.spdOpenFileClick(Sender: TObject);
      begin
      dlgOpen.FileName := '';
      if dlgOpen.Execute then
      begin
      DeleteObjects;
      FS := TFileStream.Create(dlgOpen.FileName,fmOpenRead or fmShareDenyWrite);
      try
      while FS.Position < FS.Size do
      begin
      NewObj := TDrawShape.Create(Self);
      NewObj.Parent := Self;
      NewObj.PopupMenu := FormatMenu;
      FS.ReadComponent(NewObj);
      end;
      finally FS.Free; end;
      end;
      CountObjects;
      end;

      Wie sieht das aus wenn ich verschiedene Klassen speiechere
      NewObj kann TcustomShape bzw. tCustumBitmap sein.

      Cesari

      Comment

      Working...
      X