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

C++Builder Discussion :

ListBox ou ComboBox en couleur


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Par défaut ListBox ou ComboBox en couleur
    Bonjour,

    J'ai trouvé des exemples sur le sites mais mon cas est différent :
    Mon cas :
    Je voudrais ajouter un item à partir d'une autre liste. Au moment de l'ajout, je dois affecter à chaque ligne ajoutée une couleur de texte et une couleur de fond. Là je tourne en rond.
    Je ne vois pas comment le faire.
    Merci pour des conseils

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Au moins deux solutions :

    a) Au niveau des chaines elles-mêmes
    Dans chaque ligne qui est ajoutée, concaténer les deux couleurs avec des caractères de séparation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Chaine = Chaine + "*" + IntToStr(Couleur); + '!' + IntToStr(Couleur);
    Dans la OnDrawItem, il sera possible d'extraire les couleurs :
    - Détecter les séparteurs avec AnsiString:: Pos(..)
    - Tronçonner avec AnsiString:: SubString(..)
    - Convertir avec AnsiString:: ToIntDef(0) ou ToInt() si on est sûr de soi, pour récupérer les couleurs
    On ne représente que le tronçon utile de la chaîne.


    b) En se servant d'objets supplémentaires que l'on ajoute avec InsertObject (voir l'aide).
    Une nouvelle classe dérivée de TComponent par exemple comportant deux propriétés TColor.
    L'extraction des couleurs se fera plus simplement que dans la solution précédente via Items->Objects.

    A plus !

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Par défaut
    Bonjour,
    merci pour votre réponse, mais je ne vois pas comment affecter la couleur de fond à une ligne d'une Listbox.
    Avec l'évènément : ListBox1DrawItem( ), je peux afficher les caractères d'une ligne dans une couleur donnée, mais pas le fond des caractères.

    Merci

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    Pour le 'fond', il faut voir du côté de 'Canvas', 'Brush', 'Color'.
    Chaque ligne peut être d'une couleur différente, avec une font de couleurs différentes de même.

    @+

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Donc pour l'exemple, j'utilise deux TListBox.
    Quant on double clique sur un item de ListBox2 on l'ajoute à ListBox1 avec un objet pour les couleurs.
    Ici, les couleurs sont apportées par un tableau (presque quelconques).

    REM : ListBox1->Style sur lbOwnerDrawFixed

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class jColors : public TComponent
    {
    public :
    TColor BrushColor;
    TColor FontColor;
        __fastcall jColors(TComponent *AOwner, TColor B, TColor F);
        __fastcall ~jColors();
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    __fastcall jColors::jColors(TComponent *AOwner, TColor B, TColor F)
        : TComponent(AOwner)
    {
    BrushColor = B;
    FontColor = F;
    }
     
    __fastcall jColors::~jColors()
    {
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TColor TabColors[8] = {clWhite,
                          clSilver,
                          clBlack,
                          clRed,
                          clGreen,
                          clYellow,
                          clBlue,
                          clFuchsia};

    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
     
    void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
          TRect &Rect, TOwnerDrawState State)
    {
    TListBox *ListBox = (TListBox*)Control;
    jColors *Colors = (jColors*)ListBox->Items->Objects[Index];
     
    ListBox->Canvas->Brush->Style = bsSolid;
    ListBox->Canvas->Brush->Color = Colors->BrushColor;
    ListBox->Canvas->FillRect(Rect);
    ListBox->Canvas->Font->Color = Colors->FontColor;
     
    AnsiString N = ListBox->Items->Strings[Index];
    int he = ListBox->Canvas->TextHeight(N) / 2;
    int x = Rect.Left + 3;
    int y = (Rect.Top + Rect.Bottom) / 2;
    ListBox->Canvas->TextOut(x, y-he, N);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::ListBox2DblClick(TObject *Sender)
    {
    int n = ListBox2->ItemIndex;
    if(n != -1)
        {
        AnsiString N = ListBox2->Items->Strings[n];
        ListBox1->Items->AddObject(N, new jColors(this,
                                                  TabColors[n & 7],
                                                  TabColors[(n + 1) & 7]));
        }
    }
    A plus !

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Par défaut
    Merci
    Votre exemple marche à merveille
    Avec votre permission, je dois l'adapter à mon cas.

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

Discussions similaires

  1. relation entre Listbox et combobox
    Par l3wix dans le forum VB.NET
    Réponses: 0
    Dernier message: 17/08/2007, 17h07
  2. ComboBox et couleur de texte
    Par SoGood dans le forum VB.NET
    Réponses: 3
    Dernier message: 10/07/2007, 12h04
  3. [VB.Net]Liaison entre listbox et combobox
    Par DonF dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/09/2006, 17h44
  4. Combobox avec couleur et font
    Par charaf dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 27/06/2006, 20h12
  5. dégradé sur une listbox avec 1/2 couleurs
    Par avogadro dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/05/2006, 18h21

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