![]() |
TFileStream verwenden
Hallo zusammen,
ich hab da ein Problem mit TFileStream's:
Delphi-Quellcode:
TFrame1 ist hierbei ein TFrame mit einem TEdit, TMemo und TLabel
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; 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? |
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. |
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. |
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. |
Re: TFileStream verwenden
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz