Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EAccessViolation abfangen (https://www.delphipraxis.net/66442-eaccessviolation-abfangen.html)

Andreas L. 29. Mär 2006 19:08


EAccessViolation abfangen
 
Hi,
wie kann ich eine EAccessViolation abfangen? Mit try und except geht das leider nicht...

Hier mein Code:
Delphi-Quellcode:
function RemovePanel:Boolean;
begin
 try
  begin
  (MarkedPanel as TPanel).Destroy;
  Result:=True;
  end;
 except
  Result:=False;
 end;
end;
MarkedPanel ist eine Globale Variable vom Typ "TObject", in ihr steht das selektierte Panel. Eine Möglichkeit das ganze zu umgehen wäre wohl die globale Variable zu überprüfen ob was drinsteht, aber ich suche nach was besseren.

Schonmal Danke und einen schönen Feierabend ;-)

Die Muhkuh 29. Mär 2006 19:09

Re: EAccessViolation abfangen
 
Du kannst das begin und end nach try weglassen:

Delphi-Quellcode:
function RemovePanel:Boolean;
begin
try
  (MarkedPanel as TPanel).Destroy;
  Result:=True;
except
  Result:=False;
end;
end;

Andreas L. 29. Mär 2006 19:12

Re: EAccessViolation abfangen
 
Ich weiß, tut aber nichts zu meinen Problem ;-)

Hawkeye219 29. Mär 2006 19:24

Re: EAccessViolation abfangen
 
Hallo onlinehome,
  • Die Exception wird nur beim Starten des Programms innerhalb der IDE gemeldet. Wie man dieses Verhalten abschaltet, wird u.a. in diesem Thread beschrieben.
  • In Deinem Beispiel ist ein TRY..EXCEPT gar nicht notwendig. Du könntest mit dem AS-Operator prüfen, ob in der Variablen wirklich eine gültige TPanel-Instanz steht.
  • Destroy sollte nie direkt aufgerufen werden! Freigaben führt man durch einem Aufruf der Methode Free() durch.
Gruß Hawkeye

Andreas L. 29. Mär 2006 19:26

Re: EAccessViolation abfangen
 
Zitat:

Zitat von Hawkeye219
Hallo onlinehome,
  • Die Exception wird nur beim Starten des Programms innerhalb der IDE gemeldet. Wie man dieses Verhalten abschaltet, wird u.a. in diesem Thread beschrieben.
  • In Deinem Beispiel ist ein TRY..EXCEPT gar nicht notwendig. Du könntest mit dem AS-Operator prüfen, ob in der Variablen wirklich eine gültige TPanel-Instanz steht.
  • Destroy sollte nie direkt aufgerufen werden! Freigaben führt man durch einem Aufruf der Methode Free() durch.
Gruß Hawkeye

Ok, Danke :thumb:

Christian Seehase 29. Mär 2006 20:37

Re: EAccessViolation abfangen
 
Moin Andreas,

oder vielleicht so:

Delphi-Quellcode:
Result := (MarkedPanel is TPanel);
if Result then MarkedPanel.Free;

Hawkeye219 29. Mär 2006 20:42

Re: EAccessViolation abfangen
 
@Christian Seehase
Du hast natürlich völlig Recht! Ich meinte is und schrieb as...

3_of_8 29. Mär 2006 21:34

Re: EAccessViolation abfangen
 
IMHO gehts auch mit assigned(MarkedPanel).

Muetze1 29. Mär 2006 21:50

Re: EAccessViolation abfangen
 
Wenn das Objekt so oder so freigegeben werden soll - egal ob es nun ein Panel oder sonstwas ist - und auch die Funktion mehrfach aufgerufen werden könnte, dann so:

Delphi-Quellcode:
  FreeAndNil(MarkedPanel);
Das war dann alles.

- FreeAndNil() ruft free auf, somit keine Probleme, wenn die Variable = Nil ist.
- Der Destruktor ist virtuell, somit wird der richtige Destruktor des darin enthaltenen Objektes aufgerufen
- Nach dem Free wird MarkedPanel auf Nil gesetzt und somit dafür gesorgt, dass es nicht mehrfach freigegeben wird.

Andreas L. 30. Mär 2006 16:55

Re: EAccessViolation abfangen
 
Ok, mein Code lautet nun so:
Delphi-Quellcode:
function RemovePanel:Boolean;
begin
 if MarkedPanel.ClassType=TPanel then
  begin
  FreeAndNil(MarkedPanel);
  Result:=True;
  end
 else
  begin
   Result:=False;
  end;
end;
Klappt wunderbar ;-)

Christian Seehase 30. Mär 2006 18:24

Re: EAccessViolation abfangen
 
Moin Andreas,

Du hast auch die Hilfe zu ClassType gelesen?

Zitat:

Zitat von OH - ClassType
Avoid using ClassType in application code.
In Delphi code, use the is or as operators instead of ClassType.

Ausserdem hast Du das Problem, dass Du Dir eine AV einhandelst, wenn MarkedPanel = nil ist, oder einen ungültigen Pointer enthält.

Andreas L. 30. Mär 2006 19:11

Re: EAccessViolation abfangen
 
Zitat:

Zitat von Christian Seehase
Moin Andreas,

Du hast auch die Hilfe zu ClassType gelesen?

Zitat:

Zitat von OH - ClassType
Avoid using ClassType in application code.
In Delphi code, use the is or as operators instead of ClassType.

Ausserdem hast Du das Problem, dass Du Dir eine AV einhandelst, wenn MarkedPanel = nil ist, oder einen ungültigen Pointer enthält.

Und wie soll das mit den is-Operator gehen?

Delphi-Quellcode:
if MarkedExPanel.ClassType is TPanel then

3_of_8 30. Mär 2006 19:14

Re: EAccessViolation abfangen
 
Genau. Denn wenns nicht instantiiert ist, ist es auch kein Panel, sondern nur ein Pointer ins nirgendwo.

Hawkeye219 30. Mär 2006 19:18

Re: EAccessViolation abfangen
 
Christian Seehase hat's in Beitrag #6 beschrieben...

Andreas L. 30. Mär 2006 19:33

Re: EAccessViolation abfangen
 
Ok, funktioniert. Nochmal Vielen Dank an alle


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