Bonjour,

J'ai un TListBox avec la propriété lbOwnerDrawFixed. Je gère l'affichage de mes éléments avec ces deux méthodes :

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;
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.
Par contre, je veux maintenant que quand je change de ligne, remettre ma ligne précédemment sélectionnée en bleu donc :
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;
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 !
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 ?