![]() |
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; |
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.
|
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