Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mysteriöse EAccessViolation (https://www.delphipraxis.net/2382-mysterioese-eaccessviolation.html)

BrainCode 20. Jan 2003 22:02


mysteriöse EAccessViolation
 
Ich habe ein ziemlich nerviges Problem: Bei einigen Programmen passiert es, dass eine AccessViolation auftritt, nachdem der Code der Prozedur abgearbeitet ist. Wenn ich dieses Programm auf Nailor's Rechner ausführe, zeigt mir Delphi eine ordentliche Fehlermeldung am richtigen Zeitpunkt inklusive Syntax-Highlighting an, mit Hilfe derer ich dann den Fehler beseitigen kann.
Seit ich diesen Fehler das erste Mal beobachtete, habe ich Windows einmal komplett neu installiert, aber der Fehler ist nicht weg. Ich dachte eigentlich, der Fehler würde von einer fehlerhaften Compilereinstellung kommen, aber auch das Löschen aller Dateien im Programmordner außer *.dpr *.pas *.dfm *.res half nichts.

Gollum 20. Jan 2003 22:06

Hallo,

wie sieht der Code aus, der den Fehler verursacht?

czapie 21. Jan 2003 18:26

Variablen-Überlagerung?
 
Hallo,

wir haben bei uns im Info-Lk ja auch so ab und zu unsere Probleme, aber so eine Zugriffsverletzung kommt oft von irgendeiner Überlagerung von irgendwelchen Variablen oder Objektattributen.
Nenn mal die Variablen einfach anders, wenns geht, ich weiß klingt blöd, hat aber seltsamer schon mal geklappt ???

Czapie.

BrainCode 21. Jan 2003 19:13

Mein Code ist folgender:

Code:
const
  count = 1024;
var
  datei: tfilestream;
  buffer: string;
  r: longint;
begin
  if opendialog1.Execute then begin
    datei := tfilestream.Create(opendialog1.FileName,fmopenread);
    setlength(buffer,count);
    r := datei.Read(buffer,count);
    memo1.Text := buffer;
  end;
end;
Durch Auskommentieren habe ich bemerkt, dass der Fehler in der Zeile, die mit "r :=" anfängt, liegt, die Fehlermeldung bekomme ich aber erst angezeigt, nachdem die komplette Prozedur abgearbeitet ist, auch im Einzelschrittmodus mit F7.

Daniel B 21. Jan 2003 19:19

Hi,

erstens, was ist "r"?
Und hast Du was grösseres vor, ausser eine Datei in eine Memo zu laden?

Grüsse, Daniel :hi:

BrainCode 21. Jan 2003 20:26

r hat die Deklaration r: longword, hab ich aus Versehen aus dem Posting gelöscht.
Das Einlesen der Daten soll noch in einen Loop, weil ich eine ganze Datei einlesen will, aber nach dem ersten Auftritt des Fehlers hab ich die Funktion erstmal zusammengekürzt.

jbg 21. Jan 2003 20:33

Ändere
Zitat:

r := datei.Read(buffer,count);
mal in
Delphi-Quellcode:
r := datei.Read(buffer[1],count);
um.

Gollum 21. Jan 2003 21:39

Hallo,

Code:
  datei := tfilestream.Create(opendialog1.FileName,fmopenread);
  --> setlength(buffer,count);
wo wird Count initialisiert, bzw. welchen Wert hat die Variable? Wenn Count<0 dann kann ich mir durchaus vorstellen, dass dann Read fehlschlägt.

Ausserdem ist per Definition der Rückgabewert von Read ein LongInt. Ändere die Variable r entsprechend.

Chewie 21. Jan 2003 21:53

Zitat:

Zitat von Gollum
wo wird Count initialisiert, bzw. welchen Wert hat die Variable? Wenn Count<0 dann kann ich mir durchaus vorstellen, dass dann Read fehlschlägt.

Schau mal in den const-Abschnitt: count hat den Wert 1024.

Luckie 21. Jan 2003 22:35

Also wenn du nichts größeres mit der Datei vor hast, außer im Memo anzeigen oder editieren, dann nimm doch:
Delphi-Quellcode:
Memo1.Lines.LoadfromFile('c:\Test.txt');

nailor 21. Jan 2003 23:20

function Read(var Buffer; Count: Longint): Longint; override;

Sagt meine Hilfe. Aber dein Buffer ist ein String. Also erst mal mit Zahlen arbeiten, und dann in String umwandeln, oder TextFile nehmen.

BrainCode 22. Jan 2003 20:00

Liste der Anhänge anzeigen (Anzahl: 2)
Mit dem Datentyp hatte ich mich geirrt, es ist ein Longint.

Code:
Memo1.Lines.LoadfromFile('c:\Test.txt');
Das hier funktioniert zwar bei Textdateien, ich will aber auch, wie Notepad, binäre Dateien wie z.B. exe oder gif-Dateien öffnen können.

Der Tip mit buffer[1] hat mir sehr geholfen, auch dieser funzt mit Textfiles wunderbar, aber wie das mit einer Gif-Datei aussieht, könnt ihr im Anhang bestaunen :zwinker: ...

Die Screenshots sind von einem Programmablauf mit folgendem Code entstanden:
Code:
const
  count = 1024;
var
  datei: tfilestream;
  buffer: string;
  r: longint;
begin
  if opendialog1.Execute then begin
    datei := tfilestream.Create(opendialog1.FileName,fmopenread or fmsharedenynone);
    setlength(buffer,count);
    repeat
      r := datei.Read(buffer[1],sizeof(buffer));
      memo1.Text := memo1.Text + buffer;
      //showmessage(inttostr(r));
    until (r < sizeof(buffer));
    datei.Free;
  end;
end;
Der Dateiname, der in dem Screenshot ständig zu sehen ist, ist der des gif-Bildes.

nailor 23. Jan 2003 13:37

So, lieber Braincode, teste mal den folgenden Code:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
const
  Count = 1024;
var
  Datei: TFileStream;
  Buffer: array[0..(Count-1)] of Char;
  l,i:   Word;
  Result: TCaption;
begin
if not OpenDialog1.Execute then Exit;

Memo1.Clear;
Result := '';

Datei := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
  while true do
    begin
      l := Datei.Read(Buffer, Count);
      if l <> Count then
        begin
          if not (l = 0) then
            for i := 0 to (l - 1) do
              Result := Result + Buffer[i];
          Break;
        end;
      Result := Result + Buffer;
    end;
finally
  Datei.Free;
end;

Memo1.Text := Result;
end;
sollte eigentlich jede Datei brav einlesen. Nur nicht Count auf 0 stellen, oder andere idiotische Sachen. Ähm, so Sachen wie Fortschrittsanzeige oder so, kann man wenn man Lust hat auch noch einbauen.


PS: nochmal zu deinem Ursprungscode:

Delphi-Quellcode:
r := datei.Read(buffer[1],sizeof(buffer));
Scheint mir ein wenig verdächtig.

Edit: ich nenne nie mehr eine Variable "l" (kleines L) das ist ja schlimm zu lesen, wenn die Zahlen keine andere Farbe bekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz