Dans le premier cours (Premières Notions), nous avions déjà un peu abordé la création d'interface-graphique sous Lazarus.
Dans l'exercice de prise en main de Lazarus, nous avions créé l'interface graphique d'un programme permettant d'additionner deux nombres. Cette interface ne comportait que trois types de composants : les étiquettes, les zones de textes et les boutons.
Pour ajouter un de ces composant à l'interface, il vous suffisait de le sélectionner dans la palette des composants standards:
Rappelez vous que Lazarus génère un nom par défaut pour chaque nouveau composant déposé sur le formulaire:
et que les nom de ces composants apparaissent dans le code source (voir le code source)
La partie du code représentée ici, est la déclaration d'une classe. Plus précisément, c'est la déclaration de la classe TForm1 qui représente le formulaire de votre application. Le nom TForm qui figure entre parenthèse est le nom d'une autre classe. Il s'agit d'une classe prédéfine de Lazarus sur laquelle nous reviendrons ultérieurement.
Le texte en blanc est la définition des attributs de la classe TForm1. On voit donc que les attributs de cette classe sont les composants déposés sur le formulaire: les attributs Label1, Label2, Label3 de type TLabel sont les trois étiquettes, les attributs Edit1, Edit2, Edit3 de type TEdit sont les trois zones de texte et enfin l'attibut Button1 de type TButton est le bouton.
En fait, TLabel, TEdit et TButton ne sont pas réellement des types, mais des classes prédéfinies de Lazarus. Ainsi TButton est la classe représentant les boutons, TLabel celle des étiquettes et TEdit, celle des zones de texte.
De manière générale, tous les composants déposés sur l'interface sont des objets appartenant à différentes classes.
Un peu plus bas dans le code, figure la déclaration d'une variable globale nommée Form1 (à moins que cette variable ait été renommée, mais nous supposerons ici pour simplifier les explications que ce n'est pas le cas):
Avec ce que nous avons vu dans la première partie de ce cours, on comprend qu'il s'agit là de la déclaration d'un objet de la classe TForm1. Le formulaire de l'application est donc également un objet: c'est l'objet Form1 de la classe TForm1. Cette instance de la classe TForm1 est créé automatiquement au démarrage de l'application.
Les composants du formulaire sont donc des attributs de cet objet. Cela explique par exemple, pourquoi l'écriture Form1.Edit1 peut être utilisée pour désigner la zone de texte Edit1 du formulaire Form1.
Dès qu'un composant a été déposé sur le formulaire, l'inspecteur d'objet permet de modifier ses propriétés. Il suffit pour cela de sélectionner ce composant, puis de sélectionner la propriété voulue dans l'inspecteur d'objet et de modifier la valeur de cette propriété.
La figure suivante illustre par exemple la modification de la propriété caption du bouton du projet Additionner:
Les propriétés que l'on modifie ainsi sont en réalité des attributs de l'objet qui représente ce composant. On peut donc également y accéder par programmation. Par exemple, l'instruction:
Form1.BoutonAdditionner.Caption := 'Additionner';
a le même effet que la modification de propriété illustrée par la figure précédente.
Pour aller un peu plus loin dans la représentation d'une interface graphique sous Lazarus, il nous faut introduire une autre notion fondamentale de la programmation objet: il s'agit de la notion d'héritage.
L'héritage est un mécanisme qui a été introduit dans la programmation objet dans le but d'éviter la réécriture inutile de code lorsqu'une classe n'est qu'un cas spécial d'une autre classe:
La classe plus spécialisée est appelée sous-classe et la classe plus générale, classe mère.
Lorsqu'une relation d'héritage est définie entre deux classes, la sous-classe hérite de tous les attributs et méthodes de la classe mère. C'est à dire que tout se passe comme si les attributs et méthodes de la classe mère avaient été explicitement définies pour la sous-classe.
Une sous-classe d'une classe donnée représente donc une sorte de cas particulier de cette classe qui possède des attributs et méthodes supplémentaires et spécifiques.
Revenons un instant sur la déclaration de la classe TForm1 du projet Addition:
et plus précisément sur la première ligne de cette déclaration de classe:
TForm1 = class (TForm)
Cette ligne de code définie la classe TForm1 comme une sous-classe de TForm
TForm est une classe prédéfinie de Lazarus qui représente l'interface graphique par défaut. C'est à dire un formulaire sans composant. Cette classe possède déjà un certain nombre de méthodes et d'attributs. Par exemple la méthode Close qui permet de fermer le formulaire, l'attribut Caption qui permet de lui donner un titre.
Comme TForm1 est une sous-classe de TForm, elle hérite de tout les attributs et de toutes les méthodes de la classe TForm. Vous pouvez donc accéder au titre de votre formulaire par Form1.Caption et le fermer en lui appliquant la méthode Close.
Les attributs spécifiques de TForm1 sont les composants qui ont été déposés sur le formulaire. Ses méthodes spécifiques sont les procédures évènementielles associées à ces composants.
Tout comme TForm1, les composants de l'interface ont des classes mère qui représentent en quelque sorte des "composants abstraits". La figure suivante montre l'arborescence (très simplifiée) des classes Lazarus intervenant dans la représentation d'une interface graphique:
On voit que de nombreux composants graphiques héritent de la classe TControl. C'est par exemple le cas des composants que vous connaissez déjà: les zones de texte (classe TEdit), les zones de liste (classe TListBox), les étiquettes (classe TLabel) ainsi que les boutons (classe TButton) sont des sous-classes de TControl. De plus, le formulaire lui même est un objet de la classe TControl, car TForm1 est une sous-classe TForm qui est elle-même une sous-classe de TControl.
Il est donc utile de connaitre les méthodes et attibuts de cette classe. En voici quelques uns:
La classe mère de tous les composants graphiques est TComponent. L'attribut name de cette classe contient le nom du composant. Tout composant graphique possèdent donc cet attribut.
Enfin, pour terminer, TComponent est une sous-classe de TObject, la classe mère de toutes les classes en Pascal Objet. Elle posséde une méthode ClasseName, qui retourne le nom de la classe à laquelle appartient un objet. Cette méthode existe par conséquent pour toutes les classes.