AGB  ·  Datenschutz  ·  Impressum  







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

Seltsames(?) Verhalten von TReader

Ein Thema von Dani · begonnen am 27. Sep 2004 · letzter Beitrag vom 28. Sep 2004
Antwort Antwort
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#1

Seltsames(?) Verhalten von TReader

  Alt 27. Sep 2004, 21:00
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

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 <> 'TestTestthen 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;
Dani H.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Seltsames(?) Verhalten von TReader

  Alt 28. Sep 2004, 07:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Seltsames(?) Verhalten von TReader

  Alt 28. Sep 2004, 12:55
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
Dani H.
At Least I Can Say I Tried
  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 16:13 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