2009-06-30 5 views
4

J'ai une application qui exécute un long ensemble d'opérations, et j'essaie d'utiliser un TProgressBar pour suivre ce qui se passe. Je définis un certain nombre d'étapes et appelle .StepIt pour incrémenter la barre de progression.Comment faire pour que TProgressBar arrête de ralentir?

Le problème est qu'il ne fonctionne pas très bien. Au lieu de sauter directement à la position correcte, il semble vouloir glisser progressivement vers lui. C'est très bien si c'est le cas, mais quand j'essaie d'obtenir une représentation précise des progrès de ma routine, cela semble être constamment à la traîne derrière le vrai statut. Comment puis-je désactiver cette "fonctionnalité"? Je remarque seulement que cela se produit sous Windows Vista. Je ne sais pas si ça marche aussi sous XP ou pas, parce que quand je le teste sur XP, le processus va beaucoup plus vite et c'est fini trop vite. : P Mais cela peut ou non être spécifique à Vista. De toute façon, ça me rend fou. Est-ce que quelqu'un sait comment le réparer?

Répondre

3

J'ai rencontré exactement le même problème il y a un certain temps. Après avoir cherché Google pour un temps long, j'ai trouvé que c'est un problème spécifique à Vista. Cela semble se résumer à ceci: Microsoft a ajouté des animations fantaisistes au contrôle de la barre de progression dans Vista (c'est-à-dire le 'highlight' en mouvement). Pour rendre les mises à jour plus fluides, ils ont mis en place une sorte de «retard» dans le repeindre de la commande --- et cela visuellement tout le contrôle de la barre de progression. Plutôt ennuyeux, je dirais, surtout depuis il ne semble pas y avoir une solution décente.

Voir pour plus de détails les réponses par Arvid Winkelsdorf à this Embarcadero Discussion Forum post:

Il est le même pour VB, C++ et C# en quelque sorte que le problème réside dans le dessin Vista des nouveaux animés ProgressBars. Pour obtenir un dessin visuel plus lisse rétroaction est retardé lors de l'avancement.Votre application ne peut pas être sûre que 100% sera atteint à un moment donné.

En redéfinissant la position sur , le dessin ProgressBar est forcé de revenir en arrière. Pas de retard dans se rendre à une position plus petite que le courant . Donc, vous aurez presque 100% immédiatement. Ensuite, réglez sur maximum et vous aurez exactement 100%.

[...]

Il y a un petit problème similaire lorsque vous utilisez les nouveaux Vista Styles ProgressBar comme PB ou erreur PB Paused. Si la barre est toujours en mouvement (partie MS) et que votre application définit la couleur pour mettre en pause par SendMessage (comme dans D2009), le message sera ignoré par la barre de progression .

6

J'ai une solution rapide, mais partielle et inélégante, si vous ne me dérange pas d'avoir la barre de progression jaune au lieu de vert:

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

Ou si vous ne me dérange pas de perdre le look vista/thème et aller Retour à un bleu plat un:

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

Le « problème » réel selon Microsoft est que vous essayez de « pervertir » un ProgressBar dans un appareil de mesure qui, selon eux, il n'est pas.

Vous pouvez également essayer de dessiner vous-même ;-) Peut-être

+2

Commentaire intéressant sur le "vrai problème". Où Microsoft a-t-il dit cela? –

+0

Typique stupide Microsoft. Une barre de progression est exactement un ** mètre ** qui mesure la progression, tout comme un thermomètre mesure la température et un compteur de vitesse mesure la vitesse. C'est M $ qui sont les pervers. – DaveBoltman

3

vous pouvez tenter de régler directement la position de la barre de progression au lieu d'utiliser la procédure de StepIt. Je suis sur XP avec Delphi 7 ici, donc je ne peux pas le tester, mais en regardant le code de TProgressBar, il utilise un message différent (PBM_SETPOS au lieu de PBM_STEPIT). Alors peut-être qu'il définit la position de la barre de progression sans une animation.

3

En outre, il existe plusieurs composants tiers qui fournissent de meilleures implémentations de la barre de progression qui rendent encore plus agréable sous Vista. Personnellement, je préfère celui de Raize components qui fonctionne plutôt bien. Il ne "traîne" pas comme le contrôle des fenêtres et fonctionne indépendamment de toute thématique.

Si vous ne voulez pas vraiment quelque chose de fantaisie, alors vous pouvez toujours en construire un vous-même en utilisant un panneau et un tshape aligné à gauche dans le panneau. Redimensionnez le tshape pour qu'il soit un% du panneau sur lequel il est placé.

1

J'ai eu le même problème, ma solution était de passer à une autre commande disponible dans le VCL:

Je choisis d'utiliser la gamme de TTrackBar pour afficher la progression. (avec le curseur désactivé et le contrôle redimensionné pour masquer les repères).

Pas le même visuel (en particulier s'il s'agit d'un thème), mais il correspond bien à mon besoin (pas de décalage).

5

Même problème sous Windows7 !!

Mais la réponse était déjà dans l'un des messages plus anciens:

Si l'étape faire Tou progressbar en arrière il n'y aura pas de retard !!! Je mis en œuvre cette ..... (et obtenir des mises à jour instantanées)

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

Voici une solution simple:
ProgressBar.max := ProgressBar.max +1; ProgressBar.StepBy(2); ProgressBar.StepBy(-1); ProgressBar.max := ProgressBar.max -1;