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
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
Mon site : http://lapaille.byethost24.com/index.htm
J'ai trouvé une solution : il faut utiliser SetSysColors mais attention cela impacte tout Windows et pas seulement le TlistView :
En quittant, il ne faut pas oublier de remettre les couleurs à leurs couleurs d'origine.
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 ;
et ce n'est pas terrible de toucher aux couleurs systèmes !
A+
Charly
Mon site : http://lapaille.byethost24.com/index.htm
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 ?
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
Mon site : http://lapaille.byethost24.com/index.htm
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.
Ok, merci
Mon site : http://lapaille.byethost24.com/index.htm
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 ?
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
Mon site : http://lapaille.byethost24.com/index.htm
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
Mon site : http://lapaille.byethost24.com/index.htm
J'ai essayé ça pour dessiner l'icone, mais sans succès :
Je ne dois pas dessiner au bon endroit ?
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;
A+
Charly
Mon site : http://lapaille.byethost24.com/index.htm
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;
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
Mon site : http://lapaille.byethost24.com/index.htm
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager