FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Colorear filas de un ListView
Hola a todos!
alguién sabe cómo colorear las filas de un ListView según una determinada condición? como por ejemplo: nombre calle pais los que viven en españa, pintar toda la fila de color verde, lo de brasil azul y asi.... gracias |
#2
|
|||
|
|||
Puedes usar el evento OnCustomDrawItem del ListView:
Bye |
#3
|
|||
|
|||
Hola de nuevo, gracias por la contestación. Lo he estado probando en builder
Código:
void __fastcall TForm1::ListViewCustomDrawItem(TCustomListView *Sender, TListItem *Item, TCustomDrawState State, bool &DefaultDraw) { this->ListView->Canvas->Brush->Color = clRed; } el ejemplo: Código:
procedure TForm1.ListView1CustomDrawItem( Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Item.SubItems[1] = 'mexico' then Sender.Canvas.Brush.Color := RGB($66,$99, $66) else if Item.SubItems[1] = 'españa' then Sender.Canvas.Brush.Color := RGB($ff,$cc, $33) else if Item.SubItems[1] = 'brasil' then Sender.Canvas.Brush.Color := RGB($00,$66, $ff); // Dejar que pinte el texto normalmente DefaultDraw := true; end; Comento esto porque creo que el el evento OnCustomDrawItem del ListView, corregirme si me equivoco, sólo se puede llamar desde donde está creado el ListView, si es en el Form1, se llama desde el Form1. Pero el bucle for que he comentado antes, está en un método de una clase que está en otro unit distinto al que contiene el Form1, por tanto no se puede usar?? Qué otras opciones tengo para colorear las filas de un ListView que sea dentro del for ya que la variable cadena va machacando su valor en cada iteración? |
#4
|
|||
|
|||
Creo que no estás enfocando correctamente el problema.
Un evento- como lo es OnCustomDrawItem -no es un método que deba llamarse desde ningún punto específico de tu código (se puede pero no se debe), sino que es el entorno quien se encarga de llamarlo cuando sea oportuno. Lo anterior, llevado al caso particular del pintado de un ListView, significa que tú no te encargas de pintar el control de manera explícita (como lo sería iterar con un ciclo sobre las filas, tratando de aplicar ese evento a cada fila). Tú simplemente le "dejas" al entorno las instrucciones de cómo pintar. Cuando el entorno requiera pintar una celda, llamará al evento OnCustomDrawItem, en caso de haber uno definido. Pero cuándo se debe pintar una celda en específico, lo determina ese entorno y no tu código. En resumen, tu código nunca llama al evento OnCustomDrawItem. En este evento deben estar las "instrucciones" necesarias para pintar cada celda. Si dichas instrucciones cambian por algún factor externo (el valor de una variable, por ejemplo) que está bajo tu control, entonces deberás llamar al método Refresh del control apenas cambies dicho factor. Con esto obligas al entorno a repintar el control y, por ende, a aplicar las instrucciones atendiendo a los nuevos valores. Bye |
#5
|
||||
|
||||
Código:
void __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender, TListItem *Item, int SubItem, TCustomDrawState State, bool &DefaultDraw) { if (SubItem == 1) { Sender->Canvas->Brush->Color = 0x669966; } else if (SubItem == 2) { Sender->Canvas->Brush->Color = 0xffcc33; } else if (SubItem == 3) { Sender->Canvas->Brush->Color = 0x0066ff; } DefaultDraw = 1; } |
#6
|
|||
|
|||
Wenas una vez más, sobre lo de :
Cita:
pero, el problema es que mi variable a tener en cuenta para pintar de un color u otro las filas de listview está dentro de un thread alojado en otro unit, ese thread se comporta como un bucle for, que, en cada iteración va cambiando la variable en cuestión, por tanto la forma que veo de colorear las filas del listview sería en el mismo Unit donde tengo el thread, por tanto no podría usar el evento OnCustomDrawItem. he intentado algo como: Código:
void __fastcall ThreadPackets::Execute() { ... Synchronize(UpdateListView); } void __fastcall ThreadPackets::UpdateListView() { TListItem* item = Form1->ListView->Items->Add(); item->Caption = cadenaIDx; item->SubItems->Add(cadenaTIm); item->SubItems->Add(cadenaPRt); if (cadenaPRt == "TCP") { Form1->ListView->Canvas->Brush->Color = clGreen; } else Form1->ListView->Canvas->Brush->Color = clRed; } pero no me pinta nada y he visto por internet algo sobre el backcolor, pero en builder no está la opción de Form1->ListView->Backcolor? hay alguna forma? gracias |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
colorear filas de un dbgrid | soyhugo | Varios | 4 | 06-08-2010 00:20:37 |
Colorear filas de un dbgrid | makinita | C++ Builder | 2 | 08-08-2006 17:50:58 |
Colorear filas de un grid en concreto | superhopi | OOP | 9 | 12-08-2005 01:09:56 |
colorear filas dbgrid | merlin | OOP | 1 | 17-12-2004 18:30:55 |
Colorear filas pares rxDBGrid?????? | mguixot | OOP | 1 | 08-09-2003 15:50:52 |
|