![]() |
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. |
Hallo,
wie sieht der Code aus, der den Fehler verursacht? |
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. |
Mein Code ist folgender:
Code:
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.
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; |
Hi,
erstens, was ist "r"? Und hast Du was grösseres vor, ausser eine Datei in eine Memo zu laden? Grüsse, Daniel :hi: |
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. |
Ändere
Zitat:
Delphi-Quellcode:
um.
r := datei.Read(buffer[1],count);
|
Hallo,
Code:
wo wird Count initialisiert, bzw. welchen Wert hat die Variable? Wenn Count<0 dann kann ich mir durchaus vorstellen, dass dann Read fehlschlägt.
datei := tfilestream.Create(opendialog1.FileName,fmopenread);
--> setlength(buffer,count); Ausserdem ist per Definition der Rückgabewert von Read ein LongInt. Ändere die Variable r entsprechend. |
Zitat:
|
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');
|
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. |
Liste der Anhänge anzeigen (Anzahl: 2)
Mit dem Datentyp hatte ich mich geirrt, es ist ein Longint.
Code:
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.
Memo1.Lines.LoadfromFile('c:\Test.txt');
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:
Der Dateiname, der in dem Screenshot ständig zu sehen ist, ist der des gif-Bildes.
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; |
So, lieber Braincode, teste mal den folgenden Code:
Delphi-Quellcode:
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.
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; PS: nochmal zu deinem Ursprungscode:
Delphi-Quellcode:
Scheint mir ein wenig verdächtig.
r := datei.Read(buffer[1],sizeof(buffer));
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