Newsletter Developpez.com

Inscrivez-vous gratuitement au Club pour recevoir
la newsletter hebdomadaire des développeurs et IT pro

FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 119, nombre de questions : 909, dernière mise à jour : 22 décembre 2016  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).

Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.

L'équipe Delphi de Developpez.com.

Commentez


SommaireInterface utilisateurComposantsCréation dynamique - Recherche (6)
précédent sommaire suivant
 

Tous les composants Delphi peuvent être créés au moment de l'exécution du programme. Pour instancier un composant, il suffit d'appeler le constructeur de la classe correspondante. Pour les composants visuels, il faut absolument définir la propriété Parent.

Le composant donné en paramètre de Create est le propriétaire du composant nouvellement créé. Il ne faut pas confondre propriétaire et parent. Le propriétaire est le composant qui se chargera de sa destruction quand il sera lui-même détruit. Le parent est le composant qui sert de référence d'affichage dans la fenêtre.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
Var MonBouton:TButton; 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  { La fenêtre est propriétaire du nouveau bouton } 
  MonBouton := TButton.Create(Self); 
  { mais c'est dans Panel1 qu'il doit s'afficher } 
  MonBouton.Parent := Panel1; 
  { ensuite on définit les autres propriétés } 
  MonBouton.Caption := 'Bouton !'; 
  MonBouton.Left := 10; 
end;
Si aucune référence directe n'est ensuite faite à la variable MonBouton, il est possible de s'en passer :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  With TButton.Create(Self) Do 
  Begin 
    Parent := Panel1; 
    Caption := 'Bouton !'; 
    Left := 10; 
  End; 
end;

Mis à jour le 13 octobre 2013 Nono40

Pour ajouter un évènement à un composant créé dynamiquement, il faut procéder manuellement comme Delphi en mode conception.
En premier lieu, il faut déclarer l'évènement dans la déclaration de votre classe :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
type  
  TForm1 = class(TForm)  
    ...  
  public  
    { Déclarations publiques }  
    { Le nom de la procédure importe peu  } 
    { Mais il FAUT respecter les paramètres  } 
    Procedure MonClickSurBouton  (Sender: TObject);  
  end;
Puis il faut écrire le code de l'évènement :
Code delphi : Sélectionner tout
1
2
3
4
Procedure TForm1.MonClickSurBouton  (Sender: TObject); 
Begin 
  ShowMessage('Click !'); 
End;
Enfin, il faut associer l'évènement au moment de la création des composants :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
With TButton.Create(Self) Do 
Begin 
  Parent := Self; 
  Caption := 'Un bouton !'; 
  { ajout de l'évènement } 
  OnClick := MonClickSurBouton; 
End;

Mis à jour le 13 octobre 2013 Nono40

Pour recherche la référence d'un composant en ne connaissant que son nom et son propriétaire, il faut utiliser la fonction FindComponent du propriétaire. Le résultat de cette fonction est toujours de type TComponent ; il est donc utile d'en transtyper le résultat en fonction du type de composant attendu.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject); 
Var Edit:TEdit; 
begin 
  Edit:=TEdit(Form1.FindComponent('Edit1')); 
  If Edit<>Nil 
    Then ShowMessage(Edit.Text); 
end;

Cette méthode est très utile pour modifier les propriétés d'une série de composants dont les noms peuvent être calculés en boucle. Par exemple, pour effacer le contenu de Edit1.Text à Edit10.Text :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject); 
Var Edit : TEdit; 
    i : Integer; 
begin 
  For i:=1 To 10 Do 
  Begin 
    Edit:=TEdit(Form1.FindComponent('Edit'+IntToStr(i))); 
    If Edit<>Nil 
      Then Edit.Text:=''; 
  End; 
end;

Mis à jour le 13 octobre 2013 Nono40

Dans le cas où plusieurs composants utilisent le même gestionnaire d'évènement, cette affectation pouvant être faite à la conception comme à l'exécution, il est utile de connaître quel composant est à l'origine de l'évènement. C'est le rôle du paramètre Sender contenu dans tous les évènements.

Par exemple, pour connaître le nom du bouton cliqué, même si Button1Click est associé à button2, button3, etc :

Code delphi : Sélectionner tout
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  ShowMessage('Appui sur le bouton :'+TButton(Sender).Name); 
end;

Mis à jour le 13 octobre 2013 Nono40

Pour parcourir tous les composants d'une fiche, il faut utiliser le tableau Components[] de la fiche. L'opérateur Is permet de déterminer si le composant est bien du type souhaité.

Par exemple, pour mettre 'AAA' dans tous les labels de la fiche :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject); 
Var i:Integer; 
begin 
  For i:=0 To ComponentCount-1 Do 
  If Components[i] Is TLabel Then 
    TLabel(Components[i]).Caption:='AAA'; 
end;

Attention, si vous utilisez la méthode Free sur l'un des composants du tableau Components[] pendant la boucle, il faut impérativement effectuer la boucle dans le sens descendant. Par exemple, pour supprimer tous les labels de la fiche :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject); 
Var i:Integer; 
begin 
  For i:=ComponentCount-1 DownTo 0 Do 
  If Components[i] Is TLabel Then 
    Components[i].Free; 
end;

Mis à jour le 13 octobre 2013 Nono40

Les composants TLabel possèdent une propriété FocusControl, qui permet de sélectionner un contrôle lorsque l'on clique sur le label.
Cependant, il n'y a pas de propriété pour effectuer l'opération inverse, à savoir retrouver le label associé à un contrôle.

Le code suivant permet cette recherche :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function SearchLabel(Const Control : TObject) : TLabel ; 
Var 
   Form : TForm   ; 
   I    : Integer ; 
begin 
     Result:=Nil; 
     If Not Assigned(Control) Then 
        Exit ; 
     If Not (Control Is TControl) Then 
        Exit ; 
     Form:=OwnerForm(Control); 
     For I:=0 To (Form.ComponentCount-1) Do 
         If Form.Components[I] Is TLabel Then 
            If (Form.Components[I] As TLabel).FocusControl=Control Then 
               Begin 
                 Result:=Form.Components[I] As TLabel; 
                 Exit; 
               End; 
end;
Si le contrôle n'a aucun label associé, n'est pas dans une fiche, ou n'est pas un contrôle, la fonction renverra Nil. Sinon, elle renvoie directement l'instance TLabel correspondante.

Mis à jour le 21 janvier 2014 Mac LAK

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -