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
- Comment donner le focus à un composant?
- Quelle est la différence entre un TTabControl et un TPageControl ?
- Comment faire pour avoir des barres d'outils qui peuvent devenir flottantes ?
- Comment créer des curseurs personnalisés ?
- Comment avoir une barre de progression continue ?
- Comment afficher un TPopupMenu sur un noeud d'un TTreeView?
- Comment mettre une ligne de TTreeView (TNode) en gras ?
- Comment parcourir tous les composants d'une fiche ?
- Comment trouver un composant en connaissant son nom ?
- Comment connaître le composant à l'origine d'un évènement ?
- Comment réaliser une barre d'outils grâce au composant TToolBar ?
Il y a plusieurs solutions pour faire cela. Si vous savez à quel composant vous souhaitez donner le focus, utilisez la méthode SetFocus du composant :
Code c++ : | Sélectionner tout |
Edit1->SetFocus();
Code c++ : | Sélectionner tout |
FocusControl(FindNextControl(ActiveControl, true, true, true));
Regardez l'aide de C++Builder sur FindNextControl pour obtenir la description des arguments suivants.
Deux composants qui paraissent semblables sont disponibles dans la palette de l'IDE : le TTabControl et le TPageControl. La différence réside dans le fait que lorsque vous cliquez sur les onglets d'un TTabControl, les composants placés sur celui-ci ne changent pas : seul l'onglet actif change. Il faut gérer les modifications dans l'évènement OnChange.
Pour un TPageControl, une page est liée à chaque onglet. Donc quand l'onglet change, tout le contenu du TPageControl change. Celui que vous voyez le plus souvent, dans les boîtes de dialogue d'options par exemple (voir les options d'un projet C++Builder) est le TPageControl.
Le TTabControl est utilisé dans les logiciels MDI (Multiple Documents Interface) qui utilisent les onglets pour changer de documents : le contenu du TabControl n'a pas besoin de changer, cela doit rester une zone d'édition, mais dans l'évènement OnChange, on change le contenu de ce fichier.
Utilisez le composant TToolBar et changez ses propriétés DragKind et DragMode.
Code c++ : | Sélectionner tout |
1 2 | DragKind = dkDock; DragMode = dmAutomatic; |
En plus des curseurs par défaut disponibles avec C++Builder, il est possible de créer ses curseurs souris personnalisés. Cela peut être fait rapidement en suivant le tutoriel de Gilles Louise dont le lien figure ci-dessous.
Par défaut, la barre de progression TProgressBar se divise en petites sections. Si vous souhaitez avoir une bande continue, positionnez la propriété Smooth de cette barre de progression à true.
Le composant TTreeView offre la possiblité de lui affecter un composant TPopupMenu en renseignant la propriété PopupMenu. Cependant le menu associé sera valable pour tous les éléments et les noeuds du TreeView. Si vous voulez affecter des menus différents selon le niveau de noeud sélectionné, alors vous devez en faire la gestion vous même.
Voici un exemple permettant d'afficher un menu sur le click droit de la souris mais uniquement pour les noeuds de niveau 1. Pour le tester n'oubliez pas de laisser vide la propriété PopupMenu de votre TreeView.
Exemple:
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | void __fastcall TForm1::TreeView1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { TTreeNode *tNode; tNode = TreeView1->GetNodeAt(X, Y); if(tNode == NULL) { return; } if(tNode->Level == 1 && Button == mbRight) { TreeView1->Selected = tNode; PopupMenu1->Popup(X+this->Left+TreeView1->Left, Y+this->Top+TreeView1->Top+45); } } |
Pour modifier un noeud TNode, il faut utiliser la structure TTVItem :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | TTVItem* tvi = new TTVItem(); tvi->hItem = node->ItemId;//node est le TNode à mettre en gras tvi->mask = TVIF_STATE; tvi->stateMask = TVIS_BOLD; tvi->state = TVIS_BOLD; TreeView_SetItem(node->Handle, tvi); |
Pour parcourir l'ensemble des composants d'une fiche, vous pouvez utiliser la propriété Components.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | void __fastcall TForm1::Button1Click(TObject *Sender) { for (int i=0 ; i < Form1->ComponentCount ; i++) { ShowMessage(Form1->Components[i]->Name); } } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | void __fastcall TForm1::ShowComponents(TComponent *Component) { for (int i=0 ; i<Component->ComponentCount ; i++) { ShowMessage(Component->Components[i]->Name); ShowComponents(Component->Components[i]); } } void __fastcall TForm1::Button1Click(TObject *Sender) { ShowComponents(Form1); } |
Pour rechercher la référence d'un composant en ne connaissant que son nom et son propriétaire, il faut utiliser la méthode FindComponent du propriétaire. Le résultat de cette méthode est toujours de type TComponent, il est donc utile d'en transtyper le résultat en fonction du type de composant attendu.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 | void __fastcall TForm1::Button1Click(TObject *Sender) { TEdit *edit = dynamic_cast <TEdit*> (Form1->FindComponent("Edit1")); if (edit != NULL) { edit->Text = "Texte modifié"; } } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | void __fastcall TForm1::Button1Click(TObject *Sender) { TEdit *edit = NULL; for(int i=1 ; i<=10 ; i++) { edit = dynamic_cast<TEdit *> (Form1->FindComponent("Edit"+IntToStr(i))); if (edit != NULL) { edit->Text = "Texte modifié"; } } } |
Dans le cas ou plusieurs composants utilisent le même gestionnaire d'évènement il peut être nécessaire de connaître quel composant est à l'origine de l'évènement. C'est le rôle du paramètre Sender contenu dans toutes les signatures des méthodes associées à un évènement.
Par exemple, pour connaître le nom du bouton cliqué, même si Button1Click est également associé à Button2, Button3 etc...
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 | void __fastcall TForm1::Button1Click(TObject *Sender) { TButton *Button = dynamic_cast <TButton *> (Sender); if (Button != NULL) { Button->Caption = "Appuyé"; } } |
Pour réaliser facilement une barre d'outils, il vous faut insérer une série d'images dans un composant TImageList que vous allez associer à votre composant TToolBar (propriété Images du composant).
Vous pouvez également charger un seul fichier image dans votre TImageList, il suffit pour cela que votre image dépasse la taille standard d'un fichier icône, le composant vous demandera alors si il faut redimensionner l'image ou si il faut le couper en plusieurs icônes.
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.