AW: "Unendlicher Progressbar"
Sowohl die TProgressBar im Marquee-Mode als auch der TActivityInidicator arbeiten timer-basiert. Simples Invalidate/Update/Repaint funktioniert da leider nicht.
Ich plädiere für ein simples Bitte warten... Fenster oder ein Splash-Form ohne viel Drumherum. |
AW: "Unendlicher Progressbar"
Ich mache so etwas hiermit:
http://www.delphifaq.com/faq/f382.shtml |
AW: "Unendlicher Progressbar"
Zitat:
|
AW: "Unendlicher Progressbar"
Man kann auf dem Splash-Screen ja auch den aktuellen Bearbeitungsfortschritt als Text in einem Label darstellen. Das reagiert dann in der Regel auch auf ein Refresh.
|
AW: "Unendlicher Progressbar"
Ich glaube das letzte ist der richtige Ansatz, da das Label ja sofort wenn gewünscht neuzeichnet könnte man da mit
Bitte warten . Bitte warten .. Bitte warten ... Bitte warten . Bitte warten .. Bitte warten ... dessen Caption per Thread aktualisieren? Ciao Stefan |
AW: "Unendlicher Progressbar"
Ja. Und wenn du informativere Infos ausgibst, wird es noch schöner:
. . . Labels erzeugt Daten der Labels geladen Edits erzeugt Daten der Edits geladen Grids erzeugt Daten der Grids geladen . . . etc. |
AW: "Unendlicher Progressbar"
Als Beispiel könnte der Splash-Screen der IDE dienen, die ja auch im unteren Bereich ihre Aktivitäten mitteilt.
|
AW: "Unendlicher Progressbar"
Ich habe das nun versucht, umzusetzen, aber irgendwie wird der Thread (und dessen Labelaktualisierung) vom HauptThread und der dort stattfindenden Control-Erzeugung blockiert...
Erst wenn im Mainthread alles abgelaufen ist, wird das Label im Thread aktualisiert! Irgendwas läuft da schief! Ciao Stefan |
AW: "Unendlicher Progressbar"
Zeig Mal...:P
|
AW: "Unendlicher Progressbar"
Hier der Thread:
Delphi-Quellcode:
Den starte ich jetzt testweise bereits im MainForm.Create.
unit ThreadProgress;
interface uses Classes, Sysutils, VCL.Dialogs, VCL.Forms, VCL.ComCtrls, VCL.ExtCtrls, VCL.Controls; var ShowProgress: boolean; type TProgressThread = class(TThread) constructor Create; destructor Destroy; override; private SplashForm: TForm; ProgressRand: TPanel; sb, sh: integer; step: integer; protected procedure Execute(); override; public end; var Thread_Progress: TProgressThread; implementation constructor TProgressThread.Create; begin FreeOnTerminate := True; // Suspended starten inherited Create(True); ShowProgress := True; SplashForm := TForm.Create(nil); sb := 200; sh := 50; step := 0; SplashForm.Width := sb; SplashForm.Height := sh; SplashForm.BorderStyle := bsNone; ProgressRand := TPanel.Create(SplashForm); ProgressRand.Margins.Left := 5; ProgressRand.Margins.Top := 5; ProgressRand.Margins.Right := 5; ProgressRand.Margins.Bottom := 5; ProgressRand.AlignWithMargins := True; ProgressRand.Parent := SplashForm; ProgressRand.Caption := 'Bitte warten'; ProgressRand.ShowCaption := True; ProgressRand.Align := alClient; ProgressRand.BorderStyle := bsSingle; ProgressRand.BevelOuter := bvNone; ProgressRand.StyleElements := []; SplashForm.Position := poMainFormCenter; SplashForm.Visible := True; SplashForm.BringToFront; end; destructor TProgressThread.Destroy; begin // globale Variable rücksetzen Thread_Progress := nil; inherited; end; procedure TProgressThread.Execute; begin while ShowProgress do begin SplashForm.BringToFront; inc(step); if step = 5 then step := 0; ProgressRand.Caption := 'Bitte warten' + StringOfChar('.', step); Application.ProcessMessages; sleep(500); end; end; end.
Delphi-Quellcode:
Das Fensterchen erscheint und die Caption läuft wie gewünscht.Thread_Progress := TProgressThread.Create; Thread_Progress.Start; Wird nun im Hauptprogramm der zeitintensive Erzeugungsteil gestartet, bleibt der Splashscreen stehen! Was habe ich übersehen? Ciao Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz