AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream verwenden

Ein Thema von Berni68 · begonnen am 8. Mär 2009 · letzter Beitrag vom 8. Mär 2009
Antwort Antwort
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#1

TFileStream verwenden

  Alt 8. Mär 2009, 12:55
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?
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.347 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TFileStream verwenden

  Alt 8. Mär 2009, 13:03
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#3

Re: TFileStream verwenden

  Alt 8. Mär 2009, 13:14
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.
Bernhard
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#4

Re: TFileStream verwenden

  Alt 8. Mär 2009, 15:28
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.
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.347 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: TFileStream verwenden

  Alt 8. Mär 2009, 15:52
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 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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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