Ich weis nicht ob das evtl. etwas "schmutzig" ist...
...das aufgerufene modale fenster hat eine property für eine "Arbeits-Methode", vergleichbar mit einem Event-Handler.
Das "Bitte warten" Fenster mit Progressbar ist wie folgt ausgestattet:
Delphi-Quellcode:
type
TWorkerMethode = procedure (Sender : TObject; AProgressBar : TProgressBar) of object;
TFormWorkProgress = class(TForm)
ProgressBar1: TProgressBar;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
FWorkerMethode : TWorkerMethode;
public
{ Public-Deklarationen }
property WorkerMethode : TWorkerMethode read FWorkerMethode write FWorkerMethode;
end;
var
FormWorkProgress: TFormWorkProgress;
implementation
{$R *.dfm}
procedure TFormWorkProgress.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
if assigned(FWorkerMethode) then
FWorkerMethode(self, ProgressBar1);
end;
Das Hauptformular mit der Arbeits-Procedure so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
FormWorkProgress : TFormWorkProgress;
begin
FormWorkProgress := TFormWorkProgress.Create(Application);
try
FormWorkProgress.WorkerMethode := Worker;
FormWorkProgress.ShowModal;
finally
FormWorkProgress.Free;
end;
end;
procedure TForm1.Worker(Sender : TObject; AProgressBar : TProgressBar);
var
i : Integer;
begin
for i := 1 to 100 do
begin
AProgressBar.Position := i;
Sleep(100);
Application.ProcessMessages;
end;
(Sender as TForm).Close;
end;
Nur ganz grob... etwas Feintunig ist da noch nötig... das modale Fenster ist etwas blockiert. Evtl. das Close aus dem Timer raus (kann ja der Worker aufrufen, er hat ja den Sender)
€: Etwas angepasst, jetzt stellt sich die App nicht mehr Tod.