Para volver a dibujar solo ciertos elementos, utilice el método UpdateItems
. Tiene dos parámetros de entrada donde puede especificar el rango de los elementos que se redibujarán. Si va a volver a dibujar solo un elemento, simplemente especifique ese índice como un rango.
En este ejemplo, estoy almacenando el color del elemento en la propiedad TListItem.Data
y desvaneciendo este color en el evento del temporizador. Después de cambiar el valor, llamo a la función UpdateItems
que fuerza al evento del elemento draw a disparar. Y sí, sin DoubleBuffered
establecido, parpadea (incluso cuando configura el intervalo del temporizador, por ejemplo, a 500ms).
procedure TForm1.FormCreate(Sender: TObject);
begin
ListView1.AddItem('Item 1', TObject(clWhite));
ListView1.AddItem('Item 2', TObject(clWhite));
ListView1.AddItem('Item 3', TObject(clWhite));
Timer1.Enabled := True;
end;
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
ListView1.Canvas.Brush.Color := TColor(Item.Data);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
C: Byte;
I: TColor;
procedure ChangeItemColor;
begin
I := TColor(ListView1.Items[0].Data);
C := GetRValue(I);
if C < 150 then C := 255 else Dec(C);
I := RGB(C, C, C);
ListView1.Items[0].Data := TObject(I);
end;
begin
// color change
ChangeItemColor;
// repaint of the item with index 1
ListView1.UpdateItems(1, 1);
end;
No entiendo. Usted dice que puede dibujar un color específico en 'OnDraw'. Si es así, ¿cuál es el problema? –
@DavidHeffernan Si vuelvo a pintar la vista de lista, tiene un parpadeo molesto, así que me preguntaba si existe otro método para lograr dicha funcionalidad. – opc0de
¿Por qué llamas 'Repaint'? De todos modos, me parece que has hecho una pregunta XY. Lo que realmente quieres hacer es evitar el parpadeo. –