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 TFileStream verwenden (https://www.delphipraxis.net/130434-tfilestream-verwenden.html)

Berni68 8. Mär 2009 12:55


TFileStream verwenden
 
Hallo zusammen,

ich hab da ein Problem mit TFileStream's:

Delphi-Quellcode:
procedure TMainForm.Speichern1Click(Sender: TObject);
var
  FS: TFileStream;
begin
  FS:= TFileStream.Create('test.xyz', fmCreate);
  FS.WriteComponent(Frame);
  FS.Free;
  Frame.free;
end;
procedure TMainForm.Lesen1Click(Sender: TObject);
var
  FS: TFileStream;
begin
  RegisterClasses([TFrame1]);
  FS:= TFileStream.Create('test.xyz', fmOpenRead);
  FS.ReadComponent(Frame);
  FS.Free;
end;
TFrame1 ist hierbei ein TFrame mit einem TEdit, TMemo und TLabel

Funktioniert nicht: Fehlermeldung beim Lesen: Eine Komponente namens Edit1 existiert bereits.
Ersetzt man TFrame durch eine 'einfache Komponente' wie TEdit oder TMemo geht es problemlos,
alle Eigenschaftswerte werden korrekt gesetzt.
Aber es sollte doch auch möglich sein ein zusammengesetztes Gebilde wie TFrame oder TForm 'als Ganzes' zu speichern und wieder einzulesen?

jaenicke 8. Mär 2009 13:03

Re: TFileStream verwenden
 
Die Fehlermeldung sagt doch schon alles: Irgendwo gibt es bereits gleichnamige Komponenten wie die, die du da auslesen willst.

Wenn du das Zum Duplizieren nutzen willst, dann musst du nach dem Speichern erstmal die alten Komponenten umbenennen, denn die aus dem Stream geladenen haben ja die gleich Namen.

Berni68 8. Mär 2009 13:14

Re: TFileStream verwenden
 
Das ist ja das Problem.
Mit der Anweisung Frame.free beim Speichern werden diese Objekte ja entfernt.
Ansonsten ist nichts in dem Miniprogramm das so heißt.

Beim Einlesen werden die Objekte dann wohl mit create wieder erzeugt und können dann nicht eigelesen werden, will damit sagen ReadComponent(Frame) blockiert sich irgendwie selbst.

Berni68 8. Mär 2009 15:28

Re: TFileStream verwenden
 
So wie es aussieht ist das Problem für TFrames nicht zu lösen (Es existiert keine Funktion CreateNew für TFrames).
Allerdings habe ich (im Internet an andere Stelle) eine Lösung des Problems für TForm gefunden.

Für den den es interessiert:
Ein normales Formular, das beim Erzeugen die Eigenschaftswerte der Komponenten jedoch von Datei liest, sofern das Formular zuvor schon einmal abgespeichert wurde.
Der Vorteil liegt darin, daß wenn das Formular um weitere Objekte ergänzt wird alles automatisch gespeichert wird.
Gut geeignet als Ersatz für ini-Dateien da weniger Schreibarbeit, von der geringeren Fehleranfälligkeit ganz zu schweigen.

Delphi-Quellcode:
unit AutoSpeichern;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TAutoSpeichernForm = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Label1: TLabel;
    Edit2: TEdit;
  private
  public
    constructor Create(AOwner: TComponent); override;
    procedure BeforeDestruction; override;
  end;

var
  AutoSpeichernForm: TAutoSpeichernForm;

implementation

{$R *.DFM}

constructor TAutoSpeichernForm.Create(AOwner: TComponent);
var
  datei: string;
begin
  datei:= ExtractFilePath(Application.ExeName) + ClassName + '.fs';
  if FileExists(datei) then
  begin
    CreateNew(AOwner, 0);
    with TFileStream.Create(datei, fmOpenRead or fmShareDenyWrite) do
    try
      ReadComponent(Self);
    finally
      Free;
    end;
  end
  else
    inherited Create(AOwner);
end;

procedure TAutoSpeichernForm.BeforeDestruction;
var
  datei: string;
begin
  inherited;
  datei:= ExtractFilePath(Application.ExeName) + ClassName + '.fs';
  with TFileStream.Create(datei, fmCreate) do
  try
    WriteComponent(Self);
  finally
    Free;
  end;
end;

end.

jaenicke 8. Mär 2009 15:52

Re: TFileStream verwenden
 
Zitat:

Zitat von Berni68
So wie es aussieht ist das Problem für TFrames nicht zu lösen (Es existiert keine Funktion CreateNew für TFrames).

Ja, das Problem ist, dass die Komponenten selbst ja bereits beim Erzeugen des Frames erzeugt werden.

Zitat:

Zitat von Berni68
Der Vorteil liegt darin, daß wenn das Formular um weitere Objekte ergänzt wird alles automatisch gespeichert wird.
Gut geeignet als Ersatz für ini-Dateien da weniger Schreibarbeit, von der geringeren Fehleranfälligkeit ganz zu schweigen.

Naja, aber da visuelle Komponenten ja ohnehin nicht zur Datenhaltung und Datenspeicherung geeignet sind (Trennung Oberfläche <--> Daten), bringt das ja in der Realität wenig.


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