Thema: Delphi Problem mit Stream.Read

Einzelnen Beitrag anzeigen

moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Problem mit Stream.Read

  Alt 31. Jul 2004, 23:09
Täch

Das ist mir alles schleierhaft. Wenn ich
Stream.Read(Result[0], Length(Result)); verwende, dann gehts. Aber dann ist logischerweise das Array um eins nach links verschoben. Wenn ich nun meine Auswertung der Bytes so lasse, dann geht es. Passe ich alles an, dann kriege ich wieder die Zugriffsverletzung.

Das ist die ganze Procedure:
Delphi-Quellcode:
// Datensatz in result[] laden und analysieren, wie viele Flüge geloggt wurden
// Ergebnisse: in DatensatzZaehler stehen die anzahl Flüge (global)
// in DatensatzBeginn[x] steht die Startposition von Flug X (erstes Byte)
procedure TForm1.LogdateiLadenClick(Sender: TObject);
var
 filename: string;
 Stream: TFileStream;
 Position: Integer; // Zeiger für die aktuelle Position im Stream
 SatzLaenge: Integer; // ermittel die aktuelle Länge des Satzes
 i:Integer;
 Len: Integer;

begin
  if OpenDialog1.Execute then
  begin
    filename := OpenDialog1.FileName;
    LogDateiEdit.Text := ExtractFileName(OpenDialog1.FileName);
  end;
    // Arrays zurücksetzen
  SetLength(Result, 1);
  result[1]:=0;
  for i:=0 to high(DatensatzBeginn) do
    DatensatzBeginn[i]:=0;

  //DatensatzCombo.Strings.Clear;
  Form1.Caption := 'LogView Logdatei: ' + ExtractFileName(OpenDialog1.FileName);
  if filename = 'then exit
  else
  begin
    Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
    try
      SetLength(Result, Stream.Size);
      StreamLaengeEdit.Text := inttostr(Stream.Size);
      Stream.Read(Result[0], Length(Result));
    finally
      Stream.Free;
    end;

  end;
  DatensatzCombo.Clear;
  DatensatzCombo.Text := 'Datensatz auswählen';



  VersionEdit.Text := inttostr(result[1]); // Version des Datenformats in Edit schreiben
  ByteProMessungEdit.Text := inttostr(result[2]) + ' / Messung';
                                                // Anzahl der Bytes pro Messung in Edit schreiben
  EEpromGroesseEdit.Text := inttostr((result[3]*256+result[4])*256) + ' Bytes';
                                                // Größe des EEproms bestimmen und in Edit schreiben


  Satzlaenge := result[2]*(result[5]*256 + result[6]); // aktuelle Satzlänge bestimmen
  DatensatzLaengeEdit.Text := inttostr(Satzlaenge);
  DatensatzBeginn[0] := 5; // erster Datensazu startet immer bei 1 also am Anfang der Datei
  DatensatzStartEdit.Text := inttostr(DatensatzBeginn[0]);

  Position := Satzlaenge + 6 + 1; // 6 wegen der ersten 6 Startbyte
                                                // 1 wegen eins weiter als letze Position

  Datensatzzaehler := 1;
  DatensatzCombo.Strings.Append('1. Datensatz');

  edit1.Text:= inttostr(position);
  If position <> strtoint(StreamLaengeEdit.Text) - 1 then // Ende des Stream schon erreicht?
  // Der Pos.Zeiger steht auf dem vorletzten Byte. Deswegen -1 bei StreamLänge!!
    begin
    while position <> strtoint(StreamLaengeEdit.Text) - 1 do // Stremende erreicht (s.o.)
      begin
        DatensatzBeginn[Datensatzzaehler] := Position;
        Satzlaenge := result[2]* (result[Position] * 256 + result[Position + 1]);
        Position := Position + Satzlaenge + 2;
        DatensatzCombo.Strings.Append(inttostr(Datensatzzaehler + 1) + '. Datensatz');
        Inc(Datensatzzaehler);
      end;
    end;
    AnzahlFluegeEdit.Text := inttostr(DatensatzZaehler);
end;
Ich begreife das nicht
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat