
Color de fila dbgrid diferente para cada registro con un campo distinto
#21
Posted 26 January 2011 - 07:35 AM
Saludos!
#22
Posted 26 January 2011 - 10:23 AM
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.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.
delphi
procedure TFRMactivasred.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; COLUMN: TColumn; State: TGridDrawState); var Num,Base: Integer; begin Num:= DBGrid1.DataSource.DataSet.FieldByName('CSID').AsInteger; IF Odd(Num) then Base:= Integer(clblue) else Base:= Integer(clyellow); DBGrid1.Canvas.Font.Color:= clwhite; DBGrid1.Canvas.Brush.Color:= TColor(Base + Num * 100); DBGrid1.DefaultDrawColumnCell(Rect,DataCol,COLUMN,State); 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
#23
Posted 26 January 2011 - 10:43 AM
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.
#24
Posted 26 January 2011 - 11:40 AM
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.
#25
Posted 26 January 2011 - 03:17 PM
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.
#26
Posted 26 January 2011 - 07:13 PM
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,
#27
Posted 26 January 2011 - 09:13 PM
#28
Posted 27 January 2011 - 07:09 AM
¿Te funciona aún moviéndote por los registros?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.

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,
#29
Posted 27 January 2011 - 07:16 AM
Efectivamente la lista se está creando (al vuelo) dinámicamente puesto que CSID se pasa como parámetro a TColor.NECESARIAMENTE debe tener esa lista que asocie el registro con el color que le corresponde.
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.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
#30
Posted 27 January 2011 - 12:12 PM
#31
Posted 27 January 2011 - 05:56 PM
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,
#32
Posted 27 January 2011 - 11:08 PM
Con lo que los colores deberían ser bastantes "aproximados" cuanto Nro2 - Nro1 tienda a cero.
Y seguimos con esto ......



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
#33
Posted 27 January 2011 - 11:24 PM
Con lo que los colores deberían ser bastantes "aproximados" cuanto Nro2 - Nro1 tienda a cero.
Y seguimos con esto ......![]()
![]()
![]()
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.....



Salud OS