I. Créer un composant dynamiquement▲
On a parfois besoin d'ajouter des composants au cours d'un programme. Bien sûr, on peut parfois les cacher pour les afficher quand on en a besoin ; mais, dans certains cas, on ne sait pas à l'avance combien de composants on aura besoin. C'est pourquoi on crée les composants dynamiquement.
On va prendre l'exemple de la création d'un bouton (TButton). Assuez-vous d'abord que StdCtrls est bien dans la liste des uses, car c'est dans cette unité que les TButton sont déclarés. Ensuite, on va déclarer une variable : on l'appelle Btn (contraction de Button) et c'est un TButton. Maitenant qu'il est déclaré, il faut le créer en utilisant la propriété Create du TButton :
constructor
TButton.Create(AOwner: TComponent);
La propriété Owner permet de connaître le propriétaire d'un composant. Lorsqu'un composant en possède un autre, la mémoire du composant possédé est libérée quand la mémoire du propriétaire est libérée. Ainsi, cela signifie que lorsqu'une fiche est détruite, tous les composants de la fiche le sont également. Lors de sa destruction, le propriétaire libère le composant. Dans pratiquement tous les cas, le propriétaire est la fiche (Form1, par défaut). Au lieu de spécifier Form1, on peut utiliser simplement self.
var
Btn: TButton;
begin
Btn := TButton.Create(Self
);
end
;
Une erreur fréquente est de mettre seulement Btn.Create(Self). En faisant cela, vous provoquez une erreur lors de l'exécution du programme. Si vous l'exécutez maintenant, vous ne verrez pas votre bouton. En fait, il est juste créé en mémoire. Il faut l'afficher. Pour l'afficher, on définit le Parent du composant, c'est-à-dire, le contrôle qui affichera le composant. Dans notre exemple, on choisit encore une fois Form1.
var
Btn: TButton;
begin
Btn := TButton.Create(Self
);
Btn.Parent := Self
;
end
;
Si vous testez le programme, un bouton apparaîtra dans l'angle en haut à gauche, sans rien d'écrit. On peut changer ses propriétés, comme pour un composant habituel.
Astuce : Au lieu de répéter le nom de la variable à chaque ligne, vous pouvez utiliser With, même pour la première ligne !
With
TButton.Create(self
) do
begin
Parent := Self
;
Left := 200
;
{...}
end
;
Cela vous fait l'économie d'une variable !
Maitenant, vous voulez peut-être associer une procédure à l'événement OnClick. Il suffit de faire comme cela :
type
TForm1 = class
(TForm)
procedure
MaProcedure(Sender: TObject); // A ajouter
{...}
procedure
TForm1.MaProcedure(Sender: TObject);
begin
ShowMessage('Bouton cliqué !'
);
end
;
procedure
TForm1.Button1Click(Sender: TObject);
begin
With
TButton.Create(self
) do
begin
Parent := Self
;
// on peut modifier ici d'autres propriétés
OnClick := MaProcedure;
end
;
end
;
end
.
Notez qu'il est obligatoire de déclarée la procédure dans type, ce qui est facultatif lors d'une procédure/fonction classique.