FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Color DBGrid según grupo de filas
Hola el tema ronda el OnDrawColumCell del DBGrid y el Canvas.Brush.Color
He leido varios sobre lo del alternado de colores. Las filas pares de un color, las otras de otro, pero yo quiero algo más complicado. Quiero imprimir en un color las que cumplan un determinado valor en una columna y al cambiar ese valor, cambiar tambien el color de todas las filas. Ejemplo: Si imprimo estas columnas 103 07 .... 103 07 .... 103 07 .... 103 07 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... Es decir cambiar el color cuando cambie el valor de una columna con respecto al valor de la misma columna de la anterior fila. He cambiado de color al cambiar en la segunda columna el valor de 07 a 08. ¿Alguien sabe? Gracias por todo y hasta mañana.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
#2
|
||||
|
||||
Saludos
Podrias usar esto, en caso de que el campo sea Integer:
__________________
Van Troi De León (Not) Guía, Code vB:=Delphi-SQL, ¿Cómo? Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto! |
#3
|
||||
|
||||
Gracias por tu ayuda, pero....
Por lo que "trazo" en tu función los valores que debe tomar la columna en tu ejemplo (Column.Index=1) son discretos, es decir, valores conocidos y concretos como son 0, 1.... y a razón de ellos cambio el color. Perfecto. Pero yo no necesito eso, y no sé como hacerlo lo que necesito. Lo que deseo es: Poder cambiar el color del fondo de las líneas o las letras, eso es igual, a razón del cambio de valor de una columna respecto de la fila anterior. Si la columna 1 en la fila 1 del grid tenia valor '100' que salga en color azul, y si en la fila 2 la columna 1 vale '123' que cambie el color a rojo por ejemplo, y si en la línea 3 la columna 1 vuelve a cambiar el valor respecto de la columna 1 linea 2, volver a cambiarle el color a azul. No cambiando el color de la fila mientras no cambie el valor de la columna con respecto de la anterior fila El resultado debería ser algo pareceido a eso: 103 07 .... 103 07 .... 103 07 .... 103 07 .... Cambiando aqui el color por el cambio de valor de la columna 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... En realidad la confusión la tengo a la hora de donde implementar el algoritmo que pueda almacenar el valor de la columna de la anterior fila para comprarlo con el valor de la misma columna pero de la fila actual para despues de compararlo poder cambiar el color si son diferentes. Gracias.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. Última edición por Cabanyaler fecha: 24-11-2005 a las 09:03:07. |
#4
|
|||
|
|||
No se si estaré diciendo una animalada, pero se me ocurre que puedes declarar una variable global en la unidad para guardar el valor del campo del registro anterior y después comparar el valor de la variable con el del registro actual en el procedimiento OnDrawColumCell.
Si el valor coincide no cambias el color ni el valor de la variable en el procedimiento. Si el valor difiere cambias el color y asignas a la variable el valor del campo.
__________________
_____________________________________ And follow me to where the real fun is |
#5
|
||||
|
||||
Eso lo había pensado, y ahora lo voy a probar.
Lo que desconozco es si eso lo puedo implementar en ese Evento. Es un algoritmo parecido al de eliminación de duplicados, bueno parecido... Ya digo si me ha salido y soy pasto de mis lágrimas.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
#6
|
||||
|
||||
Hola, ya lo he hecho, pero sólo me pinta la primera columna de la tupla apartir de la que debería empezar a tener el color deseado.
El código es:
Y el resultado de una manera más o menos visual es: 103 07 .... 103 07 .... 103 07 .... 103 07 .... Cambiando aqui el color por el cambio de valor de la columna 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... Cuando el resultado debería ser algo pareceido a eso: 103 07 .... 103 07 .... 103 07 .... 103 07 .... Cambiando aqui el color por el cambio de valor de la columna 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 ....
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
#7
|
|||
|
|||
Y si asignaras el color mediante otra variable global?.
Empiezas con uno y cuando cambie el valor del registro cambias el asignas la variable global donde guardas el valor y lo mismo con la variable para el color.
__________________
_____________________________________ And follow me to where the real fun is |
#8
|
||||
|
||||
Si ya lo he probado Nelet, pero nada, el resultado es el mismo.
Desisto, tiro la toalla. Como diría Tarantino : - Llebo todo el pu#o día con esta jod#*a mier+# y no me funciona. Ya lo curraré de otro modo. Gracias y un saludo a todos los que habéis intentado ayudarme.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
#9
|
||||
|
||||
Creo que se escapa una cosa. Tienes que actualizar el valor de la variable sólo cuando sea distinta... si no te ocurre lo que ahora.
Código:
Código Delphi: procedure TFLibroNegro.DBGridLibroNegroDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (NumSubObr_ant <> DBGridLibroNegro.Fields[1].Value) and (DBGridLibroNegro.Canvas.Brush.Color = clinfoBk) then begin DBGridLibroNegro.Canvas.Brush.Color := clSkyBlue; DBGridLibroNegro.Canvas.FillRect(Rect); { observa que la he cambiado de sitio, pequño detalle } NumSubObr_ant := DBGridLibroNegro.Fields[1].Value; end; DBGridLibroNegro.DefaultDrawColumnCell(rect,DataCol,Column,State); end; Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#10
|
||||
|
||||
Saludos
Pienso que este tema tiene que ver mas con programacio qeu con simple coneccion a BD, por tal razon lo he movido a esta area.
__________________
Van Troi De León (Not) Guía, Code vB:=Delphi-SQL, ¿Cómo? Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto! |
#11
|
||||
|
||||
Despues de probar lo que te respondí, realmente he de reconocer que no funciona, porque no, sin más, no voy a entrar en detalles
Cuando el resultado debería ser algo pareceido a eso: 103 07 .... 103 07 .... 103 07 .... 103 07 .... Cambiando aqui el color por el cambio de valor de la columna 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... 103 08 .... Lo más parecido a esto que puedes hacer es que cuando cambie el valor de la columna 2, hagas un cáculo y que cambies el valor del color. Para ello, tendrás que tener llena la secuencia 01, 02, 03, 04,..... Si tuvieses 01,03,04, no te valdría por lo menos según el código que te adjunto Código:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (Sender as TDBGrid).Datasource.DataSet.Fields[5].AsInteger mod 2 = 0 then (Sender as TDBGrid).Canvas.Brush.Color := clSkyBlue else (Sender as TDBGrid).Canvas.Brush.Color := clinfobk; (Sender as TDBGrid).Canvas.Font.Color := clBlack; (Sender as TDBGrid).DefaultDrawColumnCell(rect,DataCol,Column,State); end; Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#12
|
||||
|
||||
... ya, gracias por tu interés. No obstante, he tirado por otro camino debido a que la secuencia de números, nunca tiene porqué ser secuencial.
Un saludo.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
|
|
|