![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 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