Faire défiler automatiquement la vue d'une zone à ascenseur vertical

 

Une question qui s'était posée sur un forum francophone d'entraide entre développeurs Delphi m'a également été posée sur Twitch : comment faire défiler automatiquement un ascenseur vertical.

Outre la pertinence de cette envie qui ne me semble pas être judicieuse pour tout un tas de raisons, nous avons fait quelques tests.

Grosso modo, une zone avec ascenseur c'est une vue partielle d'une zone plus grande (généralement virtuelle). Le TScrollBox, TVertScrollBox, THorizScrollBox ont des coordonnées et une taille comme tout composant visuel dans Delphi (et ailleurs). Ils ont aussi des coordonnées dans la vue de ce qu'ils affichent. Appelées généralement "offset" dans le "viewport", ces coordonnées sont relatives à la partie affichée du contenu.

Dans Delphi, selon le composant et le framework utilisé (VCL ou FMX) il y a plusieurs solutions différentes pour déplacer le contenu par programmation.

Nous avons fait un test sur un projet FireMonkey en tatonnant vu que je n'avais pas la réponse exacte en tête. C'est un peu l'inconvénient des sessions de codage en direct et des digressions mais c'est aussi ce qui fait leur intérêt (discussion libre et interactivité sans préparation particulière).

Au final j'ai aussi montré comment faire défiler des composants sans passer par un TVertScrollBox comme vous pouvez le voir avec les exemples joints.

En résumé de ces essais il s'avère que c'est l'ascenseur qu'on bouge dans les composants TxxxScrollBox pour déplacer le contenu de la zone visualisée.

En VCL on a donc

ScrollBox1.VertScrollBar.position := ScrollBox1.VertScrollBar.position + 10;

On peut aussi déplacer directement les composants sans avoir besoin d'une zone scrollable si ce ne sera pas à l'utilisateur de faire bouger ce qu'il visualise. Ca simplifie grandement les choses puisqu'il suffit de changer la position du composant qu'on affiche.

Il est tout à fait possible d'utiliser des coordonnées hors de la fenêtre d'affichage (valeurs négatives ou plus grandes que la largeur/hauteur de la fenêtre).

Si on veut faire défiler un texte dans une zone de l'écran, il suffit d'y placer un conteneur (TLayout en FMX ou TPanel en VCL), d'y placer notre texte (TLabel par exemple) et le bouger. Si on a activé ClipCildren au niveau du parent seule la partie contenu dedans sera affichée à l'écran.

Et si vous voulez faire quelque chose en 3D, FireMonkey est assez pratique. Voyez comment j'ai reproduit un générique en mode Star Wars dans cet exemple de projet (une sorte de son et lumière).


Fichiers associés


Mug Toucan DX dans la baie de RioMug Toucan DX dans la baie de Rio