2009-06-30 13 views
4

Ich habe eine App, die eine lange Reihe von Operationen ausführt, und ich versuche, eine TProgressBar zu verwenden, um zu verfolgen, was vor sich geht. Ich stelle eine Reihe von Schritten ein und rufe .StepIt auf, um den Fortschrittsbalken zu erhöhen.Wie kann ich TProgressBar stoppen zu verzögern?

Problem ist, es hält nicht sehr gut. Anstatt direkt in die richtige Position zu springen, scheint es allmählich nach oben zu gleiten. Das ist alles gut und gut, wenn es um Augenschmaus geht, aber wenn ich versuche, eine genaue Darstellung der Fortschritte meiner Routine zu bekommen, scheint es, dass es ständig hinter dem wahren Status zurückbleibt. Wie kann ich dieses "Feature" ausschalten?

Ich merke nur das passiert unter Windows Vista. Nicht sicher, ob es auch auf XP läuft oder nicht, denn wenn ich es unter XP teste, geht der Prozess viel schneller und es ist zu schnell vorbei. : P Aber das kann oder kann nicht Vista-spezifisch sein. Wie auch immer, es macht mich verrückt. Weiß jemand, wie man es repariert?

Antwort

3

Ich stieß vor einiger Zeit genau auf das gleiche Problem. Nach der Suche nach Google nach einem langen Zeit, fand ich, dass es ein Vista-spezifisches Problem ist. Es scheint so zu sein: Microsoft hat dem Fortschrittsbalken-Steuerelement in Vista (d. H. Dem sich bewegenden "Highlight") raffinierte Animationen hinzugefügt. Um die Aktualisierungen flüssiger zu machen, haben sie eine Art "Nachlaufen" im Repaint des Steuerelements implementiert - und das schraubt im Grunde genommen den gesamten Fortschrittsbalken. Eher nervig würde ich sagen, vor allem seit scheint es keine anständige Lösung zu geben.

Weitere Details finden sich die Antworten von Arvid Winkelsdorf zu this Embarcadero Discussion Forum post:

Es ist das gleiche für VB, C++ und C# irgendwie wie das Problem in der liegt Vista Zeichnung der neuen animierten Progressbars. Um eine glattere visual feedback Zeichnung ist bei der Vorwärtsbewegung verzögert.Ihre Anwendung kann nicht sicher sein, dass 100% zu einem bestimmten Zeitpunkt erreicht wird.

Durch Zurücksetzen der Position auf einen kleineren Wert wird die ProgressBar-Zeichnung gezwungen, zurückzuspringen. Keine Verzögerung in zu einer Position kleiner als die aktuelle. So haben Sie sofort fast 100% . Setzen Sie danach auf das Maximum und Sie werden genau 100% haben.

[...]

Es gibt eine ähnliche Panne bei der neuen Vista ProgressBar Styles wie PB Unterbrochen oder PB Fehlern verwenden. Wenn die Leiste immer noch bewegt (MS-Teil) und Ihre App die Farbe von SendMessage pausiert (wie in D2009) wird die Nachricht von der ProgressBar ignoriert.

6

Ich habe eine kurze, aber teilweise und unelegant Lösung, wenn Sie die progressbar gelb statt grün mit nichts ausmacht:

ProgressBar1.SmoothReverse := True; 
    ProgressBar1.State := pbsPaused; // for yellow or pbsError for red 

Oder wenn Sie nichts dagegen haben die Vista/Thema Blick zu verlieren und gehen zurück zu einem flachen blauen:

UxTheme.SetWindowTheme(ProgressBar1.Handle, ' ', ' '); 

Das eigentliche „Problem“ nach Microsoft ist, dass Sie auf „pervers“ eine ProgressBar in ein Meter versuchen, die sie behaupten, es ist nicht.

Sie können auch selbst versuchen, es zu ziehen ;-)

+2

Interessante kommentieren die Wo hat Microsoft das gesagt? –

+0

Typisch doof Microsoft. Ein Fortschrittsbalken ist genau ein ** Meter **, der den Fortschritt misst, genau wie ein Thermometer die Temperatur misst und ein Tachometer die Geschwindigkeit misst. Es sind M $, die Perverse sind. – DaveBoltman

3

Vielleicht können Sie versuchen, die Position des ProgressBar zu setzen, sondern direkt die StepIt Verfahren zu verwenden. Ich bin auf XP mit Delphi 7 hier, also kann ich es nicht testen, aber mit Blick auf den Code von TProgressBar verwendet es eine andere Nachricht (PBM_SETPOS anstelle von PBM_STEPIT). Vielleicht legt es die Position der Fortschrittsbalken ohne Animation fest.

3

Zusätzlich gibt es einige 3rd-Party-Komponenten, die bessere Progress-Bar-Implementierungen bieten, die auf Vista noch gut aussehen. Persönlich bevorzuge ich den von Raize components, der ganz gut funktioniert. Es "verzögert" nicht wie die Windows-Steuerung und funktioniert unabhängig von jeglicher Thematisierung.

Wenn Sie nicht wirklich etwas ausgefallenes wollen, können Sie immer eines selbst bauen, indem Sie ein Panel und eine Tshape verwenden, die links im Panel ausgerichtet sind. Ändern Sie die Größe der Tshape um% des Bereichs, auf dem sie festgelegt ist.

1

Ich hatte das gleiche Problem, war meine Lösung auf eine andere Steuerung in der VCL wechseln:

Ich wähle den Bereich von TTrackBar zu verwenden, um die Progression anzuzeigen. (mit deaktiviertem Schieberegler und Steuerung, um die Bereichsmarken auszublenden).

Nicht die gleiche visuelle (vor allem wenn Thema), aber es passt gut meine Notwendigkeit (keine Verzögerung).

5

Gleiches Problem unter Windows7 !!

Aber die Antwort war bereits in einer der älteren Beiträge:

Wenn tou den progressbar Schritt zurück dort machen wird keine Verzögerung !!! So implementiert ich das ..... (und Instant-Updates erhalten)

if(progress < ProgressBar.Max) 
then 
begin 
    ProgressBar.Position := progress+1; 
    ProgressBar.Position := progress; //This will set Progress backwards and give an instant update.... 
end 
else 
begin //cannot set position beyond max... 
    ProgressBar.Max  := progress + 1; 
    ProgressBar.Position := progress + 1; 
    ProgressBar.Max  := progress; //This will also set Progress backwards also so instant update........ 
end; 
0

Hier ist eine einfache Lösung: "echtes Problem"
ProgressBar.max := ProgressBar.max +1; ProgressBar.StepBy(2); ProgressBar.StepBy(-1); ProgressBar.max := ProgressBar.max -1;

Verwandte Themen