Du solltest so ein Konstrukt niemals direkt aufrufen, weil du dich dann einfach nur abhängig machst und schon zu schnell konkret werden musst.
Besser ist es, die konkrete Aktion zu verstecken und dann aufzurufen.
Delphi-Quellcode:
type
IWorkerService =
interface
[
{GUID}]
// Macht irgendwas und ruft am Ende den callback auf
procedure DoSomething( callback : TProc<
Exception> );
end;
In der Form wird das Interface dann wie folgt verwendet
Delphi-Quellcode:
procedure TMyForm.ButtonSomethingClick(Sender: TObject);
begin
// Vor der Ausführung
ButtonSomething.Enabled := False;
// Ausführung starten
FWorkerService.DoSomething(
procedure( AException:
Exception )
begin
// nach der Ausführung
ButtonSomething.Enabled := True;
end;
end;
So jetzt bauen wir uns mal einen konkreten Service, der auf ganz billige Art und Weise diese 2,5 Sekunden wartet:
Delphi-Quellcode:
TSimpleService =
class( TInterfacedObject, IWorkerService )
procedure DoSomething( callback : TProc<
Exception> );
end;
procedure TSimpleService.DoSomething( callback : TProc<
Exception> );
var
LStart : TDateTime;
begin
LStart := Now;
while MillisecondsBetween( LNow, LThen ) < 2500
do
begin
Sleep(10);
Application.ProcessMessages;
// völlig egal erstmal, wir wollen Ergebnisse sehen
end;
callback(
nil );
end;
Nun sehen wir schon die ersten Erfolge, der Button ist für 2,5 Sekunden ausser Gefecht gesetzt.
Jetzt setzen wir uns daran, dass Geraffel in einen Thread zu packen, was jetzt völlig losgelöst von der Oberfläche erfolgen kann.