Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-02-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 14-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Puedes usar el evento OnCustomDrawItem del ListView:

Código Delphi [-]
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;

Bye
Responder Con Cita
  #3  
Antiguo 04-03-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
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;
}
y con lo anterior me colorea las filas, todas, en rojo.

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;
tienen los items estáticos, yo tengo como un bucle for y una variable AnsiString llamado cadena que, dependiendo del valor que tenga, AB, BB, CB ... coloree la linea de un color u otro.

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?
Responder Con Cita
  #4  
Antiguo 04-03-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 04-03-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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;
}
Responder Con Cita
  #6  
Antiguo 11-03-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
Wenas una vez más, sobre lo de :
Cita:
tu código nunca llama al evento OnCustomDrawItem. En este evento deben estar las "instrucciones" necesarias para pintar cada celda
es mas o menos lo que intentaba decir, me explico, el listview que tengo creado está en un Form1 asociado a su respectivo Unit1, y en dicho Unit crearía el evento OnCustomDrawItem para poder colorear las filas, hasta ahí de acuerdo.

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;
          
}
donde ThreadPackets es una class TThread

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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 23:58:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi