Bonjour,
J'ai un TListBox avec la propriété lbOwnerDrawFixed. Je gère l'affichage de mes éléments avec ces deux méthodes :
Ca marche bien, sauf dans un cas : J'ai une ligne de sélectionnée, je change une propriété qui fait que condition1 est respecté. Visuellement rien ne se passe car la ligne est sélectionnée, mais quand je change de ligne, je vois bien mon texte en gris pour la ligne qui respecte condition1.
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.ListDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin if index=condition1 then List.Canvas.Font.Color := clGray else if odSelected in State then List.Canvas.Font.Color := clHighlightText else List.Canvas.Font.Color := clBlue; ListesDrawItem(List, index, Rect, State, clSombre); end; procedure ListesDrawItem(lbListe: TListBox; Index: Integer; Rect: TRect; State: TOwnerDrawState; clCouleurSombre: TColor); var nCol: integer; bmpImage: Tbitmap; begin nCol := lbListe.ClientHeight div lbListe.ItemHeight; if nCol > 0 then nCol := index div (nCol) + 1 else nCol := 0; with lbListe.Canvas do begin if odSelected in State then brush.color := clHighLight else if nCol mod 2 = 0 then brush.color := clCouleurSombre else brush.color := lbListe.Color; fillrect(rect); bmpImage := Tbitmap(lbListe.Items.Objects[Index]); if bmpImage <> nil then begin bmpImage.Transparent := true; BrushCopy(Bounds(Rect.Left + 5, Rect.top, bmpImage.Width, bmpImage.Height), bmpImage, Bounds(0, 0, bmpImage.Width, bmpImage.Height), clWhite); Rect.left := rect.left + bmpImage.Width + 7; end else Rect.left := rect.left + 5; Rect.right := rect.right - 5; TextRect(rect, rect.Left, rect.Top, lbListe.Items[index]); end; end;
Par contre, je veux maintenant que quand je change de ligne, remettre ma ligne précédemment sélectionnée en bleu donc :
Dans ce cas là, pas d'affichage de mon ancienne sélection en bleu, elle reste grise. Par contre si je vais sur une autre application et que je revient, il y a rafraichissement de mon TListBox et j'ai bien mon affichage en gris !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TForm.ListClick(Sender: TObject); begin if List.Items.count > 0 then begin if not (NomsTableaux.ItemIndex = AncienIndex) then begin condition1 devient false pour AncienIndex; List.Repaint; end; end; end;
Donc j'en conclus que mon List.Repaint ne fais pas le rafraichissement de mon TListBox correctement ... et je n'arrive pas à comprendre pourquoi. J'ai essayé List.Redraw; aussi essayé de faire List.Invalidate avant ... rien n'y fait. Une idée ?
Partager