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 26-06-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
Comportamiento extraño al colorear un ListView

Hola a todos!

Tengo un ListView en el cual, dependiendo de una condición, las filas se pinta de un color u otro, y todo OK en tiempo de ejecución.

Pero cuando termina de sacarme las filas y desplazo el scroll vertical para mirar las filas que quedan arriba o abajo de la pantalla de visualización del ListView, el color pintado se me desaparece, es decir, se me queda el color por defecto designado, que es el color de las letras en negro y el fondo en blanco.

Me ocurre lo mismo cuando pincho sobre una de las lineas o cuando minimizo la aplicación y la vuelvo a restaurar (me desaparece los colores de las filas, y me dejan las por defecto).

No sé que puede ser...?

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 26-06-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Puedes explicar exactamente como haces ese coloreado de las filas?

Que código usas y desde donde usas ese código (evento, método redefinido, etc...)



Saludos...
Responder Con Cita
  #3  
Antiguo 26-06-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
>Puedes explicar exactamente como haces ese coloreado de las filas?

>Que código usas y desde donde usas ese código (evento, método redefinido, etc...)

Hola,

estoy programando en builder6, tengo un ListView en un Form1 y en el Unit.h asociado llamo al evento ListViewCustomDrawItem del siguiente modo:

Código:
void __fastcall TForm1::ListViewCustomDrawItem(TCustomListView *Sender,
      TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
 Sender->Canvas->Font->Color = clRed;

 if (snf2->Proto() == "TCP")
 {
  Sender->Canvas->Font->Color = clGreen;
 }
  if (snf2->Proto() == "UDP")
 {
  Sender->Canvas->Font->Color = clBlue;
 }
 if (snf2->Proto() == "ARP")
 {
  Sender->Canvas->Font->Color = clPurple;
 }
}
donde snf2 es un objeto de una clase y Proto() es un método de dicho clase, y snf2->Proto() me devuelve el tipo de protocolo que dependiendo del que sea se pinta las letras de un color u otro.

Lo que sucede lo he mencionado antes, que en tiempo de ejecución funciona bien, pero al terminar de sacarme las filas y muevo el scroll vertical o pincho sobre alguna fina o minimizo la aplicaciones todas las filas me aparece el color por defecto, que en este caso es rojo.

Alguien sabe por qué?
Responder Con Cita
  #4  
Antiguo 26-06-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Vaya, no había leido bien el mensaje xDDDD

snf2 es un objeto único? O existe uno por cada Item en el ListView?


Saludos...
Responder Con Cita
  #5  
Antiguo 26-06-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por Ziara Ver Mensaje
Código:
void __fastcall TForm1::ListViewCustomDrawItem(TCustomListView *Sender,
      TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
 Sender->Canvas->Font->Color = clRed;

 if (snf2->Proto() == "TCP")
 {
  Sender->Canvas->Font->Color = clGreen;
 }
  if (snf2->Proto() == "UDP")
 {
  Sender->Canvas->Font->Color = clBlue;
 }
 if (snf2->Proto() == "ARP")
 {
  Sender->Canvas->Font->Color = clPurple;
 }
}
Prueba a añadir en tu código DefaultDraw = false;
Código:
void __fastcall TForm1::ListViewCustomDrawItem(TCustomListView *Sender,
      TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
 Sender->Canvas->Font->Color = clRed;

 if (snf2->Proto() == "TCP")
 {
  Sender->Canvas->Font->Color = clGreen;
 }
  if (snf2->Proto() == "UDP")
 {
  Sender->Canvas->Font->Color = clBlue;
 }
 if (snf2->Proto() == "ARP")
 {
  Sender->Canvas->Font->Color = clPurple;
 }
 DefaultDraw = false;
}
Saludos.
Responder Con Cita
  #6  
Antiguo 01-07-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
Buenas tardes!

Cita:
Snf2 es un objeto único? O existe uno por cada Item en el ListView?
Es un objeto único.
Cita:
Prueba a añadir en tu código DefaultDraw = false;
He probado a añadir esto en el código, y cuando ejecuto la aplicación, los paquetes que se van capturando no aparecen visibles, es decir, sé que captura paquetes ya que el scroll vertical va bajando, pero no los visualizo en la pantalla, parecen invisibles, que podría ser?

Gracias.
Responder Con Cita
  #7  
Antiguo 01-07-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Me imagino que lo que estás haciendo es como un registro de actividad de lo que recibe el objeto, no es así?

Entonces, lo que sucede es que el componente al redibujar siempre va a leer el último valor que tiene el objeto, es por eso que cuando haces un scroll ya no se ven como cuando se insertaron la primera vez...

Para esto podrías usar la propiedad Data del TListItem (el ejemplo te lo pongo en Delphi, pero deberías poder traducirlo a C sin problemas):

Código Delphi [-]
// Agregas un TListItem nuevo:
with ListView1.Items.Add do
  if snf2.Proto = 'TCP' then
    Data := Pointer(0)
  else
    if snf.Proto = 'UDP'
      Data := Pointer(1)
    else
      Data := Pointer(2);

// Ahora en el evento OnCustomDrawItem:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem;
  State: TCustomDrawState; DefaultDraw: Boolean);
begin
  case Integer(Item.Data) of
    0:
      Sender.Canvas.Font.Color := clGreen;
    1:
      Sender.Canvas.Font.Color := clBlue;
    2:
      Sender.Canvas.Font.Color := clPurple
  else
    Sender.Canvas.Font.Color := clRed
  end
end;

Ya con esto cada que hagas un scroll se deben dibujar bien los items en la lista...


Saludos...
Responder Con Cita
  #8  
Antiguo 02-07-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
Buenas,

Cita:
Me imagino que lo que estás haciendo es como un registro de actividad de lo que recibe el objeto, no es así?
mmm, creo que te entiendo y creo que si, en una clase llamada Sniffer hay una serie de métodos que hace la función de capturar paquetes, esto lo tengo en un Unit3 (por ejemplo) y es donde voy incluyendo los paquetes en el ListView.

Como el ListView lo tengo en Form1 en Unit1 pues traslado el valor que me interesa con snf->Proto() donde snf es un objeto de la clase Snifer, así paso el valor que me interesa (en este caso el protocolo) del Unit3 al Unit1 para usarlo dentro del método de ListViewCustomDrawItem como lo he indicado anteriormente.

Según el código:

Código:
// Agregas un TListItem nuevo:
with ListView1.Items.Add do
 if snf2.Proto = 'TCP' then
    Data := Pointer(0)
else
    if snf.Proto = 'UDP' 
      Data := Pointer(1)
    else
      Data := Pointer(2);
donde lo agrego? en Unit1 únicamente tengo el metodo
ListViewCustomDrawItem.

No lo tengo muy claro. 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
Extraño comportamiento de delphi 7 smessina Varios 5 18-03-2008 12:50:54
Extraño comportamiento de Firebird 2.0 TrUnkS Firebird e Interbase 4 06-01-2007 23:05:57
Comportamiento extraño de DisplayFormat Thales Conexión con bases de datos 0 02-12-2005 21:56:32
Comportamiento extraño de Delphi walrus Varios 3 05-08-2004 10:04:32
Comportamiento extraño con InnoBD brandolin MySQL 0 20-10-2003 14:34:09


La franja horaria es GMT +2. Ahora son las 15:46:49.


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