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 bisComposantsLes listes (8)
précédent sommaire suivant
 

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);
En fait, la classe TListBox contient une instance de la classe TStringList qui représente les lignes : Items. Donc pour ajouter des éléments, nous utilisons les méthodes de Items. Pour ajouter un élément, on utilise la méthode Add de cette liste Items, ce qui donne ListBox1->Items->Add(Texte). Ensuite, l'utilisation la plus classique est de regarder quel élément a été cliqué si l'utilisateur double-clique dans la liste. Voici donc la fonction-gestionnaire d'évènements OnDblClick :

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 
    } 
  } 
}
Tout d'abord, nous vérifions qu'un élément est bien sélectionné, grâce à ItemIndex qui est positionné à -1 si aucun élément n'est sélectionné, sinon, une erreur de violation d'accès serait déclenchée car l'élément d'indice -1 n'existe pas. Ensuite, pour accéder à un élément, nous utilisons toujours le membre Items, avec son membre Strings qui est le tableau contenant les chaînes.

Mis à jour le 1er septembre 2004 Geronimo

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");
IndexOf retourne l'indice d'un élément et ItemIndex contient l'indice de l'élément sélectionné.

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

Mis à jour le 1er septembre 2004 Alacazam Geronimo

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;
N.B. La valeur initiale de ce composant ne pouvant plus être initialisée par sa propriété Text, utilisez alors la méthode décrite dans le lien ci-dessous

Mis à jour le 1er septembre 2004 Alacazam

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); 
}
Dans C++ Builder, dans le Menu : Aide | SDK Windows, on peut retrouver la définition de CB_SETDROPPEDWIDTH ainsi que les messages s'appliquant au TComboBox - tels que CB_GETDROPPEDWIDTH ou CB_SHOWDROPDOWN par exemple - de manière à bien voir les paramètres attendus et les valeurs renvoyées.

Mis à jour le 10 décembre 2007 Pascal Jankowski Sunchaser

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]); 
}
Enfin, il faut implémenter l'évènement OnEnter afin de calculer la longueur des éléments et de positionner la largeur de la liste déroulante :

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); 
}

Mis à jour le 10 décembre 2007 Sunchaser

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); 
}
On déclare un pointeur sur un TListItem. Un TListItem représente un élément de TListView. La méthode Add crée ce nouveau TListItem et l'ajoute à ListView1. Ensuite, on attribue le contenu de Edit1 à la propriété Caption du nouvel élément. Ensuite, on ajoute le contenu de Edit2 aux sous-éléments de Item.

Mis à jour le 1er septembre 2004 Geronimo

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);
Vous remarquerez que les deux premières lignes vous permettent d'utiliser le même gestionnaire d'évènement pour autant de TListBox que vous le souhaitez. Il vous suffit de positionner leur propriété Style, et de relier leur évènement OnDrawItem à cette fonction.

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.

Mis à jour le 25 avril 2005 CGi Greybird

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

Mis à jour le 21 novembre 2010 blondelle

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.