SOMBREAR LINEA DEL GRID

490 views
Skip to first unread message

Ruben SEGOVIA RODRIGUEZ

unread,
Nov 2, 2013, 1:15:53 AM11/2/13
to publice...@googlegroups.com
Buenas noches

Como hacer para que dentro de un grid al dar clic en la linea se quede de un color sin borrar la anterior, he intentado con este ejemplo:
THISFORM.setall("Dynamicbackcolor","IIF(RECNO()=lRecno,RGB(255,255,128),RGB(255,255,255))","Column") 

donde LRECNO es el numero de registro, pero sale error

Ultraton500

unread,
Nov 2, 2013, 2:16:30 AM11/2/13
to publice...@googlegroups.com
Hola Rubén,
1- En la tabla o cursor que muestras en el grid utiliza un campo numérico de 1 dígito y llamalo por ej. m1
2- Estableces la propiedad AllowCellSelection del grid en .F. 
3- En el evento Click del grid colocas el siguiente código

IF cursor1.m1=.F.
REPLACE m1 WITH .T.
ELSE
REPLACE m1 WITH .F.
ENDIF

4- En el evento Init del form colocas el siguiente código (una línea por cada columna)

THISFORM.grid1.column1.DYNAMICBACKCOLOR = [IIF(cur_riesgos.m1=.T.,RGB(255,255,128),RGB(255,255,255))]
THISFORM.grid1.column2.DYNAMICBACKCOLOR = [IIF(cur_riesgos.m1=.T.,RGB(255,255,128),RGB(255,255,255))]

Y listo.
Seguramente debe haber alguna mejor forma de hacerlo pero no estoy para pensar ahora... me estoy llendo a dormir.

Espero te sea de ayuda.
Saludos,
Javier.

Héctor Bernal

unread,
Nov 4, 2013, 9:55:48 AM11/4/13
to publice...@googlegroups.com
Bue día, Rubén.

Yo lo he hecho de la siguiente forma y me funciona para todas las versiones desde VFP3 hasta Vfp9:

1. Crea una nueva propiedad en la forma, digamos que le llamas, Registro y le das el valor inicial 0. 

2. En el Init de la forma por lo siguiente:
   En éste caso iti_cur es el cursor con el que presentas los datos en el grid.
   
   SELECT iti_cur
   Thisform.Registro = RECNO()
   This.SetAll("DynamicBackcolor", "IIF(RECNO()=Thisform.Registro,RGB(43,149,255),IIF(RECNO()%2 = 0,RGB(230,230,230), RGB(255,255,255)))","Column")
   This.SetAll("DynamicForecolor", "IIF(RECNO()=Thisform.Registro,RGB(255,255,255), RGB(0,0,0))","Column")


3. En AfterRowColChange del grid, lo siguiente

   SELECT iti_cur
   Thisform.Registro = RECNO()
   This.Refresh()

Has diversas pruebas cambiando los valores de RGB()  e incluso puedes parametrizarlo y en la configuración de tu sistema seleccionar un color específico para el cursor del grid.

Anexo una imagen del efecto de lo anterior en un grid cualquiera y funciona para todas las columnas del mismo.




Espero te sea de ayuda.

Saludos desde México, D.F.


Grid con bandas.jpg

Milton

unread,
Nov 4, 2013, 11:24:26 AM11/4/13
to publice...@googlegroups.com
Prueba asignándole al Grid las siguientes propiedades:

THISFORM.Grid.AllowSetSelecion = .F.
THISFORM.Grid.GridLines  = 1
THISFORM.Grid.HightLight = .F: 
THISFORM.Grid.HighLightForeColor = 0,0,0
THISFORM.Grid.HighLightRow = .F:
THISFORM.Grid.HighLightStyle = 1

Espero te sirva

Atentamente,


MILTON CACHIPUENDO
ServysistemOnline
Ibarra - Ecuador

Daniel Sánchez

unread,
Nov 4, 2013, 9:52:40 PM11/4/13
to Comunidad de Visual Foxpro en Español
Héctor Bernal una pregunta, y mantiene el mismo orden de color así tenga indices y se cambien el orden, mantiene la característica de gris y claro siempre en el mismo orden.

Saludos
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Ultraton500

unread,
Nov 5, 2013, 1:19:08 AM11/5/13
to publice...@googlegroups.com
Hola Daniel, la respuesta es no, porque el número de registro (el que se obtiene con RECNO() ) hasta donde sé es inalterable y se corresponde con un registro determinado desde que se genera el cursor. Por lo tanto al cambiar el orden también se cambia el número de registro y, de la misma manera, al eliminar un registro los colores de cada fila dejan de estar ordenados alternadamente.

De todas formas, lo que quería Rubén no era tener colores alternados en el grid sino que cada fila cliqueada se pinte de un color sin perder ese color.al cliquear en otra fila para pintarla también (o eso entendí).

Saludos,
Javier.

Héctor Bernal

unread,
Nov 5, 2013, 9:39:42 AM11/5/13
to publice...@googlegroups.com
Bue día, Daniel.

Efectivamente, al cambiar el orden de los registros, cambian las bandas en gris, pero yo lo soluciono pues uso cursores y dependiendo de la consulta que se haga, siempre la muestro ordenada (en muchos casos es lo mejor al presentar datos en un grid) y funciona bastante bien con un número grande de registros. Por otro lado, si quieres solamente mostrar en color solamente el registro consultado, lo puedes hacer de la siguiente forma. 

SELECT v_entradas
This.Registro = RECNO()
This.SetAll("DynamicBackcolor", "IIF(RECNO()=This.Registro, RGB(0,0,0),  RGB(255,255,255))","Column")
This.SetAll("DynamicForecolor", "IIF(RECNO()=This.Registro,RGB(255,255,255), RGB(0,0,0))","Column")
This.SetAll("DynamicFontBold", "RECNO()=This.Registro","Column")

Esto lo hago porque funciona en todas las versiones de VFP 3.x en adelante, ya que actualmente donde estoy trabajando usan VFP5 + Oracle.

. En VFP 9.x ya no es necesario, como lo menciona un compañero en éste mismo hilo, pues con la configuraciòn de unas cuantas propiedades se resuelve el problema de pintar el registro actual en un grid.



Saludos desde México, D.F.



Ricardo Pina

unread,
Nov 5, 2013, 10:07:28 AM11/5/13
to Grupo VFP
Hola

Para iluminar el registro en el que te encuentras no es necesario usar el dynamic, lo puede manejar con las propiedades Highlighrow y Highliqhstyle
Si lo que quiere es ir marcando registros, puede utilizar lo que dijo Javier desde un principio.

Saludos
--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 

Ultraton500

unread,
Nov 5, 2013, 10:18:34 AM11/5/13
to publice...@googlegroups.com
Al presentar datos en un grid claro que lo mas adecuado es darles un orden. 
El problema surge cuando en el grid permitimos el ordenamiento por parte del usuario al hacer click en las cabeceras de las columnas que desea ordenar o cuando agregamos o eliminamos registros.
Hasta donde sé, en VFP la única forma de mantener los colores de las filas alternados pase lo que pase no se puede hacer con RECNO() sino utilizando un campo de referencia como por ej. uno que contenga unos y ceros de forma alternada. Y por cada reordenamiento, borrado o adición de registros se debe recorrer secuencialmente el cursor para restablecer los unos y ceros de forma alterna nuevamente.
Para esto, claro está, se debe tener un DYNAMICBACKCOLOR condicionado por este campo (el de los unos y ceros).

Saludos,
Javier.

WGWH

unread,
Nov 5, 2013, 10:51:46 AM11/5/13
to publice...@googlegroups.com
Hey parece que Ruben desapareció no ha mencionado si algo le ha funcionado.

Pero bueno creo que hasta el momento lo que se a contestado es como si se tratara de alternar colores de filas del grid, creo que él lo que no supo redactar en su pregunta es de ir marcando cada fila "supongo como un cheklist" y la fila marcada quede con un color fijo.

Si Ruben puede aparecer y decirnos con precisión será mejor, pero bueno de antemano, si lo que interpreté es lo que quiere, lo mejor es que agregue un campo a su cursor y una columna a su grid con un control checkbox que lo vaya marcando y que en base al valor que tome el campo asociado al checkbox cambie el dinamicbackcolor de las columnas del grid.

Saludos

W. Wassmer

Ultraton500

unread,
Nov 6, 2013, 10:19:46 AM11/6/13
to publice...@googlegroups.com
cri.. cri.. cri...
...Bueno Rubén, quedamos así entonces. Me alegro de que te hayan servido estos aportes. Fué un placer.

Saludos,
Javier.

El sábado, 2 de noviembre de 2013 02:15:53 UTC-3, Ruben SEGOVIA RODRIGUEZ escribió:

Fidel Charny

unread,
Nov 6, 2013, 10:30:44 AM11/6/13
to publice...@googlegroups.com
Javier:
Al final no se sabe bien cuál es el tema. Fijate que al principio dice que tiene un error en el DynamicBackColor que es bastante obvio por la supuesta variable lrecno. 
Dice que cuando hace click en una línea se le borra la anterior, pero quiere que quede del mismo color. 
Mi no entende!!. 
Ahora bien, si desde el 2 hasta hoy, Rubén no se preocupa, menos me preocupo yo.
...speaking words of wisdom, let it be

Daniel Sánchez

unread,
Nov 6, 2013, 11:48:00 AM11/6/13
to Comunidad de Visual Foxpro en Español
Ok Javier, si pues ese es mi problema porque el usuario al ordenarlo de acuerdo a un campo, se mueven y cambian el color banco con el gris perdiéndose la alternancia entre un color y el otro.

Saludos

Víctor Hugo Espínola Domínguez

unread,
Nov 6, 2013, 12:46:35 PM11/6/13
to publicesvfoxpro
Hola Daniel

En el programa adjunto puedes ver el truco utilizado para alternar los colores cuando cambia el ordenamiento.

Saludos,
Víctor.
Lambaré - Paraguay.

colorgrid3.prg

Daniel Sánchez

unread,
Nov 6, 2013, 1:05:34 PM11/6/13
to Comunidad de Visual Foxpro en Español
Lo voy a revisar y te comento, gracias.

Saludos

Daniel Sánchez

unread,
Nov 6, 2013, 10:55:33 PM11/6/13
to Comunidad de Visual Foxpro en Español
Excelente Víctor Hugo, probé tu ejemplo y es excelente, ahora lo e implementado en mi clase gridsort que tengo siguiendo tu ejemplo, el inconveniente que hay es cuando el grid tiene muchos datos, este se va poniendo lento, ya que siempre busca el dato en el array y mientras estes más cerca a los últimos registros de la lista, tiene que recorrer todo el array buscando su ubicación y en una tabla con 26 mil items esto se puede poner algo lento, obviamente que siempre se hace pruebas con datos más o menos extremos, lo cual en la vida real no es recomendable, pero uno no sabe con que usuario se puede topar, así que siempre hay que ver todos los escenarios. 

Saludos

Víctor Hugo Espínola Domínguez

unread,
Nov 7, 2013, 8:03:22 AM11/7/13
to publicesvfoxpro
Hola Daniel

Para tablas grandes quizás convendría pensar en paginación, en ese caso cargarías el array sólo con los datos de la página actual. Adjunto un ejemplo para que lo conviertas en una clase.

Saludos,
Víctor.

Paginacion._rar

Ultraton500

unread,
Nov 7, 2013, 9:23:19 AM11/7/13
to publice...@googlegroups.com
Si, si bien está un poco confuso creo que lo que quiere (o quería) es una multiselección de filas al hacer click sobre cada una.
Pero tal como dices Rubén se borró, y evidentemente se c_gó en la ayuda que le dimos. Pero bueno, lo positivo es que quedan estas respuestas para que puedan ser aprovechadas por quien las necesite en un futuro.

Saludos,
Javier.

Daniel Sánchez

unread,
Nov 7, 2013, 2:07:29 PM11/7/13
to Comunidad de Visual Foxpro en Español
Víctor Hugo, realice el cambio y decidí trabajar con otra tabla en lugar del array ordenado por el campo y realizo un set relation to entre la tabla principal y la tabla creada, y quedo excelente sin perdida de velocidad, el inconveniente que podría haber si se usa mucho set relation podría tener inconvenientes en mi caso como no trabajo con ese comando se adapta perfectamente.

Saludos

Víctor Hugo Espínola Domínguez

unread,
Nov 7, 2013, 3:15:34 PM11/7/13
to publicesvfoxpro
Hola Daniel

Puedes experimentar con un cursor en vez de la tabla, puede que sea más rápido aún.

Saludos,
Víctor.
Lambaré - Paraguay.

Daniel Sánchez

unread,
Nov 7, 2013, 8:01:17 PM11/7/13
to Comunidad de Visual Foxpro en Español
En mi clase dynamicbackcolor quedo así

pvalue=Evaluate(field(this.nfieldevalua))
Local ;
lnx, caliasactual
m.lnx=1
IF !EOF("myordengrid")
m.lnx=RECNO("myordengrid")
ENDIF 
If Mod(m.lnx, 2) = 0 Then
this.ncolorrowactual= this.colorcolumnimpar 
Else
this.ncolorrowactual= this.colorcolumnpar 
ENDIF
RETURN this.ncolorrowactual 

donde this.colorcolumninpar, this.colorcolumnpar son propiedades de mi clase que contiene la referencia del color para cada caso y this.nfieldevalua el número del campo de donde obtengo el dato deseado de la tabla, lo pongo así porque el campo deseado puede variar en cada tabla donde realizo mis listados, así que depende de la tabla a trabajar por eso esta en una propiedad para poder cambiarlo.
y getrowvalues quedo así,

Local ;
lnRowCount, ;
lcField1, caliasgetrow
m.caliasgetrow=ALLTRIM(this.RecordSource)
SELECT (m.caliasgetrow)
lcField1 = Field( this.nfieldevalua  )
m.lnRowCount = 0
SELECT &lcfield1 FROM (m.caliasgetrow) WHERE 2=1 INTO CURSOR myordengrid READWRITE 
SELECT (m.caliasgetrow)
SCAN 
cpvalor=&lcfield1
SELECT myordengrid
APPEND BLANK 
replace (lcfield1) WITH cpvalor
ENDSCAN 
SELECT myordengrid
INDEX ON &lcfield1 TAG xfield 
SELECT (m.caliasgetrow)
SET RELATION TO &lcfield1 INTO myordengrid 

This.RowCount = RECCOUNT("myordengrid") && m.lnRowCount

Return m.lnRowCount

No pude obtener los datos con un simple select sql, porque no respeta el indice de la tabla para obtener los datos, así que no me quedo otra que obtener un cursor en blanco con el campo deseado y hacer un scan sobre la tabla ordenada para almacenar el valor del campo en el cursor, lamentablemente ese método puede retrasar un poco el proceso pero no encontré mejor forma. Aún así este método para marcar las filas pares e impares sin importar la cantidad de filas a marcar es instantáneo en comparación al método con array que va perdiendo performance cuando mas filas tiene la tabla.

Saludos
Reply all
Reply to author
Forward
0 new messages