![]() |
ProgressBar unnötig animiert
Moin Leute :hi:
Ich arbeite mit XE8 und wunder mich, wieso mein ProgressBar nicht bis zum Ende läuft. Ich blende ihn ein und dann wieder aus. Er läuft teilweise nur bis 20% voll. Wenn die Aktion insgesamt länger dauert, füllt er sich auch weiter voll. Die 100% erreicht er NIE. Nach ein paar Tests habe ich den Grund gefunden:
Delphi-Quellcode:
ProgressBar.Max := TotalFileSize;
ProgressBar.Position := 0; ShowProgressBar; Application.ProcessMessages; ProgressBar.Position := TotalFileSize; Bei diesem Code sehe ich, wie der Balken hoch läuft und nicht gleich 100% anzeigt. Wie kann ich die Animation abschalten? |
AW: ProgressBar unnötig animiert
Application.ProcessMessages; ganz ans Ende setzen?
Wobei das aber die Animation des Füllens vermutlich trotzdem anzeigt. |
AW: ProgressBar unnötig animiert
Der Progressbar ist ja eines der Common-Controls, für die Windows selbst zuständig ist. Solange Du nicht das Windows-Basic-Theme aktiv hast, ist der Balken systemseitig animiert.
Mit einem halbseidenen Kniff kannst Du die Animation abwürgen: Sie funktioniert nämlich nur dann, wenn der Fortschritt sich erhöht, nicht aber, wenn er zurückgedreht wird. Du könntest den Balken also in zwei Schritten zuerst auf "AktuellerFortSchritt+1" und dann direkt auf "AktuellerFortschritt" setzen. Damit hebelst Du die Animation aus. Schön ist was anderes, aber das führt wenigstens vorläufig zum Ziel. (Bei dem +1 musst Du natürlich das Maximum Deines Balkens berücksichtigen, sonst gibt das eine hässliche Fehlermeldung...) |
AW: ProgressBar unnötig animiert
Der Punkt ist, dass eine ProgressBar laut GUI Guidelines nur angezeigt werden soll, wenn es auch Sinn macht, sprich eine Aktion auch wirklich länger dauert. Und dann kommt die ProgressBar auch zumindest fast bis an das Ende.
Austricksen lässt sich das leicht, auch ohne das zusätzliche Setzen eines Steps zu viel und wieder zurück. Du setzt einfach Position fest auf 100 und berechnest Max über den Prozentsatz. Sprich ein einfacher Dreisatz, so dass Max bei 1% dann entsprechend 10000 ist und bei 100% ist Max dann 100. Du brauchst dann nur einmal Max setzen statt zweimal Position. Zudem funktioniert das auch beim letzten Step, während du Position da gar nicht eins höher setzen kannst. |
AW: ProgressBar unnötig animiert
Durch das Setzen von Max und belassen von 100 auf Position verhält es sich genauso, als ob ich Position zweimal setze. Jetzt läuft der Balken bis 50% und nicht weiter. Vielleicht sollte ich den Balken erst nach zwei Sekunden einblenden und gut.
|
AW: ProgressBar unnötig animiert
Zitat:
|
AW: ProgressBar unnötig animiert
Gibt nen kleinen Trick, der die Animation verhindert - einfach eine Position weiter und dann zurück.
Edit: doh, ganz den Kommentar von Daniel übersehen, der erwähnte das ja schon :oops: Entweder mit nem kleinen Helper, oder per Interposer Klasse oder irgendwie anders.
Delphi-Quellcode:
type
TProgressBarHelper = class helper for TProgressBar private function GetPosition: Integer; procedure SetPosition(const Value: Integer); public procedure StepIt; property Position: Integer read GetPosition write SetPosition; end; { TProgressBarHelper } function TProgressBarHelper.GetPosition: Integer; begin Result := inherited Position; end; procedure TProgressBarHelper.SetPosition(const Value: Integer); begin if Value <> inherited Position then begin if Value >= Max then begin Max := Max + 1; inherited Position := Max; Max := Max - 1; end else begin inherited Position := Value + 1; inherited Position := Value; end; end; end; procedure TProgressBarHelper.StepIt; begin Position := Position + Step; end; |
AW: ProgressBar unnötig animiert
Zitat:
|
AW: ProgressBar unnötig animiert
So, ich habe es so umgesetzt, dass er erst nach 1,5 Sekunden den ProgressBar einblendet. Zusätzlich setze ich die Position, bevor ich die Arbeit ausführe, da der Balken eh etwas braucht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz