Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Seltsames(?) Verhalten von TReader (https://www.delphipraxis.net/30671-seltsames-verhalten-von-treader.html)

Dani 27. Sep 2004 20:00


Seltsames(?) Verhalten von TReader
 
Hiho!

Per TFiler möchte ich einige Properties von Komponenten speichern und laden. Allerdings klappt das laden nicht wirklich, und ich sehe nicht, woran das liegt :(

Vielleicht liegt es an meinem Code, obwohl der nicht wirklich komplex ist...
Das Problem liegt darin, dass die Größe des Filestreams nach dem aufruf von ReadString plötzlich Null ist, weshalb die Bedingung FS.Position < FS.Size niemals wahr wird. Trotz des fehlerhaften Size-Wertes wird die zu ladende Datei nach FS.Free aber nicht zu einer Null-Byte-Datei.

Falls jemand eine Idee hätte, wäre ich echt superdankbar :zwinker:

Grüße,
Dani

------------------
Delphi-Quellcode:
//Code:

//Memo-Inhalt speichern:

procedure SaveLinkedMemo(FS: TFilestream; W: TWriter;
  Memo: TLinkedMemo);
begin
  with Memo do
   begin
    W.WriteString(ClassName);
    W.WriteString(Name);
    W.WriteString(Lines.Text);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var FS: TFileStream;
    W: TWriter;
    i: Integer;
    c: TComponent;
begin
 try
  FS := TFileStream.Create('C:\filertest.cfg', fmCreate or fmShareExclusive);
  W := TWriter.Create(FS, 4096);
 except
  exit;
 end;

 try
  FS.Position := 0;
  W.WriteString('TEST!');
  W.WriteString('TestTest');


  for i:=0 to Self.ComponentCount-1 do
    begin
     c := Self.Components[i];
     If c is TLinkedEdit then SaveLinkedEdit(FS, W, c as TLinkedEdit)
      else If c is TLinkedMaskEdit then SaveLinkedMaskEdit(FS, W, c as TLinkedMaskEdit)
      else If c is TLinkedCheckBox then SaveLinkedCheckBox(FS, W, c as TLinkedCheckBox)
      else If c is TLinkedMemo then SaveLinkedMemo(FS, W, c as TLinkedMemo)
      else If c is TLinkedRadioButton then SaveLinkedRadioButton(FS, W, c as TLinkedRadioButton)
      else If c is TLinkedComboBox then SaveLinkedComboBox(FS, W, c as TLinkedCombobox);
    end;
 finally
  W.Free;
  FS.Free;
 end;
end;

//Memo-Inhalt laden:

procedure LoadLinkedMemo(sName: String; FS: TFileStream; R: TReader;
  DestForm: TForm);
var c: TComponent;
begin
  c := DestForm.FindComponent(sName);
  If c <> nil then
   If c is TLinkedMemo then
    with (c as TLinkedMemo) do
     begin
      Lines.Text := R.ReadString;
     end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var FS: TFileStream;
     R: TReader;
     s: String;
begin
 try
  FS := TFileStream.Create('C:\filertest.cfg', fmOpenRead or fmShareDenyNone);
  R := TReader.Create(FS, 4096);
 except
  exit;
 end;

 try
  FS.Position := 0;
  If R.ReadString <> 'TEST!' then raise Exception.Create('Falsche Dateisignatur');
  If R.ReadString <> 'TestTest' then raise Exception.Create('Hurrah');


 While FS.Position < FS.Size do
   begin
    s := Lowercase(R.ReadString);
     If (s='tlinkededit') then LoadLinkedEdit(R.ReadString, FS, R, Self)
      else If (s='tlinkedmaskedit') then LoadLinkedMaskEdit(R.ReadString, FS, R, Self)
      else If (s='tlinkedmemo') then LoadLinkedMemo(R.ReadString, FS, R, Self)
      else If (s='tlinkedradiobutton') then LoadLinkedRadioButton(R.ReadString, FS, R, Self)
      else If (s='tlinkedcheckbox') then LoadLinkedCheckbox(R.ReadString, FS, R, Self)
      else If (s='tlinkedcombobox') then LoadLinkedComboBox(R.ReadString, FS, R, Self);
   end;
 finally
  R.Free;
  FS.Free;
 end;
end;

Dax 28. Sep 2004 06:23

Re: Seltsames(?) Verhalten von TReader
 
Laut deiner Methode "SaveLinkedMemo" wird als erstes der Klassenname des Memos gespeichert. Wenn du jetzt *.Lines damit einliest, wird es deinen Klassennamen einlesen, nicht die zuvor gerespeicherten Lines. Aber wenn du wirklich die Eigenschaften deiner Komponeneten speichern willst, solltest du vielleicht in Erwägung ziehen, deine eigene Klasse zu schreiben, die dann das Laden und Speichern übernimmt, statt dich auf TWriter und TReader zu verlassen.

Dani 28. Sep 2004 11:55

Re: Seltsames(?) Verhalten von TReader
 
Hi,

Danke für die Antwort, aber daran kann es eigentlich nicht liegen, weil der Code garnicht bis dahin ausgeführt wird. Die Prozedur bricht immer an der Stelle "FS.Position < FS.Size" ab, da Size nach dem ersten Aufruf von R.ReadString plötzlich 0 ist.

Habe jetzt abgespeckte Versionen von TReader und TWriter "nachgebaut" und mit denen funktioniert es problemlos :-)

Ciao


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 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-2025 by Thomas Breitkreuz