| auteur : Geronimo | Dans beaucoup de méthodes, on trouve comme argument TObject *Sender. Cet argument est utilisé pour savoir quel est l'objet qui a appelé la méthode. Voici un exemple simple pour clarifier : dans un nouveau projet, placez sur votre fiche deux boutons et double-cliquez sur le premier (Button1). Vous obtenez alors le code suivant :
void __fastcall TForm1:: Button1Click (TObject * Sender)
{
}
|
Sélectionnez maintenant votre deuxième bouton sur la fiche (Button2) et dans l'inspecteur d'objets, onglet évènements, attribuez la méthode Button1Click pour OnClick. Maintenant, la méthode Button1Click est appelée lorsque vous cliquez sur Button1 ou Button2. Sender permet ici de savoir quel objet a appelé Button1Click. Voyez cet exemple :
void __fastcall TForm1:: Button1Click (TObject * Sender)
{
if (dynamic_cast < TButton * > (Sender) = = Button1)
{
ShowMessage (" Button1 " );
}
else
{
ShowMessage (" Button2 " );
}
}
|
Sender étant un pointeur sur TObject, il faut le convertir en un pointeur sur TButton pour pouvoir le traiter. Pour cela, on utilise dynamic_cast. Voici une version plus perfectionnée ci-dessous qui récupère le pointeur sur le bouton et qui agit ensuite sur les propriétés du bouton :
void __fastcall TForm1:: Button1Click (TObject * Sender)
{
TButton * Button;
Button = dynamic_cast < TButton * > (Sender);
if (Button = = Button1)
{
ShowMessage (" Button1 " );
}
else
{
if (Button = = Button2)
{
ShowMessage (" Button2 " );
}
else
{
ShowMessage (" Sender innatendu " );
}
}
Button- > Caption = " Appuyé " ;
}
|
Nous modifions ici le texte affiché du bouton sur lequel on a appuyé et y plaçons "Appuyé".
|
| auteur : Geronimo | Confusion facile. Cependant, Parent et Owner sont deux concepts différents. Le Parent est quelque chose de visuel : le parent d'un composant est celui qui contient ce composant. Le parent d'un TEdit placé directement sur la fiche est la fiche (Form1). Le Owner d'un composant est le composant qui a la charge de détruire celui-ci lors de sa propre destruction. (Mais le Owner peut tout-à-fait être le Parent).
Quand vous créez dynamiquement un composant, vous devez passer le Owner en argument du constructeur. Vous devez ensuite affecter le Parent du contrôle afin qu'il s'affiche.
TPanel * Panel;
TLabel * Label = new TLabel (Form1);
Label- > Parent = Panel;
|
Cela signifie que quand Form1 sera détruite, Label le sera également. Donc dans ce cas, vous ne devez pas faire appel à delete car il y aurait deux delete sur Label ce qui causera des problèmes. Si vous souhaitez garder la main, il suffit de passer NULL en argument du constructeur. Dans ce cas, le contrôle n'ayant pas de Owner vous pouvez (et vous devrez) le détruire quand vous le souhaitez avec delete.
La deuxième ligne indique que le Parent de Label est Panel. Ainsi, Label s'affichera dans Panel, et ses propriétés Top et Left, par exemple, seront relative au Panel.
|
| auteur : Ricky81 |
Tous les composants de C++ Builder 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 par l'intermédiaire du mot clé new. Pour les composants visuels, il faut absolument définir la propriété Parent sinon le composant n'apparaitra pas.
Le composant donné en paramètre du constructeur est le propriétaire du composant nouvellement créé.
TButton * MonBouton;
void __fastcall TForm1:: Button1Click (Sender: TObject);
{
MonBouton := new TButton (this );
MonBouton- > Parent = Panel1;
MonBouton- > Caption = " Bouton ! " ;
MonBouton- > Left = 10 ;
}
|
|
lien : Quelle est la différence entre un 'Parent' et un 'Owner' ?
|
| auteur : Geronimo | Le problème est qu'il faut garder trace des pointeurs pour pouvoir les utiliser et libérer la mémoire à la fin. Pour cela, il est possible d'utiliser la classe TList. La classe TList est une liste de pointeurs toute simple, avec un certain nombre de fonctionnalités pour gérer cette liste.
Création d'une TList : Après création d'un objet et initialisation de ses propriétés, ajout du pointeur dans la liste :
liste- > Add ((void * )monObjet);
|
Pour récupérer un pointeur contenu dans la liste et agir sur l'objet en question (ici nous avons pris un TLabel) :
TLabel * label;
label = (TLabel * )liste- > Items[2 ];
|
A lire également : l'article dont le lien figure ci-dessous.
|
lien : Créer dynamiquement une liste visuelle des images d'un répertoire
|
| auteur : Ricky81 |
Que le composant soit créé dynamiquement ou non, le lien entre un évènement et son implémentation se fait de la même manière. Comme pour un attribut ou une propriété, il suffit d'affecter le nom de la méthode qui va prendre en charge la gestion de l'évènement. Bien entendu, lorsqu'on conçoit son application avec l'inspecteur d'objets, le fait de renseigner le nom des méthodes à côté du nom de l'évènement (onglet évènements de l'inspecteur d'objets) va générer cette association dans le dfm (il vous suffit de faire un clic droit sur la fiche puis Voir comme texte pour le constater).
Exemple :
void __fastcall TForm1:: MonTraiteKeyPress (TObject * Sender, char & Key)
{
}
|
TEdit * EditDynamique = new TEdit (this );
EditDynamique- > OnKeyPress = MonTraiteKeyPress;
|
|
Consultez les autres F.A.Q.
|
|
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 © 2009 Developpez Developpez LLC.
Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne
peut être faite de ce site ni 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.