FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 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.
- Comment créer dynamiquement un composant visuel ?
- Comment ajouter un évènement à un composant créé dynamiquement ?
- Comment trouver un composant en connaissant son nom ?
- Comment connaître le composant à l'origine de l'évènement ?
- Comment parcourir tous les composants d'une fiche ?
- Comment retrouver le TLabel associé à un contrôle ?
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; |
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; |
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; |
Code delphi : | Sélectionner tout |
1 2 3 4 | Procedure TForm1.MonClickSurBouton (Sender: TObject); Begin ShowMessage('Click !'); End; |
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; |
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; |
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; |
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; |
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; |
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 çaLes 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 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.