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