Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Try-finally und modalresult (https://www.delphipraxis.net/185575-try-finally-und-modalresult.html)

idefix2 21. Jun 2015 13:07

Try-finally und modalresult
 
Ich bin mir nicht ganz sicher, wie ich hier richtig vorgehe, bzw. ob ich das so machen kann:

Delphi-Quellcode:
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;
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?

DeddyH 21. Jun 2015 13:20

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.

idefix2 21. Jun 2015 13:34

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.

himitsu 21. Jun 2015 14:06

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.

Dejan Vu 21. Jun 2015 14:10

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.

idefix2 21. Jun 2015 18:06

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.

Rollo62 23. Jun 2015 09:36

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

Perlsau 23. Jun 2015 14:02

AW: Try-finally und modalresult
 
Zitat aus der Online-Hilfe: Der Standardwert von ModalResult ist mrNone. Wenn Sie der Eigenschaft einen anderen Wert zuweisen, wird das Formular geschlossen, und der Wert wird zum Rückgabewert des ShowModal-Funktionsaufrufs, mit dem das Formular angezeigt wird.

mm1256 23. Jun 2015 14:21

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.

Sir Rufo 23. Jun 2015 14:36

AW: Try-finally und modalresult
 
Was man im
Delphi-Quellcode:
OnCreate
erzeugt und über die Lifetime der Form-Instanz benötigt, sollte man tunlichst im
Delphi-Quellcode:
OnDestroy
aufräumen.

Alle anderen Zeitpunkte/Events funktionieren nur unter bestimmten Bedingungen.


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