![]() |
Try Finally End verlassen bzw. abbrechen
Hallo,
ich stehe vor folgendem Problem und irgendwie auf dem Schlauch: In einem sehr einfachen Programm soll beim Klick auf einen Button etwas gemacht werden. Dazu wird der Button zunächst deaktiviert und am Ende wieder aktiviert. Wenn zwischendurch etwas nicht klappt, soll der weitere Code nicht mehr ausgeführt, der Button aber wieder aktiviert werden. Um es übersichtlich zu haben, möchte ich nicht das ganze verschachteln und - weil vermutlich nicht ![]()
Delphi-Quellcode:
verzichten. Da es sich am Code vermutlich besser erklären lässt, folgendes Beispiel:
goto
Delphi-Quellcode:
Wenn Ihr mir sagt, dass es ohne
Procedure TForm1.BtnStartClick(Sender: TObject);
Const DummySpace ='C:\$space'; Begin BtnStart.Enabled:=False; MELog.Lines.Clear; Try MELog.Lines.Append('Step 1: Allocating Memory'); MELog.Lines.Append('- creating directory "' + DummySpace + '"'); If (Not CreateDir(DummySpace)) And (Not DirectoryExists(DummySpace)) Then Begin MELog.Lines.Append(' Could not create "' + DummySpace + '".'); MELog.Lines.Append(' Error was: "' + SysErrorMessage(GetLastError) + '"'); MELog.Lines.Append(' Opreation aborted.'); // Hier muss/will ich raus. End Else MELog.Lines.Append(' success...') // Hier nur weiter, wenn Verzeichnis angelegt wurde/existiert Finally BtnStart.Enabled:=True; End; End;
Delphi-Quellcode:
nicht geht, dann soll es eben so sein. Eine andere Idee wäre auch, durch eine Division durch Null eine Exception zu produzieren. Aber auch das ist nicht kunstgerecht. Das ist bestimmt total einfach und mir zugegebener Maßen schon fast peinlich diese Frage zu stellen. Aber auch Suchworte wie "abort try finally" und dergleichen brachten mich bislang nicht weiter ...
goto
Gruß, Alex |
AW: Try Finally End verlassen bzw. abbrechen
Wenn kein weiter Code nach dem
Delphi-Quellcode:
mehr kommt, dann kannst du auch einfach mit
finally-end
Delphi-Quellcode:
raus. Auch bei
Exit
Delphi-Quellcode:
werden umschließende
Exit
Delphi-Quellcode:
-Abschnitte ausgeführt.
finally
|
AW: Try Finally End verlassen bzw. abbrechen
Obwohl, sauberer wäre es, den Code einfach in den entsprechenden then bzw. else Blöcken auszuführen:
Delphi-Quellcode:
Procedure TForm1.BtnStartClick(Sender: TObject);
Const DummySpace ='C:\$space'; Begin BtnStart.Enabled:=False; MELog.Lines.Clear; Try MELog.Lines.Append('Step 1: Allocating Memory'); MELog.Lines.Append('- creating directory "' + DummySpace + '"'); If (Not CreateDir(DummySpace)) And (Not DirectoryExists(DummySpace)) Then Begin MELog.Lines.Append(' Could not create "' + DummySpace + '".'); MELog.Lines.Append(' Error was: "' + SysErrorMessage(GetLastError) + '"'); MELog.Lines.Append(' Opreation aborted.'); // Hier muss/will ich raus. End Else begin // <<<<< MELog.Lines.Append(' success...') // Hier nur weiter, wenn Verzeichnis angelegt wurde/existiert end; // <<<<< Finally BtnStart.Enabled:=True; End; End; |
AW: Try Finally End verlassen bzw. abbrechen
Du könntest natürlich auch eine Variable setzen und danach entsprechend darauf reagieren.
Oder wie wäre es wemm du den Code in entsprechende Funktionen aufteilst? :stupid: PS: "C:\$space" ... also im Grunde mag ich es absolut nicht, wenn irgenwelche Programme irgendwo einfach so rumschreiben. Wie wäre es mit dem Temp-Verzeichnis? |
AW: Try Finally End verlassen bzw. abbrechen
Hier gab es mal einige Diskussionen zu try finally:
![]() Wichtig zu wissen ist (wie Uwe schrieb), dass Exit in den finally-Block springt aber mögliche nachfolgende Anweisungen dann nichtmehr ausgeführt werden sondern die Methode verlassen wird. |
AW: Try Finally End verlassen bzw. abbrechen
Noch geschickter wäre es doch dafür ein Konstrukt zu schreiben, dass dann wie folgt benutzt werden kann:
Delphi-Quellcode:
Der TaskRunner würde per Event bei jedem Step/SubStep benachrichtigen, Exceptions fangen/protokollieren/weiterreichen (wenn gewünscht), die einzelnen Steps z.B. in einem Thread ausführen, etc.
LStep := TaskRunner.AddStep;
LStep.Caption := 'Allocating Memory'; LStep.Add( TSubStepDirectory.Create( 'C:\$space' ) ); LStep.Add( ... ); ... LStep := TaskRunner.AddStep; ... TaskRunner.Run; |
AW: Try Finally End verlassen bzw. abbrechen
Zitat:
Exit ist zum Verlassen da, aber nachfolgende umgebende Finally-Blöcke werden dennoch ordnungsgemäß abgearbeitet, denn dafür sind die ja da. Nutzloses Wissen: Wenn Exit in einer einfachen Prodedur aufgerufen wird, dann ist das ein quasi Goto zum Ende der Prozedur. Innerhalb von Try-Finally/Except, auch impliziten Try-Finally vom Delphi, welche z.B. zum Aufräumen von lokalen String-Variablen und Interfaces eingebaut wird, wird das Exit als stille Exception implementiert, welche allerdigns von Except-Blöcken automatisch "ignoriert" wird. |
AW: Try Finally End verlassen bzw. abbrechen
Zitat:
Ich schreibe übrigens auch nicht sinnlos in "C:\$space" rum. Das Programm ist eine Kreation ausschließlich für mich. Es erzeugt mehrere Dateien und trägt diese in
Delphi-Quellcode:
ein. Ein anschließendes Defragmentieren schiebt sie dann an den Anfang der Platte, so dass ich dort später dann pagefile.sys platzieren kann. Im Moment mache ich das von Hand; und das nervt sehr.
C:\Windows\Prefetch\Layout.ini
Es ist quick und dirty. Allerdings für viele Rechner und ich muss sehen, wann Fehler passieren und welche Fehler das sind. Das macht mehr Arbeit als das, was das Programm eigentlich machen soll. So. Und jetzt muss ich bloß noch suchen, wie ich Windows oder dem Programm beibringe, dass beim Start gleich die Abfrage nach Admin-Rechten kommt für Schreibrechte in "C:\Windows\Prefetch". Aber das bekomme ich auch bald raus. Wie gesagt: tausend Dank. Alex P.S. Wo muss ich jetzt vermerken, dass die eigentliche Frage des Themas gelöst ist? |
AW: Try Finally End verlassen bzw. abbrechen
zum PS: Einfach schweigen reicht ... ;-)
|
AW: Try Finally End verlassen bzw. abbrechen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 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