Ir al contenido


Foto

Color de fila dbgrid diferente para cada registro con un campo distinto


  • Por favor identifícate para responder
32 respuestas en este tema

#21 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 26 enero 2011 - 07:35

¿Yo me pregunto es porqué tantos colores?, por ejemplo en la imagen que tienes se ven muy bien así agrupados, e imagino que cada cierta cantidad o condición se pueden repetir.


Saludos!
  • 0

#22 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 26 enero 2011 - 10:23

Saludos.

Aún no entiendo lo que andas buscando, osea si es necesario por algún motivo especial colorear esas filas.

En el trabajo usamos el Grid de los JEDI que tiene la propiedad AlternateRowColor y AlternateRowFontColor con estas propiedades se logra que se pinte filas alternadas.  Osea fila 1 color negro, fila 2 color rojo, fila 3 color negro y así sucesivamente, para una cuestión de estética.

Estas propiedades del grid de JEDI que mencionas parecen más apropiadas para mostrar las lineas tipo "pijama a rayas", para facilitar la lectura de arriba a abajo diferenciando un registro del siguiente, por ejemplo, pero lo que persigue Luk2009 es poder agrupar visualmente registros asociados a la misma CSID, que pueden ser uno o varios.


delphi
  1. procedure TFRMactivasred.DBGrid1DrawColumnCell(Sender: TObject;
  2.   const Rect: TRect; DataCol: Integer; COLUMN: TColumn;
  3.   State: TGridDrawState);
  4. var
  5.   Num,Base: Integer;
  6. begin
  7.   Num:= DBGrid1.DataSource.DataSet.FieldByName('CSID').AsInteger;
  8.   IF Odd(Num) then
  9.     Base:=  Integer(clblue)
  10.   else
  11.     Base:=  Integer(clyellow);
  12.   DBGrid1.Canvas.Font.Color:= clwhite;
  13.   DBGrid1.Canvas.Brush.Color:= TColor(Base + Num * 100);
  14.   DBGrid1.DefaultDrawColumnCell(Rect,DataCol,COLUMN,State);
  15. end;


El problema con esto es que no siempre irán alternándose códigos (campo CSID) pares e impares, pudieran darse dos grupos consecutivos con un CSID par, por ejemplo, pero entiendo que es la solución más cercana. Yo me estuve calentando la cabeza con algo muy similar hace tiempo en un programa de contabilidad donde mostraba lineas de asiento agrupadas por el numero de asiento y lo solucioné de igual manera, mirando si el número de asiento era par o impar, pero cuando aparecían dos grupos con asientos pares, por ejemplo, el color no servía para diferenciarlos.

Pero creo que es la única manera de hacerlo, mediante Odd, si no queremos recurrir a listas auxiliares y complicarnos la vida.


Saludos

  • 0

#23 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 26 enero 2011 - 10:43

Gracias por todas sus respuestas.

Rolphy dejame ponerte el asunto en contexto. Esos registros son señales enviadas por los sistemas de alarmas de robo de los clientes. Ese Dbgrid muestra las que el operador debe llamar y escribir un reporte. Cada CSID es un cliente y la idea es que pueda diferenciarse de los otros, para con ello ayudar al operador a entender que tiene varias alarmas pendientes y que pertenecen a clientes diferentes.
  • 0

#24 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 26 enero 2011 - 11:40

Gracias por todas sus respuestas.

Rolphy dejame ponerte el asunto en contexto. Esos registros son señales enviadas por los sistemas de alarmas de robo de los clientes. Ese Dbgrid muestra las que el operador debe llamar y escribir un reporte. Cada CSID es un cliente y la idea es que pueda diferenciarse de los otros, para con ello ayudar al operador a entender que tiene varias alarmas pendientes y que pertenecen a clientes diferentes.


Saludos.

Por lo que veo manejas el ID de cada cliente, aunque es posible que tengas más de un registro del mismo, lo que me lleva a pensar que es prácticamente inmanejable.

Se me ocurre de momento varias ideas para lidiar con esto es:
  • Si es posible, clasificar los clientes osea crearle algún tipo y por este campo colorear
  • El registro como tal que tenga algún estado y por ahí colorearlo
  • O por el tiempo de creación del registro

Son solo ideas, ya sabrás que tan reales sean para tu aplicación.
  • 0

#25 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 26 enero 2011 - 03:17

Gracias Rolphy por tus ideas. Para este dbgrid especifico, me conformo con que me ponga de un color cada CSID diferente.
En otros formularios donde busco el historial de los registros, utilizo algunas de tus ideas y le pongo el color segun el tipo de señal, ejemplo:  ROJO para Robo , VERDE para cierre , AZUL para apertura, etc.  Asi que tus ideas son perfectamente aplicables.

Para este caso me conformo por ahora con lo que me ofrece esta solucion.
  • 0

#26 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 enero 2011 - 07:13

NECESARIAMENTE debe tener esa lista que asocie el registro con el color que le corresponde.
Ya sea que esa lista se trata de un campo ficticio o generado a través de un SP, o sea una estructura que se genera en el lado cliente... no interesa. Hay que recurrir a esa lista auxiliar.

Y esto es asi porque ante un movimiento del cursor se vuelve a disparar el evento OnDrawColumnCell para repitar el DBGrid. Por tanto, cuando se dispare hará una comprobación del último valor detectado y puede que este no haga cumplir la condición apropiadamente como para pintar el color que corresponde.

No es problema cuando uno está alternando fila a fila, color a color donde un simple Odd() puede facilitar algunas cosas. Aquí estamos pintando a grupos... donde el color de un registro depende de su vecino. Y ese a su vez, de su vecino.

Con todo respeto, no le busquen más vueltas... de una u otra forma todo termina en una "lista".

Saludos,
  • 0

#27 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 26 enero 2011 - 09:13

Pues como en este caso el color se obtiene multiplicando por el CSID, a mi me funciona bien y siempre me da el mismo color para ese cliente especifico. Talvez si el CSID estuviera compuesto por numeros y letras, fuera necesaria la lista, pero por ahora esto me funciona de maravilla.
  • 0

#28 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 enero 2011 - 07:09

Pues como en este caso el color se obtiene multiplicando por el CSID, a mi me funciona bien y siempre me da el mismo color para ese cliente especifico. Talvez si el CSID estuviera compuesto por numeros y letras, fuera necesaria la lista, pero por ahora esto me funciona de maravilla.

¿Te funciona aún moviéndote por los registros?  ^o|

Umm, quizá es como dices... que debido a la particularidad de que el color se determina por la multiplicación del CSID más el color Base es que se obtiene el color "correcto".
De todas formas no te fíes Luciano, sigue haciendo pruebas.
Por ejemplo, un criterio de ordenamiento diferente a la consulta que alimenta al DBGrid puede hacer fallar a tu algoritmo. Nota que haces uso de Odd(). Si tienes dos grupos de cliente seguidos con número impar (o par) y si dicha diferencia no es lo suficiente significativa el color que conseguirás será bastante parecido. Por ejemplo, 0011 y 0013. La diferencia es 2 y esto podría hacer que los colores no estén suficiente "alejados" uno del otro.

Saludos,
  • 0

#29 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 27 enero 2011 - 07:16

NECESARIAMENTE debe tener esa lista que asocie el registro con el color que le corresponde.

Efectivamente la lista se está creando (al vuelo) dinámicamente puesto que CSID se pasa como parámetro a TColor.

Nota que haces uso de Odd(). Si tienes dos grupos de cliente seguidos con número impar (o par) y si dicha diferencia no es lo suficiente significativa el color que conseguirás será bastante parecido. Por ejemplo, 0011 y 0013. La diferencia es 2 y esto podría hacer que los colores no estén suficiente "alejados" uno del otro.

Tampoco hay problema  también está contemplada la contraparte para Odd() en  el  else  que toma como base el clYellow que es un entero lo suficientemente distinto de clBlue que es la otra base, y la multiplicación por 100 se asegura de hacerlos diferentes en caso de que el número siguiente sea de la misma familia.

Saludos
  • 0

#30 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 27 enero 2011 - 12:12

La verdad es que funciona muy bien y he realizado muchas pruebas. en ocasiones el color puede parecerse, pero se diferencia bien.  Seguiremos haciendo pruebas y si existe algun inconveniente lo dejare saber.
  • 0

#31 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 enero 2011 - 05:56

Pues, vaya... me estaba temiendo de que al multiplicar por 100 y sumar la base, la diferencia entre un color y otro (cuando se presentan dos grupos de números pares o impares) se mantuviera.

Tendré que hacer unas pruebas de color para ver que sucede, porque supuestamente la "proporción" debería mantenerse:

Nro2/Nro1 = (Nro2 x 100)/(Nro1 x 100)

Con lo que los colores deberían ser bastantes "aproximados" cuanto Nro2 - Nro1 tienda a cero.

Saludos,
  • 0

#32 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 27 enero 2011 - 11:08


Con lo que los colores deberían ser bastantes "aproximados" cuanto Nro2 - Nro1 tienda a cero.


Y seguimos con esto ......  :D :D :D

Amigo Delphius la menor diferencia posible entre dos números pares o impares (según el algoritmo) es  de 200, suficiente para dar dos colores diferentes.

Saludos
  • 0

#33 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 enero 2011 - 11:24



Con lo que los colores deberían ser bastantes "aproximados" cuanto Nro2 - Nro1 tienda a cero.


Y seguimos con esto ......  :D :D :D

Amigo Delphius la menor diferencia posible entre dos números pares o impares (según el algoritmo) es  de 200, suficiente para dar dos colores diferentes.

Saludos


Cifras señores, quiero ver cifras..... :D :D :D

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.