![]() |
EAccessViolation abfangen
Hi,
wie kann ich eine EAccessViolation abfangen? Mit try und except geht das leider nicht... Hier mein Code:
Delphi-Quellcode:
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.
function RemovePanel:Boolean;
begin try begin (MarkedPanel as TPanel).Destroy; Result:=True; end; except Result:=False; end; end; Schonmal Danke und einen schönen Feierabend ;-) |
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; |
Re: EAccessViolation abfangen
Ich weiß, tut aber nichts zu meinen Problem ;-)
|
Re: EAccessViolation abfangen
Hallo onlinehome,
|
Re: EAccessViolation abfangen
Zitat:
|
Re: EAccessViolation abfangen
Moin Andreas,
oder vielleicht so:
Delphi-Quellcode:
Result := (MarkedPanel is TPanel);
if Result then MarkedPanel.Free; |
Re: EAccessViolation abfangen
@Christian Seehase
Du hast natürlich völlig Recht! Ich meinte is und schrieb as... |
Re: EAccessViolation abfangen
IMHO gehts auch mit assigned(MarkedPanel).
|
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:
Das war dann alles.
FreeAndNil(MarkedPanel);
- 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. |
Re: EAccessViolation abfangen
Ok, mein Code lautet nun so:
Delphi-Quellcode:
Klappt wunderbar ;-)
function RemovePanel:Boolean;
begin if MarkedPanel.ClassType=TPanel then begin FreeAndNil(MarkedPanel); Result:=True; end else begin Result:=False; end; end; |
Re: EAccessViolation abfangen
Moin Andreas,
Du hast auch die Hilfe zu ClassType gelesen? Zitat:
|
Re: EAccessViolation abfangen
Zitat:
Delphi-Quellcode:
if MarkedExPanel.ClassType is TPanel then
|
Re: EAccessViolation abfangen
Genau. Denn wenns nicht instantiiert ist, ist es auch kein Panel, sondern nur ein Pointer ins nirgendwo.
|
Re: EAccessViolation abfangen
Christian Seehase hat's in Beitrag #6 beschrieben...
|
Re: EAccessViolation abfangen
Ok, funktioniert. Nochmal Vielen Dank an alle
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 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