Hallo,
ich habe nun also in den sauren Apfel gebissen und die Aufgaben in einen Thread ausgelagert (bzw. das werde ich alles nach und nach machen).
Mein Warten-Formular und der Thread dazu steht und funktioniert. Meine Wrapper-Klasse wollte ich dennoch behalten. So ergibt sich der unten aufgeführte Code.
Ich habe also eine Wrapper-Klasse, die die Warten-Form anzeigt und den Thread startet. Zuvor wird der Wrapper-Klasse gesagt, welche Aktion der Thread zu erledigen hat. Der Thread startet und führt die für die Aktion hinterlegte Berechnung durch. Danach gibt sich die Klasse über den Thread wieder frei.
Wer's haben mag, darf es gerne nutzen. Schaut euch bitte meinen Code an und sagt, was positiv und was negativ ist. Danke..! (Achso: Bisher gab's keine Probleme bez.
VCL, AVs etc.)
Anwendung der Wrapper-Klasse (Darstellen eines Warten-Bildschirms)
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
wu: TWaitUtils;
begin
//Erstellt ein WaitUtil-Objekt, zeigt das Fenster an
wu:=TWaitUtils.Create;
//Erstellt einen Thread, sagt ihm was zu tun ist und lässt den Dingen seinen lauf
wu.InitWaitThread(taStoreAttachment);
//Freigeben nicht nötig, geschieht automatisch (laut FastMM4 alles OK).
end;
Und hier das, was wie im Hintergrund passiert (Auszug)
Delphi-Quellcode:
type
TThreadActions = (taStoreAttachment, taLoadAttachment);
{************** TWaitThread ***************}
procedure TWaitThread.Execute;
begin
case (Action) of
taStoreAttachment:
begin
StoreAttachment;
end;
taLoadAttachment:
begin
end;
end;
end;
{************** TWaitUtils ***************}
constructor TWaitUtils.Create;
begin
InUse:=False;
WartenForm:=TfrmWarten.Create(nil);
Thread:=TWaitThread.Create(True);
Thread.WaitFormular:=WartenForm;
Thread.FreeOnTerminate:=True;
Thread.WaitUtilObject:=Self;
WorkerThread:=Thread;
WorkerThread.OnTerminate:=ThreadTerminate;
end;
procedure TWaitUtils.InitWaitThread(ta: TThreadActions);
begin
InUse:=True;
ShowWaitForm;
//Welche Aktion soll der Thread ausüben?
Thread.Action:=ta;
//Thread ins Rollen bringen
Thread.Resume;
end;
procedure TWaitUtils.ThreadTerminate(Sender: TObject);
begin
InUse:=False;
with (Sender as TWaitThread).WaitFormular do
begin
Close;
end;
//Das Warten-Formular freigeben
DestroyWaitForm;
//Das WaitUtilObjekt wieder freigeben
Thread.WaitUtilObject.Free;
end;
Ich häng's hier nochmal an, vielleicht mögt ihr es nutzen oder mal "Korrekturlesen"
Danke!