AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ProgressBar unnötig animiert

Ein Thema von MacGuyver · begonnen am 9. Nov 2017 · letzter Beitrag vom 9. Nov 2017
Antwort Antwort
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
295 Beiträge
 
Turbo Delphi für Win32
 
#1

ProgressBar unnötig animiert

  Alt 9. Nov 2017, 09:53
Moin Leute

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?
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 10:02
Application.ProcessMessages; ganz ans Ende setzen?
Wobei das aber die Animation des Füllens vermutlich trotzdem anzeigt.

Geändert von bra ( 9. Nov 2017 um 10:11 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 10:38
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...)
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 11:36
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
295 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 12:34
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.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 12:38
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 12:49
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

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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 9. Nov 2017 um 12:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 13:12
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
295 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: ProgressBar unnötig animiert

  Alt 9. Nov 2017, 13:29
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.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 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