Bonjour à tous !
En général, il est préférable de déporter les tâches longues dans des threads secondaires. Ce n'est cependant pas toujours possible.
Il arrive également que certaines opérations d'affichage requièrent un travail conséquent ou tout simplement que vous installiez votre application sur une machine relativement lente en comparaison de celle de développement et que ce qui prenait une fraction de seconde en prenne plusieurs par la suite (c'était mon cas avec des tablettes d'entrée de gamme).
Comment informer l'utilisateur "impatient" qu'une tâche est en cours ?
Pas de problème si elle est réalisée dans un thread secondaire. Un TActivityIndicator (introduit dans Delphi 10 Seattle) fera parfaitement l'affaire.
Mais si elle est exécutée dans la tâches principale, l'application semble figée, y compris évidemment le TActivityIndicator.
C'est ici qu'entre en jeu la petite unité que je vous propose aujourd'hui : un comportement comparable au TActivityIndicator mais exécuté dans son propre thread, un TActivityIndicatorThread.
La fenêtre est créée et gérée par API (la VCL n'étant pas thread-safe) et initialisée en mode layered, un mode permettant la gestion du canal alpha ; de la transparence.
les animations sont récupérées directement des ressources associées au TActivityIndicator, vous ne serez pas dépaysé !
A noter:
Il est possible de passer le handle d'une fenêtre/d'un contrôle au constructeur. Dans ce cas, l'animation sera centrée sur ce contrôle et aura le même ZOrder (ordre d'empilement des fiches).
Mais si la tâche dure plus que 5 secondes, l'OS considère que l'application est figée, fait une copie de la fiche et l'affiche par dessus dans un rendu plus clair avec le message "ne répond pas". L'indicateur sera donc aussi masqué.
Si aucune fenêtre "parent" n'est renseignée, l'indicateur flottera au dessus de toutes les fiches du bureau et sera toujours visible.
En résumé, ne définissez pas de parent si la tâche dure plus de 5 secondes
Vous trouverez dans le zip l'unité WinXIndicator.pas ainsi qu'une petite application de démo.
Voilà, si vous avez des commentaires ou des remarques, n'hésitez pas![]()
Partager