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 utiliser un composant TListBox ?
- Comment sélectionner un élément par défaut dans un TComboBox ?
- Comment empêcher la saisie dans un composant TComboBox ?
- Comment définir, modifier la largeur de la liste déroulante d'un ComboBox ?
- Comment fixer automatiquement la largeur de la liste déroulante d'un ComboBox en fonction de l'item le plus grand ?
- Comment utiliser le composant TListView ?
- Comment changer les couleurs d'une TListBox ?
- Comment n'avoir que des disques valides dans un DirectoryListBox ?
Le composant TListBox est simple d'utilisation et pourtant très pratique. Quelques fonctions suffisent à l'utiliser. Placez un composant TListBox sur votre fiche. Pour lui ajouter un élément (ligne), il suffit d'utiliser le code suivant :
Code c++ : | Sélectionner tout |
1 2 3 | AnsiString Texte; // Texte =...; ListBox1->Items->Add(Texte); |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | void __fastcall TForm1::ListBox1Click(TObject *Sender) { if (ListBox1->ItemIndex != -1) { if (ListBox1->Items->Strings[ListBox1->ItemIndex].LowerCase() == "auteur") { // Recherche par auteur } } } |
Utilisez la méthode IndexOf de la liste Items des éléments de TComboBox. Mettons que la liste contienne :
Comment vas-tu, Wie geht's, How are you, Como estas ...
Pour sélectionner le second élément, Wie geht's, utilisez le code suivant :
Code c++ : | Sélectionner tout |
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("Wie geht's");
N.B. Si votre ComboBox autorise la saisie (Style = csSimple ou csDropDown), l'affectation à sa propriété Text d'une chaîne de la liste aura le même effet. La méthode exposée ci-dessus prend tout son intérêt dans le cas csDropDoxnList et les deux cas csOwner... .
Lorsque vous souhaitez seulement permettre le choix dans un composant TComboBox et non la saisie, modifiez sa propriété Style.
Code c++ : | Sélectionner tout |
ComboBox1->Style = csDropDownList;
Pour définir la largeur de la liste déroulante d'un TComboBox, il faut intercepter l'évènement OnEnter de ce composant, et utiliser le message CB_SETDROPPEDWIDTH.
Le code suivant montre comment envoyer ce message au TComboBox:
Code c++ : | Sélectionner tout |
1 2 3 4 | void __fastcall TForm1::ComboBox1Enter(TObject *Sender) { ComboBox1->Perform(CB_SETDROPPEDWIDTH, 200, 0); } |
Pour que la liste déroulante d'un TComboBox se redimensionne automatiquement en fonction de son plus grand élément, il faut réaliser un certain nombre d'opérations sur ce composant.
En premier lieu, il faut fixer sa propriété Style à csOwnerDrawVariable. Puis il faut implémenter l'évènement OnDrawItem de façon à réaliser le dessin des éléments de cette liste :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { TCanvas *pC = ComboBox1->Canvas; pC->FillRect(Rect); pC->TextOutA(Rect.Left + 2, Rect.Top, ComboBox1->Items->Strings[Index]); } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void __fastcall TForm1::ComboBox1Enter(TObject *Sender) { TCanvas *pC = ComboBox1->Canvas; int Base = 0, Final; for (int i = 0; i < ComboBox1->Items->Count; i ++) { if (pC->TextExtent(ComboBox1->Items->Strings[i]).cx > Base) { Base = pC->TextExtent(ComboBox1->Items->Strings[i]).cx; } } Final = Base + 7; ComboBox1->Perform(CB_SETDROPPEDWIDTH, Final, 0); } |
Nous allons voir comment utiliser le composant ListView, composant tel celui qui affiche la liste de vos fichiers dans l'explorateur Windows.
Placez sur votre fiche un composant TListView, deux TEdit et un TButton. Lorsqu'on cliquera sur le bouton, une nouvelle ligne sera ajoutée au ListView, avec dans la première colonne, le contenu d'Edit1 et dans la seconde colonne, le contenu d'Edit2. Placez tout d'abord la propriété ViewStyle du composant ListView1 à vsReport. Cliquez sur celui-ci avec le bouton droit, puis sur Éditeur de colonnes. Dans la boîte de dialogue qui s'affiche, cliquez deux fois sur Ajouter un nouveau. Cela fait, notre TListView a deux colonnes.
Écrivons maintenant le gestionnaire d'évènements OnClick du bouton Button1.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | void __fastcall TForm1::Button1Click(TObject *Sender) { TListItem *Item = ListView1->Items->Add(); Item->Caption = Edit1->Text; Item->SubItems->Add(Edit2->Text); } |
Il est possible de personnaliser facilement les couleurs d'un composant TListBox. Il suffit de passer sa propriété Style à lbOwnerDrawFixed, et d'implémenter le gestionnaire d'évènement OnDrawItem, qui sera chargé d'effectuer le dessin sur le contrôle.
En voici un exemple :
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 22 23 24 | // on récupère le TListBox qui a lancé l'évènement, et son TCanvas TListBox * pListBox = ((TListBox *)Control); TCanvas * pCanvas = pListBox->Canvas; // on met les lignes paires en fond jaune if ((Index % 2)==0) { pCanvas->Brush->Color = clYellow; } // on met les lignes sélectionnées en jaune sur fond rouge if(State.Contains(odSelected)) { pCanvas->Brush->Color = clRed; pCanvas->Font->Color = clYellow; } // on dessine le fond de la cellule pCanvas->FillRect(Rect); // on dessine le texte de la cellule AnsiString Data = pListBox->Items->Strings[Index]; Rect.left += 2; pCanvas->TextOut(Rect.Left,Rect.Top,Data); |
Enfin, si vous désirez fixer la taille des lignes, qui par défaut sera différente de la taille classique d'un TListBox qui gère son propre dessin, il vous faudra agir sur la propriété ItemHeight.
Voici un code qui permet d'afficher dans un " DirectoryListBox " uniquement les disques valides, c'est une solution parmi d'autres.
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 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int NoDrive0 = 0; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::DirectoryListBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Label1->Caption = DirectoryListBox1->Directory; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { // on élimine de DriveComboBox les lecteurs sans disque // on supprime les messages d'erreur sur les disques UINT oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); int a = DriveComboBox1->Items->Count; // nb de disques // on commence par la fin sinon on a un problème // le lecteur 1 devient 0 après une suppression for(a; a >= 0;a--) { if (DiskSize(a) > -1) { if(NoDrive0 == 0) { DriveComboBox1->Items->Delete(a); // pas de disque on elimine } } } // on retablit les messages d'erreur sur les disques SetErrorMode(oldErrorMode); // on restitue l'ancienne valeur NoDrive0 = 1; } //--------------------------------------------------------------------------- |
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 22 23 24 25 26 27 28 29 | //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Dialogs.hpp> #include <FileCtrl.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TDirectoryListBox *DirectoryListBox1; TDriveComboBox *DriveComboBox1; TLabel *Label1; TButton *Button2; void __fastcall DirectoryListBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Button2Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif |
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.