![]() |
Try-finally und modalresult
Ich bin mir nicht ganz sicher, wie ich hier richtig vorgehe, bzw. ob ich das so machen kann:
Delphi-Quellcode:
Kann ich davon ausgehen, dass bei der Abarbeitung der finally-Klausel meine Form noch existiert und das sl.free sicher durchgeführt wird, oder riskiere ich unter Umständen, dass ich mir mit der Zuweisung an Modalresult quasi den Ast abgesägt habe, auf dem ich sitze?
type
TMyform=class(Tform) ... private sl: TStringList end; implementation procedure Tmyform.dosomething; begin sl:=TStringList.create; try ... if bedingung1 then if bedingung 2 then ModalResult:=mrOK else Modalresult:=mrAbort; ... finally sl.free; end (* try *); end; |
AW: Try-finally und modalresult
Mir persönlich ist kein Fall bekannt, in dem ein finally nicht ausgeführt wird, wenn der Block erst einmal betreten wurde. Zur Not kannst Du das aber auch im Debugger überprüfen.
|
AW: Try-finally und modalresult
Habe jetzt eben bemerkt, die Frage ist ein Unsinn.
Durch die Zuweisung an modalresult wird ja das Formular nur geschlossen, freigegeben wird es ja wenn überhaupt erst später. Meine Sorge war nicht, ob das finally durchgeführt wird, davon kann man, denke ich, mit Sicherheit ausgehen, sondern ob es das Formular dann in allen Fällen noch gibt. |
AW: Try-finally und modalresult
Die Methode läuft definitiv noch komplett durch.
ModalResult und Close haben erst am Ende (oben, in der Messagebehandlung) oder beim nächsten Application.ProcessMessages eine Auswirkung, auf das Schließen. |
AW: Try-finally und modalresult
Beim Setzen von 'ModalResult' passiert erst einmal gar nichts. Außer, das ModalResult gesetzt wird. Erst wenn die Message, aufgrund dessen deine Methode aufgerufen wurde, abgearbeitet ist, wird ModalResult ausgewertet.
Steht auch so im VCL-Code. |
AW: Try-finally und modalresult
Alles klar.
Abgesehen davon wäre es egal. Sogar wenn das Close gleich durchgeführt würde, was nicht der Fall ist, wäre die Datenstruktur der Form immer noch da, also würde auch dann im finally nichts passieren. Dem sl.free ist es ja völlig egal, ob die Form gerade sichtbar oder unsichtbar ist. |
AW: Try-finally und modalresult
Bei try finally kann aber die Routine bei Exceptions überall zum finally block herausspringen.
Dann könnte ModalResult undefiniert sein (oder zumindest nicht so wie du es gerne hättest). Also ich definiere alles Wichtige schonmal bevor try finally, und nur wenn er bis zum Result := OK kommt ist alles richtig durchgelaufen. Ansonsten wäre das dann wie gewünscht. Rollo |
AW: Try-finally und modalresult
![]() |
AW: Try-finally und modalresult
Ich habe mir angewöhnt, alles was im Formular zum Schließen beitragen kann (hier also die Stringlist) im "OnCreate" zu erzeugen und im "OnClose" wieder frei zu geben. In diesem Fall also würde sich die Frage dann gar nicht stellen und man müsste nicht darüber nachdenken, ob man es richtig macht.
|
AW: Try-finally und modalresult
Was man im
Delphi-Quellcode:
erzeugt und über die Lifetime der Form-Instanz benötigt, sollte man tunlichst im
OnCreate
Delphi-Quellcode:
aufräumen.
OnDestroy
Alle anderen Zeitpunkte/Events funktionieren nur unter bestimmten Bedingungen. |
AW: Try-finally und modalresult
OnCreate -> OnDestroy
OnShow -> OnClose
Delphi-Quellcode:
F := TMyForm.Create(x);
try F.Show; F.Close; F.Show; // peng ... F.ShowModal; F.ShowModal; // peng ... finally F.Free; end; |
AW: Try-finally und modalresult
On -> Off (SCNR^^)
|
AW: Try-finally und modalresult
Zitat:
Zitat:
Delphi-Quellcode:
unit Foo
interface function Foo_ShowModal: integer; implementation function Foo_ShowModal: integer; begin with TFoo.Create(Application) do try Result := ShowModal; finally Release; end; end; |
AW: Try-finally und modalresult
Die Standardaktion im OnClose ist nicht freigeben (caFree), sondern verstecken (caHide). Das bedeutet, dass das Fenster auch nach einem Close weiterlebt, nur eben nicht sichtbar. Wenn man da also etwas freigibt, was man im OnCreate erzeugt hat, fängt man sich einen wilden Zeiger ein, was bei künftigen Zugriffen darauf dann in einer AV endet.
|
AW: Try-finally und modalresult
Zitat:
|
AW: Try-finally und modalresult
Finally wird immer ausgeführt. Sogar das hier funktioniert:
Delphi-Quellcode:
try
exit; finally ShowMessage('Foobar'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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