AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Try Finally End verlassen bzw. abbrechen
Thema durchsuchen
Ansicht
Themen-Optionen

Try Finally End verlassen bzw. abbrechen

Ein Thema von Schwedenbitter · begonnen am 30. Mai 2014 · letzter Beitrag vom 31. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2      
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 10:45
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 lege artis - auf ein goto verzichten. Da es sich am Code vermutlich besser erklären lässt, folgendes Beispiel:
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 MELog.Lines.Append(' success...')

      // Hier nur weiter, wenn Verzeichnis angelegt wurde/existiert

   Finally
      BtnStart.Enabled:=True;
   End;
End;
Wenn Ihr mir sagt, dass es ohne goto 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 ...

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#2

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 10:47
Wenn kein weiter Code nach dem finally-end mehr kommt, dann kannst du auch einfach mit Exit raus. Auch bei Exit werden umschließende finally -Abschnitte ausgeführt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#3

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 10:50
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#4

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 11:18
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?


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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Mai 2014 um 11:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 11:19
Hier gab es mal einige Diskussionen zu try finally: http://www.delphipraxis.net/160164-f...ewuenscht.html

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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 11:43
Noch geschickter wäre es doch dafür ein Konstrukt zu schreiben, dass dann wie folgt benutzt werden kann:
Delphi-Quellcode:
LStep := TaskRunner.AddStep;
LStep.Caption := 'Allocating Memory';
LStep.Add( TSubStepDirectory.Create( 'C:\$space' ) );
LStep.Add( ... );
...

LStep := TaskRunner.AddStep;
...

TaskRunner.Run;
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#7

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 12:20
Wichtig zu wissen ist ...
Und das ist auch richtig so.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Mai 2014 um 12:25 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 13:01
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.
Wieso nutzlos? Das ist genau die Antwort, die ich gesucht habe. Tausend Dank dafür.

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 C:\Windows\Prefetch\Layout.ini 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.
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?
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 14:22
zum PS: Einfach schweigen reicht ...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Try Finally End verlassen bzw. abbrechen

  Alt 30. Mai 2014, 14:24
zum PS: Einfach schweigen reicht ...
Besser ist aber auf jeden Fall eine Rückmeldung.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:08 Uhr.
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