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 :

[D7] Couleur de la ligne sélectionnée d'un TListView


Sujet :

Composants VCL Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut [D7] Couleur de la ligne sélectionnée d'un TListView
    Rebonjour,

    Est il possible de changer la couleur de la ligne sélectionnée dans un TListView ?

    Je ne trouve rien de probant à ce sujet. L'affichage de la sélection semble se faire après le OnCustomDrawItem ?

    Merci
    A+
    Charly

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    J'ai trouvé une solution : il faut utiliser SetSysColors mais attention cela impacte tout Windows et pas seulement le TlistView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Const
       cElements = 2;
    Var
       aElements : Array [1..cElements] of Integer;
       aRgbValues: Array [1..cElements] of Integer;
    Begin
       aElements[1] := COLOR_HIGHLIGHT  ;
       aRgbValues[1]:= ColorToRGB( Color3 );
       aElements[2] := COLOR_HIGHLIGHTTEXT;
       aRgbValues[2]:= ColorToRGB( clBlack );
       SetSysColors( cElements, aElements, aRgbValues );
    End ;
    En quittant, il ne faut pas oublier de remettre les couleurs à leurs couleurs d'origine.

    et ce n'est pas terrible de toucher aux couleurs systèmes !

    A+
    Charly

  3. #3
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Il me semble avoir déjà fait ce type de chose en D6.
    Si j'ai compris, tu as essayé avec OwnerDraw à true et te chargeant du dessin dans l'événement OnCustomDrawItem ?

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour Blonde,

    non, je n'ai pas réussi avec CustomDrawItem ni CustonDrawSubIten. J'ai utilisé SetSysColors pour changer COLOR_HIGHLIGHT, mais ce n'est pas très malin !

    A+
    Charly

  5. #5
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Comme j'ai vu que tu voulais également aligner le texte des items, je me dis que c'est peut-être le moment de dessiner toi-même les éléments dans la liste.
    Je regarde dans l'après-midi pour te faire un exemple. J'ai encore un D6 sur mon poste.

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Ok, merci

  7. #7
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Voici le petit exemple promis, couleur de sélection et alignement des items à droite :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      aCaption : String;
      aRect : TRect;
      MyListView : TListView;
      x, y : Integer;
    begin
      aCaption := Item.Caption;
      MyListView := TListView(Sender);
     
      aRect := Item.DisplayRect(drLabel);
     
      // pour l'alignement à droite de ton texte
      x := aRect.Right - MyListView.Canvas.TextWidth(aCaption);
      y := aRect.Top;
     
     
      if (cdsSelected in State) then
      {il existe encore plein d'autres 'State' --> à regarder dans l'aide}
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := clYellow;
          Font.Color := clRed;
        End;
      End
      else
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := clWhite;
          Font.Color := clBlack;
        End;
      End;
     
      with MyListView.Canvas do
      Begin
          Rectangle(aRect);
          TextRect(aRect, x, y, aCaption);
      End;
     
      DefaultDraw := false;
    end;

    N'oublie pas le OwnerDraw à true.

    Est-ce que ta liste est éditable ?

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Merci, je teste cela dès demain.

    Ma liste est readOnly, mais RowSelect à True.

    Ce n'est pas le Caption qui est cadré à droite, mais le texte de la colonne 1 (deuxième SubItem)

    A+
    Charly

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour et bonne année 2022 !

    merci ça marche, mais l'icone ainsi que les subitems ont disparus. Il va falloir que je redessine tout (pour le texte ça doit aller, mais pour les images ?)

    A+
    Charly

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    J'ai essayé ça pour dessiner l'icone, mais sans succès :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      aCaption : String;
      aRect : TRect;
      aRect1 : TRect;
      aRect2 : TRect;
      MyListView : TListView;
      x, y : Integer;
      x1, y1 : Integer;
    begin
      aCaption := Item.Caption;
      MyListView := TListView(Sender);
     
      aRect  := Item.DisplayRect(drLabel);
      aRect1 := Item.DisplayRect(drIcon);
      aRect2 := Item.DisplayRect(drBounds);
     
      // pour l'alignement à droite de ton texte
      x := aRect.Right - MyListView.Canvas.TextWidth(aCaption) ;
      y := aRect.Top ;
      x1 := aRect1.Right ;
      y1 := aRect1.Top ;
      if (cdsSelected in State) then
      {il existe encore plein d'autres 'State' --> à regarder dans l'aide}
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := clYellow;
          Font.Color := clRed;
        End;
      End
      else
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := clWhite;
          Font.Color := clBlack;
        End;
      End;
      with MyListView.Canvas do
      Begin
          Rectangle(aRect);
          TextRect(aRect, x, y, aCaption);
          ImageList1.Draw(MyListView.Canvas, x1, y1, 1 ,False) ;
      End;
      DefaultDraw := false;
    end;
    Je ne dois pas dessiner au bon endroit ?

    A+
    Charly

  11. #11
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Voici une autre proposition, mais à retravailler :

    Tu n'as plus besoin du OwnerDraw, et tu enlèves l'appel à CustomDrawItem

    CustomDrawSubItem : va te permettre de dessiner le premier élément mais aussi les subItems.
    Je t'ai mis le dessin de l'icône (depuis une liste d'images), et l'alignement à droite pour la colonne d'indice 1.

    On y est presque, il faut à mon avis que tu dessines la couleur de sélection dans tout les cas, c'est à dire en début de procédure, et sur toute la ligne.


    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    var
      aCaption, aCaptionSub : String;
      aRect, aRectSub : TRect;
      MyListView : TListView;
     
      x, y : Integer;
      xSub, ySub : Integer;
      i : Integer;
    begin
      MyListView := TListView(Sender);
     
     
      if (cdsSelected in State) then
      {il existe encore plein d'autres 'State' --> à regarder dans l'aide}
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := FCouleurFondSelection;
          Font.Color := clRed;
        End;
      End
      else
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := clWhite;
          Font.Color := clBlack;
        End;
      End;
     
     
      if (SubItem = 0) then
      Begin
        aRect := Item.DisplayRect(drLabel);
        aCaption := Item.Caption;
     
        x := aRect.Left;
        y := aRect.Top;
     
        with MyListView.Canvas do
        Begin
            Rectangle(aRect);
            TextRect(aRect, x, y, aCaption);
        End;
        // Ici le dessin de ton icône
        ImageList1.Draw(MyListView.Canvas, 0, aRect.top, Item.ImageIndex);
      End
      else if (SubItem <= Item.SubItems.count) then
      Begin
        aCaptionSub := Item.SubItems[SubItem-1];
     
        aRectSub := Item.DisplayRect(drLabel);
     
        xSub := 0;
        for i:=0 to SubItem-1 do
          xSub := xSub + MyListView.Columns[i].Width;
        aRectSub.Left := xSub;
        aRectSub.Right := xSub + MyListView.Columns[SubItem].Width;
     
        ySub := aRectSub.Top;
        // pour l'alignement à droite de ton texte sur la colonne d'indice 1
        if (SubItem = 1) then
          xSub := aRectSub.Right - MyListView.Canvas.TextWidth(aCaptionSub);
     
        with MyListView.Canvas do
        Begin
            Rectangle(aRectSub);
            TextRect(aRectSub, xSub, ySub, aCaptionSub);
        End;
      End;
     
      DefaultDraw := false;
    end;

  12. #12
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    J'ai essayé ça pour dessiner l'icone, mais sans succès :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      aCaption : String;
      aRect : TRect;
      aRect1 : TRect;
      aRect2 : TRect;
      MyListView : TListView;
      x, y : Integer;
      x1, y1 : Integer;
    begin
      aCaption := Item.Caption;
      MyListView := TListView(Sender);
     
      aRect  := Item.DisplayRect(drLabel);
      aRect1 := Item.DisplayRect(drIcon);
      aRect2 := Item.DisplayRect(drBounds);
     
      // pour l'alignement à droite de ton texte
      x := aRect.Right - MyListView.Canvas.TextWidth(aCaption) ;
      y := aRect.Top ;
      x1 := aRect1.Right ;
      y1 := aRect1.Top ;
      if (cdsSelected in State) then
      {il existe encore plein d'autres 'State' --> à regarder dans l'aide}
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := clYellow;
          Font.Color := clRed;
        End;
      End
      else
      Begin
        with MyListView.Canvas do
        Begin
          Brush.Color := clWhite;
          Font.Color := clBlack;
        End;
      End;
      with MyListView.Canvas do
      Begin
          Rectangle(aRect);
          TextRect(aRect, x, y, aCaption);
          ImageList1.Draw(MyListView.Canvas, x1, y1, 1 ,False) ;
      End;
      DefaultDraw := false;
    end;
    Je ne dois pas dessiner au bon endroit ?

    A+
    Charly
    Je n'ai pas pris le temps de tester ton code, mais je pense que ton y1 devrait être aRect1.Left et pas aRect1.Right. Sinon tu débordes du rectangle dans lequel tu veux dessiner.

  13. #13
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Merci Blonde, c'est super. En fait j'ai neutralisé la colonne 0 qui ne contient que l’icône et j'ai bien ce que je veux

    voici le test :
    TestListView.zip

    Seul regret, à la sélection de la ligne l'icône se grise un peu, mais bon ...

    Merci encore
    A+
    Charly

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/02/2011, 11h54
  2. Datagrid, changer la couleur de la ligne sélectionnée
    Par Golzinne dans le forum Silverlight
    Réponses: 3
    Dernier message: 12/03/2010, 15h44
  3. Réponses: 3
    Dernier message: 25/12/2008, 09h51
  4. MSFlexgrid: couleur de la ligne sélectionnée
    Par GodGives dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 07/11/2008, 18h20
  5. Réponses: 9
    Dernier message: 12/08/2002, 07h38

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