Hi,
kann man programmatisch prüfen, ob eine Funktion innerhalb von finally (oder Except) aufgerufen wird?
Der Sinn dahinter ist, dass ich gerne ein Funktionspaar definieren würde, deren Gegenfunktion auf jeden Fall ausgeführt werden muss. Die zweite Funktion muss daher für den Fall einer
Exception im finally Block stehen.
THX
Vielleicht kannst du dir Delphis Arme-Leute-
RAII aka Interfaces
zunutze machen. Sowas in der Art:
Delphi-Quellcode:
interface
type
ICursorGuard = interface
end;
function GuardCursor(NewCursor: TCursor = crHourGlass): ICursorGuard;
implementation
type
TCursorGuard = class(TInterfacedObject, ICursorGuard)
private
FOldCursor: TCursor;
public
constructor Create(NewCursor: TCursor);
destructor Destroy; override;
end;
{ TCursorGuard }
constructor TCursorGuard.Create(NewCursor: TCursor);
begin
inherited Create;
FOldCursor := Screen.Cursor;
Screen.Cursor := NewCursor;
end;
destructor TCursorGuard.Destroy;
begin
Screen.Cursor := FOldCursor;
inherited Destroy;
end;
function GuardCursor(NewCursor: TCursor = crHourGlass): ICursorGuard;
begin
Result := TCursorGuard.Create(NewCursor);
end;
Das benutzt man dann so:
Delphi-Quellcode:
procedure Test;
var
Guard: ICursorGuard;
begin
Guard := GuardCursor; // <= Hier wird die Sanduhr angezeigt.
// Was länger dauerndes...
end; // <= Hier wird der alte Cursor wiederhergestellt.
Wer hier das Aufräumen abklemmt, muss dass eigentlich schon mit Absicht so machen.