Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Colorear filas de un ListView (https://www.clubdelphi.com/foros/showthread.php?t=53221)

Ziara 14-02-2008 12:49:04

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.... :o

gracias

keyboy 14-02-2008 16:51:54

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

Ziara 04-03-2008 19:36:43

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?

keyboy 04-03-2008 20:24:59

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

cHackAll 04-03-2008 20:43:41

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;
}


Ziara 11-03-2008 19:02:29

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


La franja horaria es GMT +2. Ahora son las 00:00:24.

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