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 :

Modifier la couleur d'un seul objet d'une ListBox


Sujet :

Composants VCL Delphi

  1. #1
    Membre actif Avatar de [Silk]
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 198
    Points : 201
    Points
    201
    Par défaut Modifier la couleur d'un seul objet d'une ListBox
    Salut,
    dans mon application j'ai une listbox qui me sert de fichier log et je vaudrait pouvoir changer la couleur de la ligne en fonction de ce qu'il y a dans le log par exemple s'il y a une erreur alors on affiche la ligne en rouge.

    J'ai éssayé avec sa : (Ma listBox est en style OwnerDrawFixed)
    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
     
    procedure TMainForm.ProcessesDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var
    pCanvas : TCanvas;
    begin
    pCanvas := TListBox(control).Canvas;
    if Couleur = 'blue' then
    begin
     pCanvas.Font.Color := clBlue;
    end;
    if Couleur = 'red' then
    begin
     pCanvas.Font.Color := clRed;
    end;
    if Couleur = 'green' then
    begin
     pCanvas.font.Color := clGreen;
    end;
    if Couleur = 'teal' then
    begin
     pCanvas.Font.Color := clTeal;
    end;
     
    pCanvas.TextOut(Rect.Left,Rect.Top,
                    (Processes.Items.Strings[Index]));
     
    end;
    mais la seule chose que j'arrive à obtenir c'est le changement de couleur de toute ma ListBox
    Comme j'ai adapté un code trouvé en C++ je me demande si je n'ai pas fait une erreur quelque part. Je n'ai pas réussi à traduire le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       if(State.Contains(odSelected))  //ligne selectionnée
    Le code que j'avais trouvé était :
    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
     
    void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State)
    {
          TCanvas *pCanvas = ((TListBox *)Control)->Canvas;
     
          if ((Index%2)==0) pCanvas->Brush->Color = clYellow;
          // met 1 ligne sur 2 jaune
     
          if(State.Contains(odSelected))  //ligne selectionnée
                           {
                            pCanvas->Brush->Color = clRed;
                            pCanvas->FillRect(Rect);
                            pCanvas->Font->Color = clYellow;
                           }
          else pCanvas->FillRect(Rect);  //Les autres lignes
     
          //Il faut réécrire les Items.
          pCanvas->TextOut(Rect.Left+5,Rect.Top+2,
                    ((TListBox *)Control)->Items->Strings[Index]);
    }
    merci d'avance
    Silk

  2. #2
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Bonjour, le principe est correct mais le problème c'est couleur.

    comment couleur est il placé à red, teal, yellow ?


    j'aurais plus vu un tableau de couleur dont l'index correspondrait à celui de l'item.

  3. #3
    Membre actif Avatar de [Silk]
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 198
    Points : 201
    Points
    201
    Par défaut
    Par le biais de cette procedure pour ajouter un item dans ma listBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Procedure TMainForm.AddItem(ListBox : TListBox; Item : String; Clr : string);
    begin
    ListBox.Items.Add(FormatDateTime('dd/mm/yyyy',now) +' à '+FormatDateTime('hh:mm:ss',now) + ' : '+Item);
    ListBox.ItemIndex := ListBox.Items.count-1;
    If SaveLogBox.Checked then
    begin
     LogFile.Lines.Add(FormatDateTime('dd/mm/yyyy',now) +' à '+FormatDateTime('hh:mm:ss',now) + ' : '+Item);
     SaveLog;
    end;
    Couleur := clr;
    end;
    Silk

  4. #4
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    oui, mais a chaque paint de ta list box, tu vas utiliser la mêm couleur pour tous les items.

    il faudrait avoir une couleur par item du genre

    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
    30
    31
    32
    33
     Type TColorArray = array of TColor;
     
     
    private 
      FItemColors : TColorArray;
     
     
     
    Procedure TMainForm.AddItem(ListBox : TListBox; Item : String; Clr : string); 
    begin 
    ListBox.Items.Add(FormatDateTime('dd/mm/yyyy',now) +' à '+FormatDateTime('hh:mm:ss',now) + ' : '+Item); 
    ListBox.ItemIndex := ListBox.Items.count-1; 
    If SaveLogBox.Checked then 
    begin 
     LogFile.Lines.Add(FormatDateTime('dd/mm/yyyy',now) +' à '+FormatDateTime('hh:mm:ss',now) + ' : '+Item); 
     SaveLog; 
    end; 
    SetLength(FItemColors, length(FItemColors) + 1);
    FItemColors[high(FItemColors)] := clr; 
    end;
     
     
    procedure TMainForm.ProcessesDrawItem(Control: TWinControl; Index: Integer; 
      Rect: TRect; State: TOwnerDrawState); 
    var 
    pCanvas : TCanvas; 
    begin 
    pCanvas := TListBox(control).Canvas; 
    pCanvas.Font.Color := FItemColors[index];
    pCanvas.TextOut(Rect.Left,Rect.Top, 
                    (Processes.Items.Strings[Index])); 
     
    end;

  5. #5
    Membre actif Avatar de [Silk]
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 198
    Points : 201
    Points
    201
    Par défaut
    Le problème c'est que je ne peux pas savoir à l'avance la couleur de mon item. Je vais essayer de me débrouiller en bidouillant par rapport à ce que tu ma dit avec un tableau.

    Je te tient au courant

    EDIT mais attend sa ne peut pas marcher ton code sa va juste changer la couleur de toute la listbox en fonction de l'index c'est tout.
    Silk

  6. #6
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    salut ,
    voila une procedure qui affiche chaque items d'une couleur differente

    pour simplifier j'ai deja mis les couleur directement dans le listbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
        with ListBox1.Canvas do
        begin
            brush.color:=stringtocolor(ListBox1.Items[index]);
            fillrect(Rect);
            textOut(Rect.Left+2,Rect.top+2,ListBox1.Items[index]);
        end;
    end;
    une autre solution dans le meme genre est un tableau avec deux colonnes donc une "invible" dans la quelle tu stockes la couleur que doit avoir ta ligne , tu utilises ensuite celle valeur dans le OnDrawCell
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  7. #7
    Membre actif Avatar de [Silk]
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 198
    Points : 201
    Points
    201
    Par défaut
    salut,
    je n'ai pas encore testé ta méthode petitcoucou mais je me suis trompé sur ce que ma dit bjl son code marche mais j'ai une violation d'accès (la ligne se colore quand meme) sa pourrait vnir d'où ?
    Je vais tester ta méthode maintenant en attendant une réponse

    A+
    Silk

  8. #8
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Elle est à quel moment ta violation d'accès ,

    c'est peut être à cause de çà ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetLength(FItemColors, length(FItemColors) + 1); 
    FItemColors[high(FItemColors)] := clr;
    est à mettre avant de rajouter l'item (qui doit appeler tout de suite le repaint et appeler un index de tableau inexistant)

  9. #9
    Membre actif Avatar de [Silk]
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 198
    Points : 201
    Points
    201
    Par défaut
    oups je n'y avais pas fait gaffe mais effectivement je créait l'item avant d'ajouter la couleur dans le tableau.
    ça marche nickel !

    merci beaucoup !

    A+
    Silk

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

Discussions similaires

  1. [OL-2010] Modifier la couleur (noire) de l'objet d'un message sortant
    Par mfanfan dans le forum Outlook
    Réponses: 0
    Dernier message: 18/06/2015, 20h56
  2. Réponses: 12
    Dernier message: 13/08/2009, 09h31
  3. Réponses: 0
    Dernier message: 24/04/2008, 22h53
  4. Réponses: 3
    Dernier message: 05/07/2006, 17h29
  5. Réponses: 3
    Dernier message: 08/06/2006, 11h53

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