[TListBox] Problème refresh
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:
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:
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 ?