VI. Création et utilisation des unités▲
Quand nous faisons un gros programme, il devient souvent difficile
de maintenir le tout dans un meme fichier source. Il convient alors de le diviser en plusieurs fichiers facilement maniables afin de faciliter la maintenance et le suivi du projet.
Il arrive souvent aussi, que nous devions coder un ensemble de fonctions qu'on aura à utiliser dans plusieurs projets, ou distribuer afin que d'autres les utilisent.
Pour répondre à ces divers besoins, on utilise fréquemment en Pascal des unités.
Une unité est une liste de fonctions, de variables et de procédures traitant d'un même thème mises ensemble dans un fichier source. Et ces procédures et fonctions sont par la suite réutilisables dans d'autres programmes ou unités.
VI-A. Théorie▲
Une unité sous MIDlet Pascal comprend trois parties :
- Interface
- Implémentation
- Initialisation
Dans l'interface, on définit l'entête des fonctions que d'autres programmes pourront utiliser. C'est dans la partie implémentation que ces fonctions seront déclarées entièrement avec leur code. On peut aussi déclarer dans les entêtes des fonctions qui n'ont pas été définies dans la partie implémentation. La dernière partie -initialisation- est réservée à l'initialisation des variables globales de l'unité.
Avec MIDlet Pascal, on ne peut définir qu'une unité par fichier, et le nom du fichier doit correspondre au nom de l'unité.
Format d'une unité sous MIDlet Pascal : PremierUnite.mpsrc
unit
premierUnite;
interface
{ procedure et fonctions publiques }
implementation
{ codes des procedures et fonctions}
initialization
{ initializations des variables}
end
.
VI-B. Pratique▲
Lancez MIDlet Pascal, et créez un nouveau projet. Nommons-le hello2. Allez dans le menu projet et choisissez « New source file ». Dans la boite de dialogue qui s'affiche, tapez le nom de l'unité « transform».
Nous allons transformer notre programme précédent en un programme principal et une unité.
Voyons le code de l'unité :
unit
transform;
interface
procedure
animation; //affiche le texte defilant
procedure
setTexte(s : String
); //definit le texte a faire defiler
implementation
var
texte : String
; //le texte a faire defiler
dim : integer
; // nombre de caractere a afficher
procedure
setTexte(s : String
);
begin
texte:=s;
end
;
//fait rotation des caractere d'une phrase
function
rotation(tex: string
) :string
;
var
c, d: char
;
i :integer
;
begin
c:=getChar(tex,0
);
for
i:=length(tex)-1
downto
0
do
begin
d:=getChar(tex,i);
tex:=setChar(tex, c, i);
c:=d;
end
;
rotation:=tex;
end
;
{cree l'effet de texte defilant et l'affiche}
procedure
animation;
var
rot, aux : string
;
a, b : integer
;
begin
//on affiche le texte defilant
rot:=texte;
setColor(0
, 0
, 250
);
rot:=texte;
//position du texte à l'ecran
//on affiche le texte centre sur l'ecran
b:=(getHeight div
2
) - (getStringHeight(copy(rot,0
, dim)) div
2
);
a:=(getWidth div
2
) - (getStringWidth(copy(rot,0
, dim)) div
2
);
repeat
setColor(50
, 114
, 184
);
aux:=copy(rot,0
, dim);
drawText(aux, a, b);
rot:=rotation(rot);
repaint;
delay(250
);
SetColor(255
, 255
, 255
);
FillRect(a, b, getStringWidth(aux)+20
, getStringHeight(aux));
until
GetKeyClicked <> KE_NONE;
end
;
initialization
dim:=20
;
end
.
Vous pouvez voir qu'il n'y a pas de modification importante par rapport au code précédent. Nous avons mis les deux fonctions setText() et animation() dans la partie interface.
Dans la partie implementation, nous avons défini le code de ces deux fonctions, et aussi d'autres fonctions comme rotation(), qui est utilisée par animation(), mais qui ne pourra etre appelée par un autre programme ou unité utilisant l'unité transform puisque son entête
ne figure pas dans la partie Interface.
Dans la dernière partie, à savoir initialization, nous initialisons dim à 20, qui est le nombre de caractères à afficher sur l'écran.
VI-C. Utilisation de l'unité par d'autres programmes ▲
Pour utiliser l'unité dans un programme, il suffit d'ajouter après le nom du programme la clause uses suivie du nom de l'unité. Si vous voulez utiliser une unité depuis une autre unité, la clause « uses » doit être placée immédiatement après la clause « implementation ».
Une fois la déclaration faite, toutes les procédures et variables disponibles dans l'interface de l'unité peuvent être utilisées.
Voyons le code du programme principal de notre programme utilisant l'unité transform.
program
hello;
//appel de l'unite
uses
tranform;
BEGIN
setTexte(' hello world -- darrylsite -- developpez.com --'
);
animation;
END
.
Lorsque que plusieurs unités ont les mêmes noms pour des identificateurs, on peut précéder le nom de l'identificateur du nom de l'unité qui le contient, suivi d'un point. Et ceci est indispensable si on veut utiliser des variables, des types ou des constantes déclarées dans la partie interface d'une unité.
program
hello;
//appel de l'unite
uses
tranform;
BEGIN
Transform.setTexte(' hello world -- darrylsite -- developpez.com --'
);
Transform.animation;
END
.
VI-D. Importation d'unités▲
Il nous arrive fréquemment de réutiliser des unités provenant d'autres projets. Avec certains compilateurs comme Turbo Pascal ou Free Pascal par exemple, il suffit de mettre l'unité dans le même dossier puis de lancer la compilation. Avec MIDlet Pascal, il faut créer une nouvelle unité dans le projet en cours, puis copier/coller le code de l'ancienne unité dans celle que vous venez de créer.