Einzelnen Beitrag anzeigen

DualCoreCpu
(Gast)

n/a Beiträge
 
#1

EReadError beim Lesen der mit TWriter geschriebenen Daten

  Alt 4. Aug 2015, 10:30
Hallo,

es geht immer noch um TReader/TWriter. Gestern hatte ich hier:
http://www.delphipraxis.net/186096-e...er-stream.html

Daten geschrieben, die ich nun lesen will. Dabei erhalte ich die EReadError Exception.

Das hier ist der aktuelle Quelltext dazu:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FileServer, StdCtrls;

type
  TTestRec = record
    Feld1: String;
    Feld2: String;
    Feld3: String;
  end;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    btnOk: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo: TMemo;
    procedure FormDestroy(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure btnOkClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FStream: TFileStream;
    FReader: TFileStream;
    FileReader: TReader;
    FFileWriter: TWriter;
    FTestFields: TTestRec;
  public
    { Public declarations }
    procedure CreateFileForWrite;
    procedure CreateWnd; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnOkClick(Sender: TObject);
begin
  FFileWriter.WriteString(FTestFields.Feld1);
  FFileWriter.WriteString(FTestFields.Feld2);
  FFileWriter.WriteString(FTestFields.Feld3);
end;

procedure TForm1.CreateFileForWrite;
var
  Directory: String;
begin
  Directory := GetCurrentDir;
  if Directory[Length(Directory)]<>'\then Directory := Directory + '\';
  FStream := TFileStream.Create(Directory+'Testfile.def', fmCreate);
  FFileWriter := TWriter.Create(FStream,1024);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  FTestFields.Feld1 := Edit1.Text;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  FTestFields.Feld2 := Edit2.Text;
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
  FTestFields.Feld3 := Edit3.Text;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FFileWriter.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Erzeugen des Streams zum Lesen
  FReader := TFileStream.Create('TestFile.def', fmOpenRead, fmShareDenyWrite);

  //Erzeugen des Filereader Objektes vom Typ TReader
  FileReader := TReader.Create(FReader, 1024);

  //Lesen der Daten
  FTestFields.Feld1 := FileReader.ReadString;
  FTestFields.Feld2 := FileReader.ReadString;
  FTestFields.Feld3 := FileReader.ReadString;

  FileReader.Free; //Zunächst Reader freigeben und so Datei schließen

  CreateFileForWrite; //Nun kann die Datei zum Schreiben geöffnet werden.

  //Überprüfen, ob richtig gelesen
  Memo.Lines.Add('Feld 1 ---> '+FTestFields.Feld1);
  Memo.Lines.Add('Feld 2 ---> '+FTestFields.Feld2);
  Memo.Lines.Add('Feld 3 ---> '+FTestFields.Feld3);

end;

procedure TForm1.CreateWnd;
begin
  inherited;
  //CreateFileForWrite;
  //Diese Methode wird VOR FormCreate aufgerufen. Damit wird die Datei von anderem Prozess
  //verwendet, ich erhalte eine EFOpenError Exception. Deshalb in FormCreate verlegt.
end;

end.
Meine Frage ist nun, wie kann ich das Lesen bewerkstelligen?
  Mit Zitat antworten Zitat