IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Combobox avec une image devant chaque ligne


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 55
    Points : 49
    Points
    49
    Par défaut Combobox avec une image devant chaque ligne
    Bonjour,

    Je suis en train de traduire mon application et pour le choix de la langue, je voudrais une combobox avec sur chaque ligne la langue et un petit drapeau à coté correspondant à la langue.

    Je n'y arrive pas. quelqu'un aurait-il une idée ?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    J'ai résolu le probleme en utilisant le composant TcolumnCombobox de TMS (http://www.tmssoftware.com)
    C'est une combo avec 2 colonnes que j'ai associé à une imagelist.
    Chaque ligne de la combo est associée à une image de l'imagelist.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Voiçi une possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin     ...
              comboBox1.items.clear;
              comboBox1.items.AddObject('France', imgFrance.Picture.graphic);
              comboBox1.items.AddObject('Italie', imgItalie.Picture.graphic);
              comboBox1.items.AddObject('Espagne',imgEspagne.Picture.graphic);
              ...
              comboBox1.ItemIndex:=0;
    end;
    ... et dans mon cas imgFrance, imgItalie, etc sont des petits TImages (rendus invisibles) dont les fichiers *.bmp ont été chargés dans la propriété Picture à la conception.

    A+

    EDIT : Posts croisés.
    ça marche avec un ComboBox standard. Par contre l'idée d'utiliser un TImageList n'est pas mal : ça dégage l'écran en phase de conception si l'on a besoin d'une floppée de drapeaux.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 55
    Points : 49
    Points
    49
    Par défaut

  5. #5
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    Par défaut
    Encore plus simple, aucune programmation.

    Installe la JVCL et utilise le composant TjvListComb(JvImageCombobox) dans la palette Jv Lists, combos, trees. Indique lui une imagelist...et le tour est joué... chaque item peut avoir une image associée...

  6. #6
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Salut,

    Voiçi une possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin     ...
              comboBox1.items.clear;
              comboBox1.items.AddObject('France', imgFrance.Picture.graphic);
              comboBox1.items.AddObject('Italie', imgItalie.Picture.graphic);
              comboBox1.items.AddObject('Espagne',imgEspagne.Picture.graphic);
              ...
              comboBox1.ItemIndex:=0;
    end;
    J'ai essayé sous delphi 6 ça ne fonctionne pas. Il ne faut pas implémenter OnDrawItem ?

  7. #7
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Si, il faut utiliser OnDrawItem....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var marge:integer;
    begin
         // Dessin du fond des lignes en alternant les couleurs
         if index mod 2<>1 then
            begin
                 ComboBox1.canvas.brush.color:=clwhite;
                 ComboBox1.canvas.fillrect(rect);
            end
         else
             begin
                  ComboBox1.canvas.brush.color:=$00F4F3EE;
                  ComboBox1.canvas.fillrect(rect);
             end;
         // Affichage du texte
         ComboBox1.canvas.textout(rect.left+30,rect.top+2,ComboBox1.items[index]);
         if (odSelected in state) then
            begin
                 ComboBox1.canvas.brush.color:=$00F8D1C5;
                 ComboBox1.canvas.fillrect(rect);
                 ComboBox1.canvas.font.color:=clblue;
                 ComboBox1.canvas.font.style:=ComboBox1.canvas.font.style +[fsbold]+[fsitalic];
                 ComboBox1.canvas.textout(rect.left+30,rect.top+2,ComboBox1.items[index]);
            end;
         // Dessin des icônes
         marge := (Rect.Bottom - Rect.Top - imageList1.Height) div 2;
         imagelist1.Draw(ComboBox1.canvas, Rect.Left + 4, Rect.Top + marge, Index);
    end;

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Petitprince a raison : dans la précipitation j'ai oublié d'ajouter le code du DrawItem qui, compte tenu des transferts du style comboBox1.items.AddObject('France', imgFrance.Picture.graphic) effectués lors du FormCreate à partir des drapeaux stockés dans des TImage, est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
      var     bitmap : tBitMap;
    begin     with (Control As tComboBox).canvas do
              begin FillRect(rect);
                    bitmap:=tBitMap(combobox1.items.Objects[Index]);
                    Draw(Rect.left+5,Rect.top+2,bitmap);
                    TextOut(Rect.left+40,Rect.Top+3,combobox1.items[index]);
              end; 
    end;
     
    procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer;
      var Height: Integer);
    begin     height:=20; end;
    ... par contre, l'idée de stocker les drapeaux dans une ImageList est bien meilleure.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher une image sur chaque ligne d'un état
    Par nicolas2603 dans le forum VBA Access
    Réponses: 0
    Dernier message: 20/05/2008, 17h11
  2. Réponses: 2
    Dernier message: 10/11/2006, 14h23
  3. placer une petit image devant chaque lien
    Par HwRZxLc4 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 02/06/2006, 17h25
  4. PB de chargement de combobox avec une requete
    Par bubu1905 dans le forum Bases de données
    Réponses: 9
    Dernier message: 23/03/2005, 16h14
  5. [Composants] TRichEdit: Une police pour chaque ligne
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2003, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo