Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ProgressBar unnötig animiert (https://www.delphipraxis.net/194324-progressbar-unnoetig-animiert.html)

MacGuyver 9. Nov 2017 08:53

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?

bra 9. Nov 2017 09:02

AW: ProgressBar unnötig animiert
 
Application.ProcessMessages; ganz ans Ende setzen?
Wobei das aber die Animation des Füllens vermutlich trotzdem anzeigt.

Daniel 9. Nov 2017 09:38

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...)

jaenicke 9. Nov 2017 10:36

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.

MacGuyver 9. Nov 2017 11:34

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.

himitsu 9. Nov 2017 11:38

AW: ProgressBar unnötig animiert
 
Zitat:

Zitat von jaenicke (Beitrag 1385773)
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.

Ach darum seh ich beim Kopieren einer 2 Byte-Datei 15 Sekunden lang eine animierte Progressbar im Explorer :roll:

Stevie 9. Nov 2017 11:49

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;

jaenicke 9. Nov 2017 12:12

AW: ProgressBar unnötig animiert
 
Zitat:

Zitat von MacGuyver (Beitrag 1385783)
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.

Wir benutzen diesen Trick im Büro und dort läuft die ProgressBar ganz exakt von links nach rechts komplett durch.

MacGuyver 9. Nov 2017 12:29

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 05:17 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