Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Fr 16.01.04 01:02 
EXIT in einer Prozedur "abfangen"

Es kommt schon mal vor, daß man am Anfang einer Prozedur eine Aktion ausführt, die man am Ende der Prozedur wieder rückgängig machen muß, z.B. Eieruhr (crHourGlass) als Cursor auswählen. Am Ende der Prozedur muß der Cursor wieder auf crDefault gesetzt werden. Problematisch wird es allerdings, wenn man mitten in der Prozedur die Prozedur mit Exit verlassen will/muß. Hier ein Beispiel mit Cursor, wobei das natürlich auch auf andere Bereiche anwendbar ist:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Cursor := crHourGlass;
  if not FileExists('c:\datei.dat'then Exit;

  //Hier Datei laden und irgendwas machen

  Cursor := crDefault;
end;


Natürlich kann man das nicht so machen, denn hier bleibt die Eieruhr als Cursor. Will man also mitten drin die Prozedur verlassen, dann muß man alle Einstellungen, die man am Ende der Prozedur ausführen möchte, extra wegen des Exits auch mitten im Block ausführen. Das könnte so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
...
  if not FileExists('c:\datei.dat'then
  begin
    Cursor := crDefault;
    Exit;
  end;
...


Exit verlangt also hin und wieder eine doppelte Pflege. Wenn es nur ein Cursor ist, dann ist es nicht tragisch. Wenn man aber einige Exits in der Prozedur hat, dann wird diese Art ein wenig lästig.

Besser ist die try..finally..end Variante. Die ist nicht nur für den Ressourcenschutz gut, sondern sorgt dafür, daß auf jeden Fall immer der finally Teil ausgeführt wird. Da kann Exit hundert mal die Prozedur verlassen, das macht sie aber nicht ohne vorher den finally Teil durchzulaufen. Der obere Code könnte also auch so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Cursor := crHourGlass;
  try
    if not FileExists('c:\datei.dat'then Exit;

    //Hier Datei laden und irgendwas machen

  finally
    Cursor := crDefault;
  end;
end;


Ich glaube, daß das ein wenig eleganter ist.

Also, try..finally kann kann man immer dann einsetzten, wenn irgendwas auf jeden Fall ausgeführt werden soll. Wird der Block zwischen try und finally verlassen, dann wird auf jeden Fall noch der Teil zwischen finally und end ausgeführt. Hier im Beispiel wird der Cursor immer wieder Default gesetzt; egal ob die Prozedur durchlaufen wird oder vorher verlassen wird.
Moderiert von user profile iconjasocul: Beitrag geprüft am 08.06.2006

_________________
Popov