cambio de color en filas de grid según condición

4,011 views
Skip to first unread message

contabil...@gmail.com

unread,
Jan 22, 2015, 9:17:03 PM1/22/15
to publice...@googlegroups.com
Buenas noches;

será posible cambiar el color de las filas de un grid  utilizando dynamicbackcolor de acuerdo al valor de un campo del cursor, es decir tengo un cursor ordenado por un campo (centro de costo), lo que quiero es que cuando cambie el centro de costo, cambie el color de todas las filas del grid, cuando llegue a otro centro de costo cambie nuevamente el color de las filas

algo  como esto

centro_costo

cuenta

valor

100001

1110

1500000

100001

2335

800000

100001

2805

500000

100002

1110

600000

100002

1305

750000

100002

2195

1200000

100003

1105

6000000

100003

2335

500000

100003

2505

600000



desde ya muchas gracias por su ayuda,

 

HernanCano

unread,
Jan 22, 2015, 9:36:47 PM1/22/15
to publice...@googlegroups.com
En la ayuda de VFP de la propiedad DynamicBackColor encuentras lo que necesitas.

El renglón que puedes cambiar es el sgte (te indico cómo quedaría según lo que comentas)

frmMyForm.grdGrid1.SetAll("DynamicBackColor", ;
   "IIF(CENTRO_COSTO=100001, RGB(255,255,255) ;
   , RGB(0,255,0))", "Column")  && Alternate white and green records

Luego puedes mirar qué colores necesitas.

contabil...@gmail.com

unread,
Jan 22, 2015, 9:39:45 PM1/22/15
to publice...@googlegroups.com
Gracias Hernan, eso lo se, lo que pasa es que quiero que cuando cambie el valor del centro de costo, cambie el color de las filas; y los centros de costo pueden ser distintos en diferentes empresas

algo similar a la imagen

HernanCano

unread,
Jan 22, 2015, 9:45:20 PM1/22/15
to publice...@googlegroups.com

frmMyForm.grdGrid1.SetAll("DynamicBackColor", ;
   "GetMyColor(CENTRO_COSTO) ", "Column")

function GetMyColor(pCual)
do case
case pCC='100001'
   nCol = RGB(255,255,255)
case pCC='100002'
   nCol = RGB(255,255,000)
case pCC='100003'
   nCol = RGB(255,000,255)
case pCC='100004'
   nCol = RGB(000,255,255)
endcase
return nCol

Martin Paredes

unread,
Jan 22, 2015, 10:30:03 PM1/22/15
to publice...@googlegroups.com
hola contabil.............

hace tiempo encontré esto no recuerdo donde pero, prueba :

1. en tu form crea un Método ejemplo "colores"

2. dentro del Método "colores" agrega este código:

   PARAMETERS tcValue, tlForeColor
   LOCAL lnBackColor, lnForeColor
   lnBackColor=BITAND(VAL(SYS(2007,m.tcValue,1,1)), 0x00FFFFFF)
   IF ! m.tlForeColor THEN
      RETURN m.lnBackColor
   ENDIF
   LOCAL lnRed, lnGreen, lnBlue,lnAlpha
   lnRed=BITAND(BITRSHIFT(m.lnBackColor,0), 0xFF)
   lnGreen=BITAND(BITRSHIFT(m.lnBackColor,8), 0xFF)
   lnBlue=BITAND(BITRSHIFT(m.lnBackColor,16), 0xFF)
   lnAlpha=(MAX(m.lnRed,m.lnGreen,m.lnBlue)+MIN(m.lnRed,m.lnGreen,m.lnBlue))/2
   RETURN IIF(m.lnAlpha<0x80, 0xFFFFFF, 0)

3. en el ini de tu form agrega este código:
   ThisForm.mygrid.Column1.DynamicBackColor="(THISFORM.colores(ALLTRIM(STR(tutabla.centro_costo)), .F.))"
   (llena de diferentes colores la columna 1 si el valor se repite, repite el mismo color).

4. quedaría algo así como esto :

salds...
Mapasac
General Escobedo N.L. México

Fidel Charny

unread,
Jan 23, 2015, 9:56:42 AM1/23/15
to publice...@googlegroups.com
Podría ser algo así
griDynDark= TRANSFORM(RGB(220,228,224))
griDynClear= TRANSFORM(RGB(242,247,243))
lcDnBAckcolor=[IIF(MOD(val(cursor.centro_costol), 2)=0, &griDynClear,&griDynDark )]
thisform.grid1.setall("DynamicBackColor",lcDnBackColor,"Column")

Fidel Charny

unread,
Jan 23, 2015, 10:01:15 AM1/23/15
to publice...@googlegroups.com
Alternativamente, puedes asignarle un color a cada centro de costo en la tabla de centros de costo. Cuando generas la consulta, te traes el color y ahí la cosa es más sencilla. En esa tabla, el color predeterminado debería ser el número 16777215 (blanco) o algún otro color claro que te guste.
Si el campo se llama "gColor" n(8,0)
lcDnBackColor=[Cursor.gColor]

thisform.grid1.setall("DynamicBackColor",lcDnBackColor,"Column")

Carlos Alfaro

unread,
Jan 23, 2015, 1:12:35 PM1/23/15
to publice...@googlegroups.com

Saludos cordiales estimados amigos foxeros:

 

Un método que seguramente ya alguien ha compartido, pero que se los paso por si les sirve, consiste en agregar un campo en el cursor que esta incluido en un grid, en el cual se guarda el valor de color a asignar a cada línea.

 

Solo deben escribir el valor del color en decimal en el campo.

 

Espero les sirva, bendiciones.

 

Carlos Alfaro

prueba_de_colores._zip

César Pistiner

unread,
Jan 23, 2015, 9:58:49 PM1/23/15
to publice...@googlegroups.com

Hola Carlos

Hace poco consultaron cómo hacer esto mismo, fuiste vos?

Saludos,
César

Jhonny Zambrana

unread,
Jan 24, 2015, 8:03:11 AM1/24/15
to publice...@googlegroups.com
Jajaja que crees, segun mi imaginacion, pues es que no le terminaron de hacer la tarea.

todavia es viernes??? hay maldita resaca..!!!

Fidel Charny

unread,
Jan 24, 2015, 8:32:22 AM1/24/15
to publice...@googlegroups.com
Cheeee! Paren un poco. Varios preguntaron por DynamicBackColor. No tienen que ser todos el mismo preguntante. Las preguntas son distintas aunque sean del mismo tema.
Y al que no le interese, que no conteste. That's all Folks!

César Pistiner

unread,
Jan 24, 2015, 9:04:46 PM1/24/15
to publice...@googlegroups.com

No Jhonny!

Todo lo contrario, Carlos esta compartiendo una forma de hacerlo lo cual me parece genial. Justo hace poco lo consultaron y si fue él esta muy bueno compartir la solución por eso le preguntaba. Y si no fue el, seguramente le sirva al que preguntó antes.

Saludos,
César

HernanCano

unread,
Jan 25, 2015, 1:52:33 PM1/25/15
to publice...@googlegroups.com
De todas formas el que preguntó aquí no ha vuelto a intervenir....

Carlos Alfaro

unread,
Jan 25, 2015, 5:21:55 PM1/25/15
to publice...@googlegroups.com

Saludos colegas:

 

No, yo no presente la consulta, pero aprovechando que vi hilos preguntando sobre cómo colocar colores variados y viendo que cuando eran muchas las variables, se complicaba mas el código en SetAll con DynamicBackColor, pensé que era más fácil colocar un campo para manejar el color, así que compartí con ustedes esa idea.

 

Bendiciones.

 

Carlos Alfaro

contabil...@gmail.com

unread,
Jan 25, 2015, 7:27:29 PM1/25/15
to publice...@googlegroups.com
Buenas noches;

muchas gracias a todos  por la ayuda, ya lo he podido resolver con el código de Fidel, me ha funcionado perfectamente,

saludos,

Saúl Piña

unread,
Jan 27, 2015, 4:22:46 PM1/27/15
to publice...@googlegroups.com

Saludos Fidel, ahora yo requiero este codigo, trato de implementarlo pero me da error:

El codigo es el siguiente:
SQLCapturados="select comite, cargo, ncompleto, idcargo from integrantes order by cargo"

=SQLEXEC(lhandle,SQLCapturados,"MostrarGrid")

SELECT *from MostrarGrid WHERE ALLTRIM(comite)=pClaveCom INTO CURSOR MostrarGrid2 nofilter

thisform.grilla
thisform.grid1.RecordSource="MostrarGrid2"
SELECT MostrarGrid2
BROWSE

griDynDark= TRANSFORM(RGB(220,228,224))
griDynClear= TRANSFORM(RGB(242,247,243))
lcDnBAckcolor=[IIF(MOD(val(MostrarGrid2.idCargo), 2)=0, &griDynClear,&griDynDark )]

thisform.grid1.setall("DynamicBackColor",lcDnBackColor,"Column")

gracias

Fidel Charny

unread,
Jan 27, 2015, 4:40:38 PM1/27/15
to publice...@googlegroups.com
Pregunto para el descarte: idcargo es character o numeric?

Saul Piña Hernandez

unread,
Jan 27, 2015, 8:37:02 PM1/27/15
to publice...@googlegroups.com
idcargo es numerico...

Víctor Hugo Espínola Domínguez

unread,
Jan 27, 2015, 9:32:03 PM1/27/15
to publice...@googlegroups.com
Hola Saúl

VAL(DatoNumérico) ===> ERROR!

Saludos,
Víctor.
Lambaré - Paraguay.

HernanCano

unread,
Jan 27, 2015, 10:48:58 PM1/27/15
to publice...@googlegroups.com
Saúl:
Tamb ién podrías hacer:

lcDnBAckcolor=[IIF(MOD(MostrarGrid2.idCargo, 2)=0, RGB(242,247,243)RGB(220,228,224) )]


O también:

griDynDark= 'RGB(220,228,224)'
griDynClear= 'RGB(242,247,243)'
lcDnBAckcolor=[IIF(MOD(MostrarGrid2.idCargo, 2)=0, &griDynClear,&griDynDark )]
------------------> pero no las he probado.

Fidel Charny

unread,
Jan 28, 2015, 7:25:36 AM1/28/15
to publice...@googlegroups.com
lcDnBAckcolor=[IIF(MOD(MostrarGrid2.idCargo, 2)=0, &griDynClear,&griDynDark )]

Osornino (Chile)

unread,
Jan 28, 2015, 8:01:39 AM1/28/15
to publice...@googlegroups.com
Hola,
Quisiera aportar al tema con el siguiente ejemplo:

Si bien puedes colorear Filas y ColumnasEnras,
con mi metodo puedes conseguir colorear en forma independiente el BackColor y el ForeColor de la "CELDA".

Esto es posible gracias a este foro, ya que en algún momento tuve la misma inquietud, pero deseaba pintar solo la selda segun el valor ingresado. Buscando y buiscando di con algunos ejemplos y que me sirvieron, ahora deseo compartilos con ustedes.


Les envio 4 Archivos, los que paso a explicar:

Esto puedes conseguir  -  Ejemplo.jpg

Metodo principal              -  Colorear_Celdas.prg
Metodo Secundario 1       -  Define_BackColor.jpg
Metodo Secundario 2       -  Define_BackColor.jpg


Esto funciona de la siguiente manera.

Crea el Metodo  "Colorear_Celdas" e identificas la columna del Grid que deseas colorear, enviando los valores para condicionar los colores.
Le puedes hacer el llamado de la siguiente forma:

thisform._Colorear_Celdas 
thisformset._Colorear_Celdas        (si trabajas con un formset)


En el ejemplo envío 4 valores para cambiar el BackColor y el ForeColor de la columna 3.

Thisform.Grid1.Column3.DynamicBackColor  = "thisform._Define_BackColor( 3,d_01,""',""')"
Thisform.Grid1.Column3.DynamicForeColor  = "thisform._Define_ForeColor( 3,d_01,""',""')"


Luego creas los otros 2 Metodos para colorear el BackColor y el ForeColor de la Celda en el GRID.
estos Metodos reciben los valores enviados y según las condiciones le asigna un BackColor o un ForeColor.

Siempre se asigna el valor por defecto a estos 2 parámetros, ya que si no existe la condición para el valor ingresado, este no tendrá ningún color asignado.


El jueves, 22 de enero de 2015, 23:17:03 (UTC-3), contabil...@gmail.com escribió:

Osornino (Chile)

unread,
Jan 28, 2015, 8:03:20 AM1/28/15
to publice...@googlegroups.com
Disculpen ahora agrego los metodos





El jueves, 22 de enero de 2015, 23:17:03 (UTC-3), contabil...@gmail.com escribió:
Colorear_Celdas.prg
Define_BackColor.prg
Define_ForeColor.prg
Ejemplo.jpg

Saul Piña Hernandez

unread,
Jan 28, 2015, 9:58:17 AM1/28/15
to publice...@googlegroups.com
Gracias, definitivamente debo probar estos ejemplos.

En un momento les cuento si tengo alguna duda.

Saul Piña Hernandez

unread,
Jan 28, 2015, 10:59:13 AM1/28/15
to publice...@googlegroups.com
Disculpas, no habia visto el VAL() dentro de lcDnBAckcolor

gracias

Saul Piña Hernandez

unread,
Jan 28, 2015, 11:19:02 AM1/28/15
to publice...@googlegroups.com
Saludos, El ejemplo de Fidel solo me dá 2 colores, mi duda es si eso es correcto, pensé que segun el valor de un campo en un cursor, se mostraría un color distinto.

Saul Piña Hernandez

unread,
Jan 28, 2015, 1:34:32 PM1/28/15
to publice...@googlegroups.com
Lo complementé de la siguiente manera (utilizando el ejemplo de Fidel):

lcDnBAckcolor=[IIF(MostrarGrid2.idCargo=1,RGB(115,215,148),IIF(MostrarGrid2.idCargo=2,RGB(255,255,151),IIF(MostrarGrid2.idCargo=3,RGB(241,101,41),IIF(MostrarGrid2.idCargo=4,RGB(53,154,255),IIF(MostrarGrid2.idCargo=5,RGB(255,255,195),RGB(164,82,0))))))]

thisform.grid1.setall("DynamicBackColor",lcDnBackColor,"Column")

Se puede hacer un codigo mejor que este? 

basicamente requiero de 5 colores distintos.
gracias

Fidel Charny

unread,
Jan 28, 2015, 2:31:28 PM1/28/15
to publice...@googlegroups.com
Solo que yo hubiera utlizado ICASE() en lugar de todo ese bodrio de IIF(). Aplica para el caso, es mucho más claro en la sintaxis y es mucho más rápido en la ejecución.

lcDnBackColor = [ ICASE(Mostrargrid2.idcargo=1,RGB(115,215,148),;
                   
MostrarGrid2.idCargo=2,RGB(255,255,151),;
                   
MostrarGrid2.idcargo=3,Rgb(241,101,41),;
                   
MostrarGrid2.idCargo=4,rgb(53,154,255),;
                   
MostrarGrid2.idcargo=5,RGB(255,255,195),;
                    rgb
(164,82,0)) ]

Víctor Hugo Espínola Domínguez

unread,
Jan 28, 2015, 2:43:58 PM1/28/15
to publice...@googlegroups.com
Hola Saúl

Tal como dice Fidel, ICASE es la función apropiada. Si se da el caso de que tienes más de 5 valores para el campo IdCargo entonces puedes modificar el código enviado por Fidel de la siguiente forma:

lcDnBackColor = [ ICASE( ;
                    MOD(Mostrargrid2.idcargo, 5) 1RGB(115,215,148),;
                    
MOD(MostrarGrid2.idCargo, 5) 2RGB(255,255,151),;
                    MOD(MostrarGrid2.idcargo, 5) 3Rgb(241,101,41),;
                    MOD(MostrarGrid2.idCargo, 5) 4, Rgb(53,154,255),;
                    MOD(MostrarGrid2.idcargo, 5) = 0RGB(255,255,195)) ]

Saludos,
Víctor.
Lambaré - Paraguay.
 

Saul Piña Hernandez

unread,
Jan 28, 2015, 3:01:17 PM1/28/15
to publice...@googlegroups.com
No me funciona asi. no muestra los colores..

Fidel Charny

unread,
Jan 28, 2015, 5:00:43 PM1/28/15
to publice...@googlegroups.com
Ahora dime Saúl,  los valores de Idcargo son exactamente 1,2,3,4,5 ?. O el tema es otro?.
Reset.
Qué es lo que necesitas hacer realmente?.

Víctor Hugo Espínola Domínguez

unread,
Jan 28, 2015, 5:47:42 PM1/28/15
to publice...@googlegroups.com
Hola Saúl

Adjunto algunos ejemplos, espero te sirvan.

Saludos,
Víctor.
Lambaré - Paraguay.

gridmulticolor1.prg
gridmulticolor2.prg
gridmulticolor3.prg
gridmulticolor4.prg

Saul Piña Hernandez

unread,
Jun 27, 2015, 12:10:59 PM6/27/15
to publice...@googlegroups.com, vich...@gmail.com
De nuevo, necesitaba utilizar color en grid y recordé que ud me recomendaron utilizar Icase en ugar de iif

y con los ejemplos excelentes de Victor, me ayudaron a obtener los resultados, con icase.

gracias victor...

integral

unread,
Jun 28, 2015, 4:27:50 PM6/28/15
to publice...@googlegroups.com, contabil...@gmail.com
Amigos :

Aqui un ejemplo utilizando el DO CASE

DO CASE
    CASE Condicion = "P"                               
       lnColor = RGB(188,221,231)   
    CASE Condicion = "S"                               
       lnColor = RGB(255,220,155)          
    CASE Condicion = 'N'
       lnColor = RGB(255,193,193)  
    CASE Condicion = 'B'
       lnColor = RGB(134,193,210)
    CASE Condicion = 'E'
       lnColor = RGB(255,255,176)    
    CASE Condicion = 'S'
       lnColor = RGB(30,144,255)
    CASE Condicion = 'C'
       lnColor = RGB(255,202,107)
    OTHERWISE
       lnColor = RGB(255,255,255)
ENDCASE
RETURN m.lnColor       

atte.,

INTEGRAL
Reply all
Reply to author
Forward
0 new messages