Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi access violation Cannot read (https://www.delphipraxis.net/407-access-violation-cannot-read.html)

Guenni_d 16. Jul 2002 08:20


access violation Cannot read
 
Hallo zusammen,

habe mit folgendem Code ein kleines Problem. Wollte eine ganz galante Lösung machen um ein Textfile einzulesen. Ich weiss, hätte es auch mit Readln und den ganzen alten Pascal Funktionen machen können.

Habe aber nun mit untenstehender Funktion ein kleines Problem. NAch FreeMem bekomme ich nämlich eine access violation...

Jemand ne Idee?


Code:
procedure Languageeinlesen;
var
  iFileHandle: Integer;
  iFileLength: Integer;
  iBytesRead: Integer;
  Buffer: PChar;
  i: Integer;
  x: string;
begin
    try
      iFileHandle := FileOpen('AMS.LG', fmOpenRead);
      iFileLength := FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      Buffer := PChar(AllocMem(iFileLength + 1));
      iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
      FileClose(iFileHandle);

      for i := 0 to iBytesRead-1 do
      begin
       StringGrid1.RowCount := StringGrid1.RowCount + 1;
        StringGrid1.Cells[1,i+1] := Buffer[i];
        StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));

      end;

    finally
      FreeMem(Buffer);
Gruss Günter

MrSpock 16. Jul 2002 08:32

Hallo Guenni_D,

wenn eine der ersten beiden Zeilen eine Exception auslöst, ist Buffer noch undefiniert (Nil) und FreeMem läuft auf einen Fehler.

Christian Seehase 16. Jul 2002 10:58

Moin Günter,

probier's mal so:

Code:
begin
  iFileHandle := FileOpen('c:\AMS.LG', fmOpenRead);
  if iFileHandle <> INVALID_HANDLE_VALUE then
  begin
    try
      iFileLength := FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      Buffer := PChar(AllocMem(iFileLength + 1));
      try
        iBytesRead := FileRead(iFileHandle,Buffer[0], iFileLength);
        for i := 0 to iBytesRead-1 do
        begin
          StringGrid1.RowCount := StringGrid1.RowCount + 1;
          StringGrid1.Cells[1,i+1] := Buffer[i];
          StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
        end;
      finally
        FreeMem(Buffer,iFileLength+1);
      end;
    finally
      FileClose(iFileHandle);
    end;
  end;
end;
Wichtig ist beim Lesen Buffer[0], sonst schreibt die Leseroutine in's Nirvana.

***EDIT***
Es ist übrigens recht gefährlich keinen Pfad für die Datei mit anzugeben, und sei es, mit ExtractFilePath(paramstr(0)), relativ zum Programm.
So wie Du es geschrieben hast, greifst Du auf die Datei relativ zum Arbeitsverzeichnis zu, und das kann leicht schiefgehen.

Guenni_d 18. Jul 2002 13:54

Danke.....
 
lag tatsächlich daran, dass ich relativ zuzm Pfad zugegriffen hab....
Danke für den Tip.
Gruss Günter


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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