LAZARUS - Animer une application avec un cycle d'images et du son

Christophe PIQUER

Ce tutoriel propose des méthodes pour créer une solution simple d'animation développée avec LAZARUS pouvant fonctionner sous WINDOWS et sous LINUX. L'animation est ici présentée comme un préalable à l'ouverture d'une application. Elle est basée sur la reproduction d'un cycle d'apparitions consécutives d'images associé en sa fin à une annonce vocale et un son de transition.

Commentez

- Titre : LAZARUS - Animer une application avec un cycle d'images et du son

- Auteur : Christophe PIQUER

- Parution : 22 janvier 2024

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2024 Christophe PIQUER. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Les éléments communs aux méthodes

- II-A. Le processus

- II-B. Les images

- II-C. Les composants spécifiques

- III. Deux méthodes compatibles avec Windows et Linux

- III-A. Les prérequis

- III-A-1. L'application de synthèse vocale

- III-A-2. Le composant audio

- III-B. Méthode A1

- III-B-1. Création des unités et des fiches

- III-B-2. L'ordonnancement des fiches

- III-B-3. La fiche animation FormAnim

- III-B-3-a. Composants et propriétés

- III-B-3-b. Le code de la fiche animation

- III-B-4. La fiche application FormAppli

- III-B-4-a. Composants et propriétés

- III-B-4-b. Le code de la fiche application

- III-C. Méthode A2

- III-C-1. La fiche application FormAppli

- III-C-2. Création de l'unité et de la fiche

- III-C-3. Composants et propriétés

- III-C-4. Le code de la fiche application

- IV. Deux méthodes seulement compatibles avec Windows

- IV-A. Méthode B1

- IV-A-1. Ordonnancement des fiches

- IV-A-2. La fiche animation FormAnim

- IV-A-2-a. Composants et propriétés

- IV-A-2-b. Le code de la fiche animation

- IV-A-3. La fiche application FormAppli

- IV-A-3-a. Composants et propriétés

- IV-A-3-b. Le code de la fiche application

- V. Méthode B2

- V-A. La fiche application FormAppli

- V-B. Création de l'unité et de la fiche

- V-B-1. Composants et propriétés

- V-B-2. Le code

- V-C. Le code de la fiche application

- VI. Conclusion

- VII. Remerciements

I - Introduction

La finalité de ce tutoriel est de réaliser une animation qui sera lancée avant l'activation de la partie fonctionnelle de l'application. Cette animation s'appuie sur le défilement de quatre images de feux tricolores constituant ainsi un cycle. L'accès à la fiche principale de l'application est possible après un nombre de répétitions du cycle déterminé puis une annonce vocale et enfin l’émission d’un son.

II - Les éléments communs aux méthodes

Afin d'alléger ce tutoriel, dans ce paragraphe sont présentés les éléments qui sont communs aux différentes méthodes qui seront abordées pour élaborer l'animation.

II-A - Le processus

II-B - Les images

Voici les images utilisées pour construire l'animation :

Feu0

Feu1

Feu2

Feu3

Un cycle : Feu0 → Feu1 → Feu2 → Feu3

II-C - Les composants spécifiques

Pour réaliser l’animation, l'ensemble des méthodes proposées s'appuient sur deux composants :

- ImgList1 (TImageList) : sert à stocker et ordonner les images qui seront affichées dans Img1. Après avoir double-cliqué sur le composant, il faut ajouter les images et les ordonner suivant leur numérotation (Feu0 … Feu3).

- Tempo1 (TTimer) : temporisation permettant de fixer le temps d'affichage de chaque image. Ici, elle est réglée à 500 ms.

III - Deux méthodes compatibles avec Windows et Linux

III-A - Les prérequis

Ces méthodes nécessitent en prérequis l'installation d'une application tierce de synthèse vocale et d'un composant audio spécifique.

III-A-1 - L'application de synthèse vocale

Cette application permettra la diction de l'annonce vocale.

L'application de synthèse vocale est espeak. À ce jour gratuite, elle est compatible tant avec Windows qu'avec Linux. Il vous faut donc la télécharger et procéder à l'installation sur votre poste.

Documentation

Téléchargement

Une fois l'installation réalisée, vous constaterez que vous avez installé TTSApp dont le dossier principal est eSpeak. Copiez et collez dans le dossier de votre application l'exécutable espeak qui est dans le dossier command_line.

L'application que vous allez créer ne pourra dire l'annonce vocale que si espeak est installée sur le poste de l'utilisateur.

III-A-2 - Le composant audio

Lazarus n'étant pas nativement doté d'un composant audio, il est donc nécessaire d'en installer un. Nous avons choisi Tplaysound.

Documentation

Téléchargement

Ce composant permettra de jouer le son de transition (fichier .wav).

III-B - Méthode A1

La première méthode consiste à utiliser deux fiches : FormAnim pour l'animation et FormAppli pour l'application elle-même.

III-B-1 - Création des unités et des fiches

Après avoir créé et enregistré le projet, il faut créer les unités et les fiches (formes) :

- FormAnim et l'unité anim pour la fiche de l'animation ;

- FormAppli et l'unité appli pour la fiche support de l'application.

Comme la fiche FormAppli est la fiche principale, elle est créée automatiquement. Pour créer la fiche FormAnim, utilisez l’option « Nouvelle fiche » du menu déroulant « Fichier ».

Comme indiqué ci-après, construisez les fiches FormAnim et FormAppli, en disposant les composants nécessaires sur chacune d'elles et modifiez leurs propriétés afin d'obtenir les fonctionnalités attendues.

III-B-2 - L'ordonnancement des fiches

Une bonne pratique veut que toutes les fiches ne soient pas chargées au démarrage. Donc, après avoir cliqué dans Lazarus sur Projet → Options du projet → Fiches, Sélectionnez FormAppli et faites-la passer à l'aide des flèches du côté des fiches disponibles puis cliquez sur OK. Cette fiche sera créée au moment opportun, dans la procédure d'animation avec la fiche FormAnim comme propriétaire.

III-B-3 - La fiche animation FormAnim

Cette fiche est le support de l'animation sur laquelle sont déposés les composants à paramétrer.

III-B-3-a - Composants et propriétés

Composants

Propriétés

TForm

AutoSize : True
BorderStyle : bsNone
Caption : (Vide)
Color : clActiveBorder
Name : FormAnim
Position : poScreenCenter

TImage

Align : alNone
AutoSize : True
Center : True
Height : (Hauteur des images)
Name : Img1
Width : (Largeur des images)

TImageList

Height : (Hauteur des images)
Name : ImgList1
Width : (Largeur des images)

TTimer

Enabled : True
Interval : 500
Name : Tempo1

TProcess

CommandLine : espeak -s 170 -v fr+m5 « Bonjour et bienvenue dans notre nouvelle application »
(Si fichier pour annonce :espeak -s 170 -v fr+m5 -f Annonce.txt)
Executable : espeak
Name : ProcAnn
ShowWindow : swoHIDE

Tplaysound

Name : PlaySon
SoundFile : Son.wav

L'annonce à dire est écrite au niveau de ComandLine du composant ProcAnn ou bien appelée dans un fichier .txt dans lequel elle est écrite. Le fichier est à mettre dans le dossier de l'application.

III-B-3-b - Le code de la fiche animation

La fiche FormAnim est l’une des raisons d'être de ce tutoriel. C'est dans l'onglet de l'unité anim qu'il faut coder l'animation.

Les clauses uses de la fiche sont les suivantes :

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Uplaysound, Process, Crt;

Afin de déterminer les valeurs du cycle des images (nombre d'exécutions, première image et dernière, il faut fixer des constantes. On les saisit sous les clauses précédentes.

const
CNumCycles = 3; // Nombre de cycles
CPremImg = 0; // Numéro de la première image
CDerImg = 3; // Numéro de la dernière image

Pour réaliser le passage d'une image à l'autre et compter les répétitions du cycle, il est nécessaire de déclarer deux variables privées dans TFormAnim : NumImg et NumCycle. Il faut aussi déclarer à ce niveau la procédure d'animation : Animation.

private
NumImg, NumCycle: Integer;
procedure Animation;

Pour pouvoir appeler la fiche FormAppli à la fin de l'animation, on doit déclarer l'unité appli dans les clauses uses sous { TFormAnim }.

implementation

{$R *.lfm}

{ TFormAnim }

uses
appli;

Pour s'assurer que le cycle, lors de l'ouverture de la fiche FormAnim, démarre bien sur la première image, on crée et renseigne sa méthode de création :

procedure TFormAnim.FormCreate(Sender: TObject);
begin
NumImg := CPremImg - 1; // Pour bien démarrer sur la première image
end;

Dans ce tutoriel, le code de l'animation s'appuie sur trois répétitions du cycle pendant lesquelles s'affichent l'une après l'autre dans Img1 les quatre images stockées au niveau de ImgList1. Dans ce composant, la première image du cycle porte le numéro 0 et la dernière le 3.

Pendant l'animation, grâce à l'utilisation de Tempo1 le composant de temporisation, une image s'affiche comme préalablement paramétré toutes les 500 ms (0,5 sec.). À la fin de la troisième répétition du cycle, une annonce est dite, puis un son de transition est joué. Alors, la fiche FormAppli est créée et appelée à s'ouvrir tandis que FormAnim se ferme et que l'animation est interrompue.

L'annonce est dite grâce au composant ProcAnn qui pilote l'application de synthèse vocale espeak.

Code de la procédure d'animation :

procedure TFormAnim.Animation; // Procédure d'animation
begin
if NumImg = CDerImg then // Dernière image ?
begin
NumImg := CPremImg; // Retour à la première image
Inc(NumCycle); // Cycle suivant
if NumCycle = CNumCycles then // cycles terminés ?
begin
ProcAnn.Execute;
Tempo1.Enabled := False; // Arrêt temporisation
FormAppli := TFormAppli.Create(FormAnim); // Création de la fiche en attente
FormAppli.Show; // Ouverture fiche application
FormAnim.Hide; // Fermeture fiche animation
end;
end
else
Inc(NumImg); // Image suivante;
ImgList1.GetBitmap(NumImg, Img1.Picture.Bitmap) // Image en cours du cycle
end;

L'appel de la procédure d'animation est réalisé au niveau du timer Tempo1 qui est paramétré initialement de manière à ce qu'il soit actif dès l'ouverture de FormAnim.

procedure TFormAnim.Tempo1Timer(Sender: TObject);
begin
Animation; // Lancement de l'animation
end;

Quant au son de transition, il est joué à l'arrêt du timer Tempo1 en fin d'animation. Afin de laisser un peu de temps pour que l'annonce vocale soit terminée avant que le son de transition soit joué, un délai d'attente de quelques secondes est nécessaire.

procedure TFormAnim.Tempo1StopTimer(Sender: TObject); // Emission du son de transition
begin
Delay(3000); // Délai d'attente fin de diction de l'annonce
PlaySon.Execute;
end;

Le fichier Son.wav doit être déposé dans le dossier de l'application.

Dans ce tutoriel, il n'y a pas de procédure pour arrêter le son. Il est donc recommandé de choisir un son court, c'est-à-dire environ 0,1 seconde.

III-B-4 - La fiche application FormAppli

FormAppli n'est présente que pour simuler l'application pour laquelle vous voulez qu'une animation précède son ouverture.

III-B-4-a - Composants et propriétés

Composants

Propriétés

TForm

Caption : Application
Color : clMoneyGreen
Name: FormAppli

TButton

Caption : Quitter
Name : Btn1

III-B-4-b - Le code de la fiche application

La fiche FormAppli a seulement la fonction dans ce tutoriel de simuler l'application que vous voudriez voir précédée par une animation avant son ouverture. Pour l'exercice, le code est réduit à la fermeture de l'application.

C'est dans l'onglet de l'unité appli qu'il faut coder la fiche application.

Les clauses uses de la fiche sont les suivantes :

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

Une fois la fiche FormAppli ouverte suite à l'animation, pour la fermer et quitter l'application, il faut renseigner comme suit la méthode de l’événement OnCLick du bouton Quitter :

procedure TFormAppli.Btn1Click(Sender: TObject);
begin
Close; // Fermeture de la fiche
end;

Afin que l'application soit fermée « proprement », c'est-à-dire qu'il ne reste aucun processus en cours en arrière-plan :

procedure TFormAppli.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Application.Terminate; // Fermeture de l'application
end;

III-C - Méthode A2

Cette méthode ne nécessite qu'une seule fiche. Toutefois, on y retrouve sensiblement les mêmes procédures que dans la première méthode. Dans cette deuxième façon de procéder, l'animation est réalisée sur la fiche FormAppli avant de libérer les contrôles de celle-ci.

III-C-1 - La fiche application FormAppli

Dans cette méthode, l'application s'ouvre directement sur la fiche FormAppli. Cependant, tous les boutons et autres contrôles que pourrait détenir cette dernière ne sont accessibles que lorsque l'animation est terminée.

III-C-2 - Création de l'unité et de la fiche

Après avoir enregistré le projet, il faut créer l'unité appli et la fiche FormAppli.

Rappel : la fiche est ici support de l'application, mais aussi de l'animation.

Construisez la fiche FormAppli en y disposant les composants nécessaires et modifiez leurs propriétés afin d'obtenir les fonctionnalités attendues.

III-C-3 - Composants et propriétés

Composants

Propriétés

TForm

Caption : Application
Color : clMoneyGreen
Name: FormAppli

TButton

Caption : Quitter
Name : Btn1
Visible : False

TImage

Align : alClient
AutoSize : True
Center : True
Height : (Hauteur des images)
Name : Img1
Width : (Largeur des images)

TImageList

Height : (Hauteur des images)
Name : ImgList1
Width : (Largeur des images)

TTimer

Enabled : True
Interval : 500
Name : Tempo1

TProcess

CommandLine : espeak -s 170 -v fr+m5 « Bonjour et bienvenue dans notre nouvelle application »
(Si fichier pour annonce :espeak -s 170 -v fr+m5 -f Annonce.txt)
Executable : espeak
Name : ProcAnn
ShowWindow : swoHIDE

Tplaysound

Name : PlaySon
SoundFile : Son.wav

III-C-4 - Le code de la fiche application

Une fois la fiche prête avec ses composants paramétrés, compilez et passez au code.

Dans cette méthode, la fiche FormAppli est chargée d'emblée.

C'est dans l'onglet de l'unité appli qu'il faut coder l'animation, mais aussi les procédures de l'application elle-même.

Les clauses uses sont les suivantes :

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, uplaysound, Process, Crt;

Pour déterminer les valeurs du cycle des images (nombre d'exécutions, première image et dernière, il faut fixer des constantes. On les saisit sous les clauses précédentes.

const
CNumCycles = 3; // Nombre de cycles
CPremImg = 0; // Numéro de la première image
CDerImg = 3; // Numéro de la dernière image

Comme dans la méthode précédente, pour réaliser le passage d'une image à l'autre et compter les répétitions du cycle, il est nécessaire de déclarer deux variables privées : NumImg et NumCycle. Il faut également déclarer à ce niveau la procédure d'animation Animation, mais aussi la procédure Contr qui permettra de rendre accessibles les contrôles implantés sur la fiche tels les boutons.

private
NumImg, NumCycle: Integer;
procedure Animation;
procedure Contr(Form: TForm);

Pour s'assurer que le cycle lors de l'ouverture de la fiche FormAnim démarre bien sur la première image, ajouter le code suivant :

procedure TFormAnim.FormCreate(Sender: TObject);
begin
NumImg := CPremImg - 1; // Pour bien démarrer sur la première image
end;

La procédure d'animation est identique à celle de la méthode précédente, à la différence qu'il n'y a pas à appeler une autre fiche à la fin de l'animation.

Code de la procédure d'animation :

procedure TFormAppli.Animation; // Procédure d'animation
begin
if NumImg = CDerImg then // Dernière image ?
begin
NumImg := CPremImg; // Retour à la première image
Inc(NumCycle); // Cycle suivant
if NumCycle = CNumCycles then // cycles terminés ?
begin
ProcAnn.Execute;
Tempo1.Enabled := False; // Arrêt temporisation
end;
end
else
Inc(NumImg); // Image suivante;
ImgList1.GetBitmap(NumImg, Img1.Picture.Bitmap) // Image en cours du cycle
end;

L'appel de la procédure d'animation est réalisé au niveau du timer Tempo1 :

procedure TFormAppli.Tempo1Timer(Sender: TObject);
begin
Animation; // Lancement de l'animation
end;

Suite à l'animation, pour rendre le bouton Btn1 (Quitter) visible, il faut utiliser la procédure suivante :

procedure TFormAppli.Contr(Form: TForm); // Procédure d'affichage des contrôles...
var
c: Integer;
begin
Img1.Hide; // Ferme l'animation
for c:= 0 to Form.ComponentCount - 1 do
if Form.Components[c] is TControl then
TControl(Form.Components[c]).Visible:= True; // Affiche les contrôles
Img1.Visible:= False; // Rend invisible la dernière image du cycle
end;

On aurait pu utiliser la propriété Visible (True ou False) simplement pour Btn1. Cependant, cette procédure se veut un peu plus générale pour le cas d'applications ayant plusieurs boutons et autres contrôles. Il suffit de définir la propriété Visible de leur ancêtre commun, à savoir TControl…

Lors de l'arrêt du timer Tempo1 en fin d'animation, le son de transition est joué et la procédure Contr est appelée rendant Btn1 accessible. Avant de lancer le son de transition, il faut respecter un délai d'attente de quelques secondes pour que la diction de l'annonce vocale soit terminée.

procedure TFormAppli.Tempo1StopTimer(Sender: TObject);
begin
Delay(3000); // Délai d'attente fin de diction de l'annonce
PlaySon.Execute;
Contr(FormAppli); // Affiche les contrôles
end;

Le fichier Son.wav doit être déposé dans le dossier de l'application.
Dans ce tutoriel, il n'y a pas de procédure pour arrêter le son. Il est alors recommandé de choisir un son court, c'est-à-dire environ 0,1 seconde.

Une fois la fiche FormAppli accessible suite à l'animation, pour la fermer et quitter l'application, il faut renseigner comme suit la méthode de l’événement OnCLick du bouton Quitter :

procedure TFormAppli.Btn1Click(Sender: TObject);
begin
Close; // Fermeture de la fiche
end;

Afin que l'application soit fermée « proprement » c'est-à-dire qu'il ne reste aucun processus en cours en arrière-plan :

procedure TFormAppli.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Application.Terminate; // Fermeture de l'application
end;

IV - Deux méthodes seulement compatibles avec Windows

En optant pour ce type de méthodes, vous n'avez ni à installer une application de synthèse vocale, ni un composant pour la lecture des fichiers .wav puisque Windows est nativement équipé des outils permettant de répondre à ces besoins.

Vous retrouverez les mêmes principes de fonctionnement et un code semblable en bien des points à celui utilisé dans les méthodes vues précédemment. Aussi, ne vous étonnez pas de lire des formulations quelque peu identiques.

IV-A - Méthode B1

Comme dans la méthode A1 on crée deux fiches, FormAnim pour l'animation et FormAppli pour l'application elle-même.

IV-A-1 - Ordonnancement des fiches

Pour ordonnancer les fiches, il faut procéder comme vu précédemment pour la méthode A1.

IV-A-2 - La fiche animation FormAnim

Sur cette fiche support de l'animation sur laquelle sont déposés les composants essentiels à paramétrer, il n'y a pas ni composant Tprocess, ni composant Tplaysound.

IV-A-2-a - Composants et propriétés

Composants

Propriétés

TForm

AutoSize : True
BorderStyle : bsNone
Caption : (Vide)
Color : clActiveBorder
Name : FormAnim
Position : poScreenCenter

TImage

Align : alNone
AutoSize : True
Center : True
Height : (Hauteur des images)
Name : Img1
Width : (Largeur des images)

TImageList

Height : (Hauteur des images)
Name : ImgList1
Width : (Largeur des images)

TTimer

Enabled : True
Interval : 500
Name : Tempo1

IV-A-2-b - Le code de la fiche animation

C'est dans l'onglet de l'unité anim qu'il faut coder l'animation.

Les clauses uses de la fiche sont les suivantes :

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, MMSystem, Comobj;

Pour déterminer les valeurs du cycle des images (nombre d'exécutions, première image et dernière, il faut fixer des constantes. On les saisit sous les clauses précédentes.

const
CNumCycles = 3; // Nombre de cycles
CPremImg = 0; // Numéro de la première image
CDerImg = 3; // Numéro de la dernière image

Pour réaliser le passage d'une image à l'autre et compter les répétitions du cycle, on déclare deux variables privées : NumImg et NumCycle ainsi que la procédure d'animation : Animation comme dans la méthode A1. Mais ici, il faut aussi déclarer la procédure de l'annonce vocale.

private
NumImg, NumCycle: Integer;
procedure Animation;
procedure Annonce(const Vk: Widestring);

Pour pouvoir appeler la fiche FormAppli à la fin de l'animation, on déclare l'unité appli dans les clauses uses sous { TFormAnim }.

implementation

{$R *.lfm}

{ TFormAnim }

uses
appli;

Pour s'assurer que le cycle lors de l'ouverture de la fiche FormAnim démarre bien sur la première image, il faut utiliser le code suivant :

procedure TFormAnim.FormCreate(Sender: TObject);
begin
NumImg := CPremImg - 1; // Pour bien démarrer sur la première image
end;

L'animation s'appuie sur trois répétitions du cycle pendant lesquelles s'affichent l'une après l'autre dans Img1 les quatre images stockées au niveau de ImgList1. Dans ce composant, la première image du cycle porte le numéro 0 et la dernière le 3.

Grâce à Tempo1, le composant de temporisation, une image s'affiche comme préalablement paramétré toutes les 500 ms (0,5 sec.). À la fin de la troisième répétition du cycle, une annonce est dite puis un son de transition est joué. Alors, la fiche FormAppli est créée et appelée à s'ouvrir tandis que FormAnim se ferme et que l'animation est interrompue.

Code de la procédure d'animation :

procedure TFormAnim.Animation; // Procédure d'animation
begin
if NumImg = CDerImg then // Dernière image ?
begin
NumImg := CPremImg; // Retour à la première image
Inc(NumCycle); // Cycle suivant
if NumCycle = CNumCycles then // cycles terminés ?
begin
Annonce('Bonjour et bienvenue dans notre nouvelle application'); // Diction de l'annonce vocale
Tempo1.Enabled := False; // Arrêt temporisation
FormAppli := TFormAppli.Create(FormAnim); // Création de la fiche en attente
FormAppli.Show; // Ouverture fiche application
FormAnim.Hide; // Fermeture fiche animation
end;
end
else
Inc(NumImg); // Image suivante
ImgList1.GetBitmap(NumImg, Img1.Picture.Bitmap) // Image en cours du cycle
end;

Pour appeler la procédure d'animation, utiliser ce code :

procedure TFormAnim.Tempo1Timer(Sender: TObject);
begin
Animation; // Lancement de l'animation
end;

Pour que l'annonce soit dite, il faut créer la procédure Annonce qui est appelée dans la partie de code concernant la procédure d'animation. Cette procédure sollicite l'interface de programmation d'application vocale (SAPI) développée par Microsoft qui permet la reconnaissance et la synthèse vocale dans les applications Windows.

Code de la procédure Annonce :

procedure TFormAnim.Annonce(const Vk: Widestring); // Procédure d'annonce vocale
var
SavedCW: Word;
SpVoice: Variant;
begin
SpVoice:= CreateOleObject('SAPI.SpVoice');
// Optionnel : Réglage vitesse et volume de la voix
SpVoice.Rate:= 0; // Vitesse de la voix de -10 à 10
SpVoice.Volume:= 100; // Volume de la voix de 0 à 100
// Changer le masque d'interruption FPU pour éviter les exceptions
SavedCW:= Get8087CW;
try
Set8087CW(SavedCW or $4);
SpVoice.Speak(Vk, 0);
finally
// Restaurer le masque FPU
Set8087CW(SavedCW);
end;
end;

Quant au son de transition, il est joué lors de l'arrêt du timer Tempo1 en fin d'animation.

procedure TFormAnim.Tempo1StopTimer(Sender: TObject);
begin
PlaySound('Son.wav',0,SND_ASYNC); // Emission du son de transition
end;

Dans ce tutoriel, il n'y a pas de procédure pour arrêter le son. Il est donc recommandé de choisir un son court, c'est-à-dire environ 0,1 seconde.

IV-A-3 - La fiche application FormAppli

Comme dans la méthode A1, FormAppli n'est présente que pour figurer l'application pour laquelle vous voulez qu'une animation précède son ouverture.

IV-A-3-a - Composants et propriétés

Composants

Propriétés

TForm

Caption : Application
Color : clMoneyGreen
Name: FormAppli

TButton

Caption : Quitter
Name : Btn1

IV-A-3-b - Le code de la fiche application

Comme stipulé précédemment, la fiche FormAppli a seulement la fonction dans ce tutoriel de simuler l'application que vous voudriez voir précédée par une animation avant son ouverture. Le code est volontairement réduit aux simples procédures de fermeture de l'application.

C'est dans l'onglet de l'unité appli que vous codez la fiche application.

Les clauses uses de la fiche sont celles-ci :

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

Une fois la fiche FormAppli ouverte suite à l'animation, pour la fermer et quitter l'application, il faut renseigner comme suit la méthode de l’événement OnCLick du bouton Quitter :

procedure TFormAppli.Btn1Click(Sender: TObject);
begin
Close; // Fermeture de la fiche
end;

Pour une fermeture « propre », sans laisser de processus ouvert en arrière-plan, utilisez ce code :

procedure TFormAppli.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Application.Terminate; // Fermeture de l'application
end;

V - Méthode B2

Cette méthode nécessite une seule fiche. Néanmoins, on utilise quasiment les mêmes procédures que dans la méthode précédente. L'animation est réalisée sur la fiche de l'application FormAppli avant de libérer les contrôles de celle-ci.

V-A - La fiche application FormAppli

Comme dans la méthode A2, l'application s'ouvre directement sur la fiche FormAppli. Le principe veut que tous les boutons et autres contrôles que pourrait détenir celle-ci ne soient accessibles que lorsque l'animation est terminée.

V-B - Création de l'unité et de la fiche

Après avoir enregistré le projet, créez la fiche FormAppli et l'unité appli. La fiche est support de l'application, mais aussi de l'animation.

Construisez la fiche FormAppli, en y disposant les composants nécessaires et modifiez leurs propriétés afin d'obtenir les fonctionnalités attendues.

Comme dans la méthode précédente, il n'y a pas les composants Tprocess et Tplaysound.

V-B-1 - Composants et propriétés

Composants

Propriétés

TForm

Caption : Application
Color : clMoneyGreen
Name: FormAppli

TButton

Caption : Quitter
Name : Btn1
Visible : False

TImage

Align : alClient
AutoSize : True
Center : True
Height : (Hauteur des images)
Name : Img1
Width : (Largeur des images)

TImageList

Height : (Hauteur des images)
Name : ImgList1
Width : (Largeur des images)

TTimer

Enabled : True
Interval : 500
Name : Tempo1

V-B-2 - Le code

Même principe que dans la méthode A2, la fiche FormAppli est chargée d'emblée.

V-C - Le code de la fiche application

Codez l'animation, mais aussi les procédures de l'application elle-même dans l'onglet de l'unité appli.

Les clauses uses sont les suivantes :

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, MMSystem, Comobj;

Pour déterminer les valeurs du cycle des images (nombre d'exécutions, première image et dernière), il faut fixer des constantes. Elles sont saisies sous les clauses précédentes.

const
CNumCycles = 3; // Nombre de cycles
CPremImg = 0; // Numéro de la première image
CDerImg = 3; // Numéro de la dernière image

Comme dans la méthode précédente, pour réaliser le passage d'une image à l'autre et compter les répétitions du cycle, il est nécessaire de déclarer deux variables privées : NumImg et NumCycle. Il faut également déclarer à ce niveau les procédures d'animation et d'annonce, mais aussi la procédure Contr qui permettra de rendre accessibles les contrôles implantés sur la fiche tels les boutons.

private
NumImg, NumCycle: Integer;
procedure Animation;
procedure Annonce(const Vk: Widestring);
procedure Contr(Form: TForm);

Pour s'assurer que le cycle lors de l'ouverture de la fiche FormAnim démarre bien sur la première image, utilisez ce code :

procedure TFormAnim.FormCreate(Sender: TObject);
begin
NumImg := CPremImg - 1; // Pour bien démarrer sur la première image
end;

La procédure d'animation est identique à celle de la méthode précédente, à la différence qu'il n'y a pas à appeler une autre fiche à la fin de l'animation.

Code de la procédure d'animation :

procedure TFormAppli.Animation;
begin
if NumImg = CDerImg then // Dernière image ?
begin
NumImg := CPremImg; // Retour à la première image
Inc(NumCycle); // Cycle suivant
if NumCycle = CNumCycles then // cycles terminés ?
begin
Annonce('Bonjour et bienvenue dans notre nouvelle application');
Tempo1.Enabled := False; // Arrêt temporisation
end;
end
else
Inc(NumImg); // Image suivante;
ImgList1.GetBitmap(NumImg, Img1.Picture.Bitmap) // Image en cours du cycle
end;

L'appel de la procédure d'animation est réalisé au niveau du timer Tempo1.

procedure TFormAppli.Tempo1Timer(Sender: TObject);
begin
Animation; // Lancement de l'animation
end;

Afin que l'annonce soit dite, il faut créer la procédure Annonce qui est appelée dans la partie de code de la procédure Animation. Comme dans la méthode précédente, cette procédure utilise l'interface de programmation d'application vocale (SAPI) développée par Microsoft.

Code de la procédure Annonce :

procedure TFormAppli.Annonce(const Vk: Widestring); // Procédure d'annonce vocale
var
SavedCW: Word;
SpVoice: Variant;
begin
SpVoice:= CreateOleObject('SAPI.SpVoice');
// Optionnel : Réglage vitesse et volume de la voix
SpVoice.Rate:= 0; // Vitesse de la voix de -10 à 10
SpVoice.Volume:= 100; // Volume de la voix de 0 à 100
// Changer le masque d'interruption FPU pour éviter les exceptions
SavedCW:= Get8087CW;
try
Set8087CW(SavedCW or $4);
SpVoice.Speak(Vk, 0);
finally
// Restaurer le masque FPU
Set8087CW(SavedCW);
end;
end;

Pour rendre le bouton Btn1 (Quitter) visible, il faut utiliser la procédure suivante :

procedure TFormAppli.Contr(Form: TForm); // Procédure d'affichage des contrôles…
var
c: Integer;
begin
Img1.Hide; // Ferme l'animation
for c:= 0 to Form.ComponentCount - 1 do
if Form.Components[c] is TControl then
TControl(Form.Components[c]).Visible:= True; // Affiche les contrôles
Img1.Visible:= False; // Rend invisible la dernière image du cycle
end;

On aurait pu utiliser la propriété Visible (True ou False) simplement pour Btn1. Cependant, cette procédure se veut un peu plus générale pour le cas d'applications ayant plusieurs boutons et autres contrôles. Il suffit de définir la propriété Visible de leur ancêtre commun, à savoir TControl…

Lors de l'arrêt du timer Tempo1 en fin d'animation, le son de transition est joué et la procédure Contr est appelée, rendant Btn1 accessible.

procedure TFormAppli.Tempo1StopTimer(Sender: TObject);
begin
PlaySound('Son.wav',0,SND_ASYNC); // Emission d'un son
Contr(FormAppli); // Affiche les contrôles
end;

Dans ce tutoriel, il n'y a pas de procédure pour arrêter le son. Il est alors recommandé de choisir un son court, c'est-à-dire environ 0,1 seconde.

Une fois la fiche FormAppli accessible suite à l'animation, pour la fermer et quitter l'application, il faut renseigner comme suit la méthode de l’événement OnCLick du bouton Quitter :

procedure TFormAppli.Btn1Click(Sender: TObject);
begin
Close; // Fermeture de la fiche
end;

Pour une fermeture « propre », sans laisser de processus ouvert en arrière-plan, utilisez le code suivant :

procedure TFormAppli.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Application.Terminate; // Fermeture de l'application
end;

VI - Conclusion

Vous arrivez au terme de ce tutoriel. Vous savez maintenant réaliser une animation simple basée sur la rotation en boucle d'un cycle de quelques images qui apparaissent les unes après les autres. À ce carrousel d'images, vous savez associer une annonce vocale et enchaîner avec un son de transition vers la partie « fonctionnelle » de l'application.

Comme vous l'avez sûrement compris, ce type d'animations peut aussi s'intercaler entre n'importe quelles fiches d'applications plus conséquentes.

Si ce tutoriel a pu solliciter quelque peu votre créativité, n'hésitez pas à réaliser une application et à la partager.

VII - Remerciements

Je remercie Alcatîz pour l'intérêt porté à mon travail et l'idée de m'amener à rédiger un tutoriel destiné à un public plus large qui utilise non seulement Windows mais aussi Linux.

Je remercie aussi gvasseur58 pour la relecture technique, les corrections et les conseils apportés. Grâce à lui, j'ai pu découvrir et apprendre encore d'autres façons plus judicieuses et moins alambiquées pour coder certaines procédures.

Je remercie enfin escartefigue pour la relecture orthographique qui permet à chacun de nous de proposer des tutoriels dans lesquels le lecteur ne se heurte pas à des fautes qui pourraient le rebuter.