![]() |
Zugriffsverletzungen abfangen
Hallo zusammen!
Ich hab das gleiche Problem wie im Thema ![]()
Delphi-Quellcode:
Wenn ich das laufen lasse und doppelklicke, kriege ich - wie erwartet - den Dialog mit der 1 zu sehen, nicht aber den mit der 2. Stattdessen kommt eine Fehlermeldung "Zugriffsverletzung bei...".
procedure TForm1.FormDblClick(Sender: TObject);
begin try PRect(nil)^.Left := 777; except on E: EAccessViolation do ShowMessage('1'); end; try Image1.Picture.LoadFromFile(ExpandFileName('.\20326.jpg')); // <- JPEG aus verlinktem Posting except on E: EAccessViolation do ShowMessage('2'); end; end; Kann mir jemand sagen, warum ich die eine ZV abfangen kann, die andere aber nicht? Uli. |
Re: Zugriffsverletzungen abfangen
Das zweite schein keine Zugriffsverletzung zu sein.
Änder den Code mal wie folgt:
Delphi-Quellcode:
und sag uns, was du da für eine Exception bekommst.
except
on E: Exception do ShowMessage(E.ClassName); |
Re: Zugriffsverletzungen abfangen
Dürfte wohl eher eine 2 werden, oder ist die Datei vorhanden?
[edit] Sry, war dem Link nicht gefolgt (ich werde wohl doch langsam alt) [/edit] |
Re: Zugriffsverletzungen abfangen
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Delphi-Quellcode:
kriege ich "meine" Meldung zu sehen. Die IDE zeigt jeweils noch die Meldungen aus den Anhängen an, die für mich beide recht ähnlich ausschauen.
try
Image1.Picture.LoadFromFile(ExpandFileName('.\20326.jpg')); except ShowMessage('2'); end; |
Re: Zugriffsverletzungen abfangen
Dann lass dir doch mal den Exception Klassennamen anzeigen, damit du siehst, WAS für eine Exception dort geworfen wird. Ich bekomme zum Beispiel die Exception EInavlidGraphic, wenn die date nicht existiert.
|
Re: Zugriffsverletzungen abfangen
Zitat:
Delphi-Quellcode:
in der markierten Zeile einen Breakpoint setze, hält der Debugger dort nicht.
procedure TForm1.FormDblClick(Sender: TObject);
begin try Image1.Picture.LoadFromFile(ExpandFileName('.\20326.jpg')); except ShowMessage('2'); // <==== end; end; Wenn ich zusätzlichen diesen
Delphi-Quellcode:
Handler für Application.OnException installiere, meldet er mir "AppException EAccessViolation". :?:
procedure TForm1.AppException(Sender: TObject; E: Exception);
begin ShowMessage('AppException ' + E.ClassName); end; |
Re: Zugriffsverletzungen abfangen
Die Exception kommt nicht bei Loadfromfile sondern bei einer darauffolgenden WM_Paint an das Control.
Edit1: Und wen es noch genauer interessiert: Die Exception kommt aus der Unit jpeg und der relevante ASM-Teil sieht folgendermaßen aus:
Delphi-Quellcode:
asm
... @begin ... mov eax,[ebp+$0c] mov eax,[eax] add dword ptr [ebp+$0c],$04 ... mov [eax],bl //<--Exception ... dec dword ptr [ebp+$08] jns @begin ... end; Edit2: Und wie das ganze jetzt umgehen? z.B. so:
Delphi-Quellcode:
Das ändert aber nichts an dem Fehler im Bild (oder in der Unit jpeg)
procedure TForm1.FormDblClick(Sender: TObject);
begin try Image1.Picture.LoadFromFile(ExpandFileName('.\20326.jpg')); Image1.Repaint; except on E:EAccessViolation do ShowMessage('2'); end; end; |
Re: Zugriffsverletzungen abfangen
Zitat:
In meiner "echten" Anwendung arbeite ich zwar nicht mit einem TImage, sondern mit StretchDraw auf ein Bitmap, aber das krieng mer dann auch noch hin. :mrgreen: Zitat:
Danke euch allen! UPDATE: Anstelle von TCanvas.StretchDraw
Delphi-Quellcode:
aufrufen hilft. Nicht elegant, aber es tut. :D
procedure CheckedStretchDraw(ACanvas: TCanvas; const ARect: TRect; AGraphic: TGraphic);
begin try ACanvas.StretchDraw(ARect, AGraphic); ACanvas.Refresh; except on E: EAccessViolation do ACanvas.TextOut(ARect.Left, ARect.Top, 'Kaputt!'); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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 by Thomas Breitkreuz