Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

C++

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Interface > Composants > Les listes
        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 ?



Comment utiliser un composant TListBox ?
Créé le 01/09/2004[haut]
auteur : Geronimo
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 :

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 :

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


Comment sélectionner un élément par défaut dans un TComboBox ?
Créé le 01/09/2004[haut]
auteurs : Geronimo, Alacazam
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 :

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

lien : faq Comment empêcher la saisie dans un composant TComboBox ?

Comment empêcher la saisie dans un composant TComboBox ?
Créé le 01/09/2004[haut]
auteur : Alacazam
Lorsque vous souhaitez seulement permettre le choix dans un composant TComboBox et non la saisie, modifiez sa propriété Style.

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

lien : faq Comment sélectionner un élément par défaut dans un TComboBox ?

Comment définir, modifier la largeur de la liste déroulante d'un ComboBox ?
Créé le 10/12/2007[haut]
auteurs : Sunchaser, Pascal Jankowski
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:

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.

lien : faq Comment fixer automatiquement la largeur de la liste déroulante d'un ComboBox en fonction de l'item le plus grand ?

Comment fixer automatiquement la largeur de la liste déroulante d'un ComboBox en fonction de l'item le plus grand ?
Créé le 10/12/2007[haut]
auteur : 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 :

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 :

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);
}
lien : faq Comment définir, modifier la largeur de la liste déroulante d'un ComboBox ?

Comment utiliser le composant TListView ?
Créé le 01/09/2004[haut]
auteur : Geronimo
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 Editeur 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.

Ecrivons maintenant le gestionnaire d'évènements OnClick du bouton Button1.

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.


Comment changer les couleurs d'une TListBox ?
Créé le 25/04/2005[haut]
auteurs : Greybird, CGi
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 :

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


Comment n'avoir que des disques valides dans un DirectoryListBox ?
Créé le 22/11/2010[haut]
auteur : blondelle
Voici un code qui permet d'afficher dans un " DirectoryListBox " uniquement les disques valides, c'est une solution parmi d'autres.
Fichier .cpp :

//---------------------------------------------------------------------------
#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;
}
//---------------------------------------------------------------------------
Fichier .h :
 
//---------------------------------------------------------------------------
#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


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.

Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web