FoxPro/Visual FoxPro - Agregar columnas en Grid en modo ejecución

 
Vista:
sin imagen de perfil

Agregar columnas en Grid en modo ejecución

Publicado por Juan (71 intervenciones) el 27/01/2014 09:11:19
Buenos días, lo que estoy haciendo es en un Grid, agrego unas columnas en tiempo ejecución, según las que me convengan. Mi pregunta es como sé yo en el título de que columna se está haciendo click para saber como ordenar ese campo.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Agregar columnas en Grid en modo ejecución

Publicado por Fidel José (558 intervenciones) el 27/01/2014 14:53:52
El título de una columna de un grid es un objeto Header (Header1 sin no le cambias el name) que está contenido en la columna. Asi que, desde el click del Header tienes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
*!*	Header1.Click
*!*	Referencias
*!*	lcNameColumn=this.Parent.Name
*!*	lcFileCampo=This.Parent.ControlSource
*!*	lcNameGrid=this.Parent.Parent.Name
 
LOCAL nLines,nt,lnRec,lcIndice,i
STORE "" TO lcIndice
 
* Obtener nombre de tabla y campo afectado
nLines=ALINES(gaLines,UPPER(This.Parent.ControlSource),1,".")
*!*	ControlSource es siempre "Tabla.Campo"
*!*	lcTabla=gaLines[1]
*!*	lcCampo=gaLines[2]
IF nLines<2
	* No hay ninguna tabla
	RETURN
ENDIF
 
SELECT (gaLines[1])	&& selecciono la tabla
lnRec=RECNO(galines[1])	&& determino la posición actual del puntero
NT=ATAGINFO(GATAGS)		&& devuelve los índice de la tabla o cursor
* Buscar si el campo afectado tiene una etiqueta de índice
FOR i=1 TO nt
	IF LEFT(gatags[i,3],LEN(gaLines[2]))==galines[2]
		LcIndice=gatags[i,1]
		EXIT
	ENDIF
ENDFOR
IF EMPTY(lcIndice)
	* No hay etiqueta asignada al campo
	RETURN
ENDIF
SET ORDER TO (lcIndice)			&& establece el master
this.Parent.Parent.Refresh		&& refresh para el control Grid
IF !EMPTY(lnRec)
	GO lnRec					&& envía el puntero al registro dónde estaba
ELSE
	GO top						&& si LnREc=0 envía al primer registro del orden
ENDIF
this.Parent.Parent.SetFocus		&& Envía el foco al control Grid

Este código lo deberías pegar en todos los Click Event de los Header1.

Como el objeto header1 no es subclaseable por diseñador de clases, puedes apelar a BindEvent() para evitar tener que pegar ese código en cada Header.

Lo más conveniente es colocar el código en una clase custom y pegar la clase al formulario.
Para ensayar, mientras tanto, puedes utilizar un formulario con un control grid.
1) Crear un método en el formulario, llamado (por ejemplo) BndGrid, con el siguiente código:;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
*!* BndGrid User Method
*!* ------------------------------
LOCAL lnEvents,obj,nLines,nt,lnRec,lcIndice,i
LOCAL ARRAY gaEvents(1),gaLines(1)
lnEvents=AEVENTS(gaEvents,0)
IF lnEvents=0
	RETURN
ENDIF
obj=gaEvents[1]
 
STORE "" TO lcIndice
 
* Obtener nombre de tabla y campo afectado
nLines=ALINES(gaLines,UPPER(Obj.Parent.ControlSource),1,".")
IF nLines<2
	* No hay ninguna tabla
	RETURN
ENDIF
 
SELECT (gaLines[1])	&& selecciono la tabla
lnRec=RECNO(galines[1])	&& determino la posición actual del puntero
NT=ATAGINFO(GATAGS)		&& devuelve los índice de la tabla o cursor
* Buscar si el campo afectado tiene una etiqueta de índice
FOR i=1 TO nt
	IF LEFT(gatags[i,3],LEN(gaLines[2]))==galines[2]
		LcIndice=gatags[i,1]
		EXIT
	ENDIF
ENDFOR
IF EMPTY(lcIndice)
	* No hay etiqueta asignada al campo
	RETURN
ENDIF
SET ORDER TO (lcIndice)			&& establece el master
Obj.Parent.Parent.Refresh		&& refresh para el control Grid
IF !EMPTY(lnRec)
	GO lnRec					&& envía el puntero al registro dónde estaba
ELSE
	GO top						&& si LnREc=0 envía al primer registro del orden
ENDIF
Obj.Parent.Parent.SetFocus		&& Envía el foco al control Grid

2) En el header1 de cada columna no pones nada.
* En el init del formulario, coloca la instrucción BindEvent() como muestra el código siguiente.
* Si tienes una rutina de configuración del Control Grid, agregas el BindEvent después de la configuración.

1
2
3
4
5
WITH thisform.griD1
	FOR i=1 TO .ColumnCount
		BINDEVENT(.columns[i].Header1,"Click",thisform,"bndgrid")
	NEXT
ENDWITH
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Agregar columnas en Grid en modo ejecución

Publicado por neo (1604 intervenciones) el 28/01/2014 02:47:12
Excelente José Fidel, te felicito maestro, gracias por tus valiosos aportes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Agregar columnas en Grid en modo ejecución

Publicado por Juan (71 intervenciones) el 28/01/2014 09:23:03
Muchas gracias, me ha sido de mucha ayuda.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar