Cześć, jestem ciekawy, jak rozwiązujecie ten aspekt. Forma z progress barem. Krótko mówiąc takie ProgressForm. Jakie wymagania? Forma ma być zawsze na wierzchu(aplikacji). Jak się aplikacje minimalizuje, to forma ma być niewidoczna. Jak się aplikacje przywraca, to forma ma być znowu widoczna(nie ma to związku z aktywnością aplikacji, bo aplikacja może być nieaktywna, ale widoczna).
Ja próbuję na różne sposoby i mam problemy z osiągnięciem tych założeń. Albo forma nie pokazuje się po maksymalizacji, albo nie chowa po minimalizacji, albo po maksymalizacji pokazuje się po jakimś czasie, ale też nie zawsze, albo pokazuje się pod aplikacją.
Ja mam to rozwiązane tak, że jak mam jakąś operację w pętli, to wywołuję procedurę w stylu ShowProgress, do której przekazuje procent wykonania operacji itp. Ale czasami operacja nie jest w pętli(np. procedura składowana SQL) i wtedy pokazuje mi się okienko bez progressBara, sama informacja: "Czekaj, operacja trwa".
Na pewno jakoś kosntruujecie takie okna i moje pytanie: jak? Czytałem o tym w necie, ale za wiele informacji nie znalazłem.
Mój kod, który nie jest dobry wygląda tak:
procedure ShowProgress(Status: string; PercentDone: byte = 0; HideGauge: boolean = false);
begin
if Application.Active then
begin
progressForm.Show;
SetWindowPos(ProgressForm.Handle, HWND_TOP, ProgressForm.Left, ProgressForm.Top,
0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOOWNERZORDER);
end else
begin
ProgressForm.Hide;
ProgressForm.sLabel.Caption:=Status;
exit;
end;
if HideGauge then
begin
ProgressForm.GroupBox1.Visible:=false;
ProgressForm.Panel1.Height:=20;
ProgressForm.Height:=30; //21
end else
begin
ProgressForm.GroupBox1.Visible:=true;
ProgressForm.Panel1.Height:=61;
ProgressForm.Height:=72;
end;
ProgressForm.sLabel.Caption:=Status;
if percentDone>100 then percentDone:=100;
ProgressForm.Gauge.Progress:=PercentDone;
application.ProcessMessages;
end;
procedure HideProgress;
begin
if ProgressForm<>nil then
begin
ProgressForm.Hide;
ProgressForm.sLabel.Caption:='';
progressForm.Gauge.Progress:=0;
end;
end;
{ TProgressForm }
procedure TProgressForm.FormShow(Sender: TObject);
begin
timer.Enabled:=true;
end;
procedure TProgressForm.TimerTimer(Sender: TObject);
begin
timer.Enabled:=false;
SetWindowPos(Handle, HWND_TOP, Left, Top,
0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOOWNERZORDER);
end;
initialization
ProgressForm:=TProgressForm.Create(nil);
finalization
ProgressForm.Free;