Delphi-PRAXiS
Seite 1 von 2  1 2      

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 ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.
Seite 1 von 2  1 2      

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