Exercice 6 : OBJETS DYNAMIQUES

BUT : Dans cet exercice, vous allez apprendre à utiliser les barres de défilement, l’insertion d’images dynamique, un bouton deux états et le compteur (timer). Pour ce faire vous allez construire une application utilisant les propriétés des objets vus précédemment pour créer une animation. Bien que cet exercice soit long, autant dans sa création que dans son code, il reste relativement simple dans sa conception. De plus il met en évidence certains problèmes que l’on peut rencontrer lors de l’élaboration d’un projet.

1/ Préparation et ajout des objets

Créez un nouveau projet :

- un répertoire Exercice_6

- un projet GUI Builder – nommez le Animation.gbp (Save Project As…)

- un projet Object Ada contenant le fichier Exercice_6.prj et les librairies comme montre dans l’exercice 1 (n’oubliez pas de changer sous l’onglet Link, Console en Window).

Une seule fenêtre sera nécessaire pour ce projet.

Nommez-la Principale.

Dimensionnez-la au 2/3 de votre écran.

Insérez un bouton deux états à l’aide du bouton correspondant dans la barre d’outils (2-State-pictured Button Control). Placez-le en haut à droite de la fenêtre. Nommez le Sens.

Insérez ensuite une barre de défilement horizontale. Placez-la au haut de la fenêtre. Nommez-la Vitesse. Insérez un Label si vous voulez nommez cette barre sur votre fenêtre.

Insérez au centre de la fenêtre une image dans une boîte d’image (Picture Box Control).

Nommez-la Image.

2/ Insertion d’un Timer et de son code correspondant

Vous allez maintenant insérer un compteur (Timer) afin d’animer cette image. Nommez le Compteur1. Le compteur effectue une opération à intervalle constant (valeur du compteur).

Afin de faire tourner l’image dans la fenêtre écrivez le code suivant dans l’événement du compteur. Pour pouvoir choisir le sens de rotation, la valeur du bouton deux états Sens est prise en considération.

procedure Compteur_TimeEvent is

begin

-- Si le sens horaire est choisi via le bouton deux états

if Value (Principale.Sens) = gb.True then

-- Si la boîte d'image n'a pas atteint le bord droite de la

-- fenêtre moins une marge de 50 et qu'elle ne se trouve pas en bas de la fenêtre

if Left(Principale.Image) < (Width(Principale.Form) - Width(Principale.Image)-50)and Top (Principale.Image) = 100 then

-- Déplacer la fenêtre de 1 vers la droite

Left(Principale.Image, Left(Principale.Image)+1);

-- Si la boîte d'image n'a pas atteint le bas de la fenêtre moins une marge de 50 et qu'elle se trouve à droite de la fenêtre

elsif Top(Principale.Image) < (Height(Principale.Form)- Height(Principale.Image)-50) and Left(Principale.Image) = (Width(Principale.Form)-Width(Principale.Image)-50) then

-- Déplacer la fenêtre de 1 vers le bas

Top(Principale.Image, Top(Principale.Image)+1);

-- Si la boîte d'image n'a pas atteint le bord gauche de la fenêtre moins une marge de 50

elsif Left(Principale.Image) > 50 then

-- Déplacer la fenêtre de 1 vers la droite

Left(Principale.Image, Left(Principale.Image)-1);

-- Si la boîte d'image n'a pas atteint le haut de la fenêtre moins une marge de 100 (pour le bouton et les barres de défilement)

elsif Top(Principale.Image) > 100 then

Top(Principale.Image, Top(Principale.Image)-1);

end if;

-- Si le sens horaire est choisi via le bouton deux états

else

-- Si la boîte d'image n'a pas atteint le bord gauche de la fenêtre moins une marge de 50 et qu'elle ne se trouve pas en bas de la fenêtre

if Left(Principale.Image) > 50 and Top(Principale.Image)= 100 then

-- Déplacer la fenêtre de 1 vers la gauche

Left(Principale.Image, Left(Principale.Image)-1);

-- Si la boîte d'image n'a pas atteint le bas de la fenêtre moins une marge de 50 et qu'elle se trouve à gauche de la fenêtre

elsif Top(Principale.Image) < (Height(Principale.Form) - Height(Principale.Image)-50) and Left(Principale.Image) = 50 then

-- Déplacer la fenêtre de 1 vers la gauche

Top(Principale.Image, Top(Principale.Image)+1);

-- Si la boîte d'image n'a pas atteint le bord droite de la fenêtre moins une marge de 50

elsif Left(Principale.Image) < (Width(Principale.Form) - Width(Principale.Image)-50) then

-- Déplacer la fenêtre de 1 vers la droite

Left (Principale.Image, Left(Principale.Image)+1);

-- Si la boîte d'image n'a pas atteint le haut de la fenêtre moins une marge de 100

elsif Top(Principale.Image) > 100 then

-- Déplacer la fenêtre de 1 vers le haut

Top(Principale.Image, Top(Principale.Image)-1);

end if;

end if;

end Compteur_TimeEvent;

3/ Code de la barre de défilement

Afin de pouvoir modifier la vitesse de déplacement de l’image via la barre de défilement, il faut agir sur la valeur du compteur en fonction de la position de la barre. Donc sous l'événement Scrolled de la barre de défilement inscrivez le code suivant :

procedure Vitesse_Scrolled is

begin

-- Valeur 0

if Value(Principale. Vitesse) = 0 then

--Vitesse 1 (le plus rapide)

Interval (Principale.Compteur1,1);

-- Valeur 1

elsif Value(Principale. Vitesse) = 1 then

Interval (Principale.Compteur1,5);

-- Valeur 2

elsif Value(Principale.Vitesse) = 2 then

Interval (Principale.Compteur1,10);

-- Valeur 3

elsif Value(Principale.Vitesse) = 3 then

Interval (Principale.Compteur1,50);

-- Valeur 4

elsif Value(Principale.Vitesse) = 4 then

Interval (Principale. Compteur1,100);

-- Valeur 5

elsif Value(Principale.Vitesse) = 5 then

Interval (Principale. Compteur1,200);

-- Valeur 6

elsif Value(Principale.Vitesse) = 6 then

Interval (Principale. Compteur1,300);

-- Valeur 7

elsif Value(Principale. Vitesse) = 7 then

Interval (Principale. Compteur1,500);

-- Valeur 8

elsif Value(Principale. Vitesse) = 8 then

Interval (Principale. Compteur1,1000);

-- Valeur 9

elsif Value(Principale. Vitesse) = 9 then

Interval (Principale. Compteur1,1500);

end if;

end Vitesse_Scrolled;

Vous pouvez maintenant compiler sous Object Ada sans oublier pas les manipulations " spéciales " relatives à la gestion des images (voir exercice 5).

download exercise 6 !

Les fichiers suivants vous permettront de vérifier le résultat de vos manipulations. Toutefois des nouvelles fonctionnalités y ont été ajoutées : l’image se décompose en carrés qui disparaissent et réapparaissent selon une cadence déterminée par un second Timer. Pour des raisons de temps, ce code n’est pas expliqué ici, mais il y figurera en bonne place dans la version 1.0 de votre tutorial favori….

A bon entendeur !