ListView changer la couleur de la ligne sélectionnée

codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 - 10 févr. 2007 à 07:06
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 - 12 févr. 2007 à 10:57
Bonjour,

j'aimerai savoir s'il est possible de changer la couleur de la ligne sélectionnée dans un listview et si oui comment.

D'avance merci

Codial

<!-- / message -->

15 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 févr. 2007 à 11:39
oui on peu,

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.Style := lbOwnerDrawVariable;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with ListBox1.Canvas do begin
       if odSelected in State then begin
          Brush.Color := clBlue;
          font.Color  := clWhite;
          TextRect(Rect,Rect.Left+2,Rect.Top,ListBox1.Items[index]);
       end else begin
          Brush.Color := clWhite;
          font.Color  := clBlack;
          TextRect(Rect,Rect.Left+2,Rect.Top,ListBox1.Items[index]);
       end;
  end;
end;

0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 févr. 2007 à 12:17
Bonjour à tous,

@ Foxy, je pense que la question concernait un Tlistview et que l'exemple donné concerne un Tlistbox à moins que Codial ne se soit trompé ?

L'ami ThWilliam en date du 26/01/2007 avait suggéré avec pertinence que pour le Tlistbox, la propriété "Style" existait et ne devait pas être dans le Oncreate de la fiche.

Voici son code:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
   with ListBox1 do
   begin
      if odSelected in State then
      begin
        Canvas.Brush.Color:= clskyblue; // par exemple
        Canvas.Font.Color:= clwhite;
      end
      else
      begin
        Canvas.Brush.Color:= Color;
        Canvas.Font.Color:= Font.Color;
      end;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]);
   end;
end;


Maintenant avec le Tlistview, je ne pense pas que cela peut s'appliquer.

@+,

Cincap

[url]mailto:/url
0
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 1
10 févr. 2007 à 14:05
Bonjour,

merci pour vos réponses.

Non, je ne me suis pas trompé j'ai bien demandé pour une ListView.

Cordialement

Codial
0
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 1
10 févr. 2007 à 15:00
Bonjour,

merci pour ton aide, mais celà je sais faire et le sujet du lien aussi.
En revanche ce que je n'arrive pas à faire c'est changer la couleur de la ligne sélectionnée.

Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 févr. 2007 à 15:49
Bonjour,

@ codial, voici une piste :

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  x,y,i : integer;
  s:string;
begin
  with Sender as TListView do
  begin
    with Canvas do
    begin
      if Item.Index mod 2 = 1 then
      begin
        Brush.Color := rgb(240,240,255);
      end
      else
      begin
        Brush.Color := rgb(255,255,255);
      end;
      if Item.Selected then
      begin
        Brush.Color := rgb(220,220,255);
        Pen.Style := psDot;
        Pen.Color := clGray;
      end
      else
      begin
        Pen.Style := psSolid;
        Pen.Color := Brush.Color;
      end;
  end;
 end;
 end;

@+,

Cincap

[url]mailto:/url
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 févr. 2007 à 16:00
@ codial,

j'ai oublié pour ton TlistView, propriété "ViewStyle" = vsReport et au moins 2 colonnes et 1 sous élément.

Ceci n'est pas utile et tu peus le supprimer

var
  x,y,i : integer;
  s:string;

@+,

Cincap

[url]mailto:/url
0
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 1
10 févr. 2007 à 17:21
Bonjour,

merci encore pour cette réponse mais il semble que ce ne soit pas la bonne solution.

Merci quand même

Cordialement
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
11 févr. 2007 à 00:07
Bonsoir,

@ codial, je viens de faire le test avec le dernier code et lorsque je sélectionne chaque item sur les 6, le fond de couleur de chaque item se modifie bien comme demandé.


N. B.   Brush.Color := rgb(240,240,255); peut être remplacé par  Brush.Color := cllime etc....

@+,

Cincap

[url]mailto:/url
0
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 1
11 févr. 2007 à 01:04
Bonjour,

je viens de rééssayer et je ne comprends pas pourquoi ça marche avec toi. Moi je n'y arrive pas!!!!

Tant pis

Encore merci

Cordialement
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
11 févr. 2007 à 10:53
Bonjour,

@ codial, si tu le désires, envoie moi ton adresse émail sur ma boite privée, je te ferais parvenir la source de l'exemple.

A mon avis c'est que tu ne paramètres pas ton listview correctement.

@+,

Cincap

[url]mailto:/url
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
11 févr. 2007 à 12:11
Bonjour,

@ codial, voici un test qui crée tes colonnes et données de ton ListView à l'exécution de la fiche.

La sélection fonctionne correctement (fond vert).

unit Test_2_Unit1;



interface



uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;



type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure Dessine_ListView;
    procedure FormCreate(Sender: TObject);
    procedure ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;



var
  Form1: TForm1;



implementation



{$R *.dfm}




procedure Tform1.Dessine_ListView;
var
  i: integer;
  neauliste: tlistitem;
begin
  listview1.viewstyle : = vsreport;
  with listview1.columns do
  begin
    clear;
    with add do
    begin
      caption := 'Date';
      width := columnheaderwidth;
      alignment := taRightJustify;
      width := 100;
    end;
    with add do
    begin
      caption := 'Valeur';
      width := columnheaderwidth;
      alignment := taRightJustify;
      width := 100;
    end;
    with add do
    begin
      caption := 'Lettre';
      width := columnheaderwidth;
      alignment := taRightJustify;
      width := 100;
    end;
  end;
  randomize; listview1.items.clear;
  for i := 0 to 10 do
  begin
    neauliste := listview1.items.add;
    neauliste.caption := datetostr(now + i);



    neauliste.subitems.add(inttostr(random(100)));
    neauliste.subitems.add(char(ord('a') + (random(25))));
   
  end;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
Dessine_ListView;
end;



procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 with Sender as TListView do
  begin
    with Canvas do
    begin
 if Item.Selected then
      begin
        Brush.Color := cllime;//ou rgb(220,220,255);
        Pen.Style := psDot;
        Pen.Color := clGray;
      end
      else
      begin
        Pen.Style := psSolid;
        Pen.Color := Brush.Color;
    end;
    end;
    end;
end;

end.



@+,

Cincap

[url]mailto:/url
0
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 1
12 févr. 2007 à 10:06
Bonjour,

j'ai essayé à partir de ton exemple, celà fonctionne pour les colonnes 1 et 2 mais la colonne 0 reste en bleue.

Cordialement
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
12 févr. 2007 à 10:31
Bonjour,

@ codial, si pour la 1ère colonne tu as la couleur bleue (avec Delphi6 c'est vert et ce n'est que la largeur du texte qui garde sa couleur car la colonne est aussi colorée comme les autres), qu'est ce qui t'empêche d'utiliser cette même couleur dans le code

Brush.Color := clblue //couleur de la selection par défaut

ou de mettre la propriété de rowselect à true pour avoir la sélection en bleu sur toutes les colonnes.

Sinon, je ne vois pas.

@+,

Cincap
[url]mailto:/url
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
12 févr. 2007 à 10:44
@ codial, en désactivant tout le code dans la procédure

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);

et en mettant les propriétés "RowSelect" et "HotTrack" à true, on obtient la sélection de toutes les colonnes avec la couleur par défaut, (chez moi en vert).

Je ne sais pas si tu sais changer cette couleur par défaut.

@+,

Cincap

[url]mailto:/url
0
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 1
12 févr. 2007 à 10:57
Bonjour,

non, justement je veux changer la couleur bleue de la ligne par ma couleur, car les sélections de tous les autres controls DBGrid ont la couleurs:
   Dbgrid1.Canvas.Font.Style := [fsBold];
    Dbgrid1.Canvas.Font.Color:=clBlack;
    Dbgrid1.Canvas.Brush.Color := cl3DLight ;

et je cherche à garder une certaine homogénéitédans l'interface.

Cordialement
0
Rejoignez-nous