IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Interface > Composants > Création dynamique / Recherche de composants à l'exécution
        Que représente le TObject *Sender dans les méthodes de la VCL ?
        Quelle est la différence entre un 'Parent' et un 'Owner' ?
        Comment créer dynamiquement un composant visuel ?
        Comment créer dynamiquement un nombre d'objets non connu à l'avance ?
        Comment associer un gestionnaire d'évènements à un composant créé dynamiquement ?



Que représente le TObject *Sender dans les méthodes de la VCL ?
Créé le 01/09/2004[haut]
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é".


Quelle est la différence entre un "Parent" et un "Owner" ?
Créé le 01/09/2004[haut]
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.


Comment créer dynamiquement un composant visuel ?
Créé le 21/06/2006[haut]
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);
{
   // La fenêtre est propriétaire du nouveau bouton
   MonBouton := new TButton(this);
   // 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;
}
lien : faq Quelle est la différence entre un 'Parent' et un 'Owner' ?

Comment créer dynamiquement un nombre d'objets non connu à l'avance ?
Créé le 01/09/2004[haut]
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 :

liste = new 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]; // Accède au troisième élément de la liste
// utilisation classique possible de label
A lire également : l'article dont le lien figure ci-dessous.

lien : fr Créer dynamiquement une liste visuelle des images d'un répertoire

Comment associer un gestionnaire d'évènements à un composant créé dynamiquement ?
Créé le 25/04/2005[haut]
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)
{
   // traitement
}

TEdit *EditDynamique = new TEdit(this);
// diverses initialisations
EditDynamique->OnKeyPress = MonTraiteKeyPress;


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

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.