FAQ C++ BuilderConsultez toutes les FAQ

Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010  Ajouter une question

 

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe C++ Builder de Developpez.

Commentez cette FAQ : Commentez


SommaireInterface bisComposantsCréation dynamique / Recherche de composants à l'exécution (5)
précédent sommaire suivant
 

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 :

Code c++ : Sélectionner tout
1
2
3
4
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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é".

Mis à jour le 1er septembre 2004 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.

Code c++ : Sélectionner tout
1
2
3
4
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.

Mis à jour le 1er septembre 2004 Geronimo

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éé.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
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; 
}

Mis à jour le 21 juin 2006 Ricky81

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 :

Code c++ : Sélectionner tout
liste = new TList;
Après création d'un objet et initialisation de ses propriétés, ajout du pointeur dans la liste :

Code c++ : Sélectionner tout
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) :

Code c++ : Sélectionner tout
1
2
3
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.

Mis à jour le 1er septembre 2004 Geronimo

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 :

Code c++ : Sélectionner tout
1
2
3
4
void __fastcall TForm1::MonTraiteKeyPress(TObject *Sender, char &Key) 
{ 
   // traitement 
}
Code c++ : Sélectionner tout
1
2
3
TEdit *EditDynamique = new TEdit(this); 
// diverses initialisations 
EditDynamique->OnKeyPress = MonTraiteKeyPress;

Mis à jour le 25 avril 2005 Ricky81

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 © 2020 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.