2012-02-24 21 views
7

Sé que puedo establecer colores personalizados para los artículos cuando los agrego a la lista usando eventos OnDraw, pero quiero cambiar los colores de los elementos en un determinado momento después de que ya estén en la lista.Elementos de color ListView en tiempo de ejecución

¿Hay alguna manera de hacerlo?

+0

No entiendo. Usted dice que puede dibujar un color específico en 'OnDraw'. Si es así, ¿cuál es el problema? –

+0

@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

+0

¿Por qué llamas 'Repaint'? De todos modos, me parece que has hecho una pregunta XY. Lo que realmente quieres hacer es evitar el parpadeo. –

Respuesta

12

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; 
Cuestiones relacionadas