FoxPro/Visual FoxPro - Setfocus no hace ni caso

   
Vista:

Setfocus no hace ni caso

Publicado por Juan Miguel Solis solis.juanmiguel@gmail.com (79 intervenciones) el 08/07/2013 21:15:05
Hola

Ya estoy por aqui a ver si podeis echarme una mano y esto le ha pasado a alguien, os cuento:

Tengo un formulario que en la pantalla parecer 25 campos, de la siguiente manera:

CAMPO1-1 CAMPO2-1 CAMPO3-1 CAMPO4-1 CAMPO5-1
CAMPO1-2 CAMPO2-2 CAMPO3-2 CAMPO4-2 CAMPO5-2
CAMPO1-3 CAMPO2-3 CAMPO3-3 CAMPO4-3 CAMPO5-3
CAMPO1-4 CAMPO2-4 CAMPO3-4 CAMPO4-4 CAMPO5-4
CAMPO1-5 CAMPO2-5 CAMPO3-5 CAMPO4-5 CAMPO5-5

El TabStop va: CAMPO1-1 -> CAMPO2-1 -> CAMPO3-1 -> CAMPO4-1 -> CAMPO5-1
luego salta a la segunda fila y asi.

Yo queria que si en el campo CAMPO2-2, se pulsa "Flecha Arriba" el setfocus se vaya al CAMPO2-1, y si desde CAMPO2-2, se pulsa "Flecha Abajo" se vaya a CAMPO2-3.


En el evento KEYPRESS, el codigo por ejemplo que en el campo CAMPO2-2 es:


LPARAMETERS nKeyCode, nShiftAltCtrl

With Thisform

Do Case

Case nKeyCode = 5 or nKeyCode = 56 && Flecha arriba sola o con MAY
.CAMPO2-1.setfocus

Case nKeyCode = 24 or nKeyCode = 50 && Flecha abajo sola o con MAY
.CAMPO2-3.setfocus

EndCase

EndWith


Buneo pues con este codigo si las pulsaciones de flracha arriba/abajo las hago con MYA pulsada, funciona perfectamente, pero si pulso solo la flecha arriba/abajo me salta de lines y se va al siguiente, esto os ha pasado aalguien ??

Gracias anticipadas y 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

Setfocus no hace ni caso

Publicado por Fidel (558 intervenciones) el 08/07/2013 23:48:07
Para que eso funcione y no sea un rompecabezas te digo lo siguiente:

1) En el formulario colocar la propiedad Keypreview=.T.
2) Agregar un Container
3) Agregar los Textbox al container, como vienen de fábrica, con la distribución que necesitas:
Para el caso que planteas, van cinco por línea:
Text1,text2,text3,text4,text5
text6,text7.text8,text9,text10
Text11,text12,text13,text14,text15
etc..
Supongamos que el container se llama "Container2"
4) Agrega al formulario un método, con el nombre "BindGo" (por ejemplo) y 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
LPARAMETERS nKeyCode, nShiftAltCtrl
LOCAL obj,nEvents,nSalto,lnnum,lcNum
nSalto=5      && esto porque agrupas de a 5.
nEvents=AEVENTS(gaEvents,0)
IF nEvents=0
	RETURN
ENDIF
obj=gaEvents[1]
lcNum=CHRTRAN(obj.name,CHRTRAN(obj.Name,"1234567890",""),"")  && número de Textbox.
lnNum=VAL(lcNum)
DO case
	CASE nKeyCode=5
		lnNum=lnNUm-nSalto
		IF lnNum>0
			lcGo="Text"+LTRIM(STR(lnNUm))
			IF PEMSTATUS(obj.parent,lcGo,5)
				nodefault
				obj.parent.&lcGo..setfocus
			ENDIF
		ENDIF
 
	CASE nKeyCode=24
		lnNUm=lnNUm+nSalto
		lcGo="Text"+LTRIM(STR(lnNUm))
		IF PEMSTATUS(obj.parent,lcGo,5)
			nodefault
			obj.parent.&lcGo..setfocus
		ENDIF
	CASE nKeyCode=4
		lnNum=lnNum+1
		lcGo="Text"+LTRIM(STR(lnNUm))
		IF PEMSTATUS(obj.parent,lcGo,5)
			nodefault
			obj.parent.&lcGo..setfocus
		ENDIF
ENDCASE
* FIN DEL METODO [BINDGO]


5) En el Init del Formulario, coloca lo siguiente:
1
2
3
4
5
IF PEMSTATUS(thisform,"Container2",5)
	FOR EACH ocontrol IN thisform.Container2.Controls
		BINDEVENT(oControl,"KeyPress",thisform,"bindgo")
	ENDFOR
ENDIF


No necesitas escribir código en los Keypress de cada TextBox. Funcionarán gracias a BindEvent()
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

Setfocus no hace ni caso

Publicado por Juan Miguel solis.juanmiguel@gmail.com (79 intervenciones) el 09/07/2013 11:00:42
Fidel, gracias por al respuesta, pero se me olvido decirte que esta en VFP 6.0 :(: (

El BINDEVENT o lo veo..

Muchas gracias de todas manera por tu tiempo.

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

Setfocus no hace ni caso

Publicado por Fidel (558 intervenciones) el 09/07/2013 17:37:20
Ya que estás en problemas!. BindEvent no existe hasta VFP8, creo.
Mejor te haces una clase TextBox con el código de keyPress y la insertas cuantas veces necesites.
El tema es la estructuración. O sea, poder utilizar los números consecutivos de objetos, para establecer una referencia mecánica, y no tener que escribir un código diferente en cada keypress.
De esta forma, como el planteo es cuadrado (y siempre puede ser cuadrado, aunque algunos textbox tengan que estar Visible=.F.), depende de cuantas columnas tiene la configuración.

Este código es de un almanaque. Tiene 42 textbox distribuido en 7 columnas (y 6 filas, claro). Los Textbox se llaman desde Text1 a Text42.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
* Keypress del TextBox de Clase
 
LPARAMETERS nKeyCode, nShiftAltCtrl
LOCAL obj,nEvents,nSalto
nSalto=7
obj=This
 
lcNum=CHRTRAN(obj.name,CHRTRAN(obj.Name,"1234567890",""),"")
lnNum=VAL(lcNum)
DO case
	CASE nKeyCode=13
		&& selecciona el día y cierra el form
		&& Unload del form debe conducir la respuesta.
		&&
		NODEFAULT
 
		lnDay=obj.Value
		lcFrase=LTRIM(STR(lnDay))+" de "+this.selmes+" de "+LTRIM(STR(this.ano))
		this.dia=lnDay
		_Screen.Fechasel=DATE(this.ano,this.mes,this.dia)
		thisform.Release
 
	CASE nKeyCode=5
		&& Flecha arriba
		lnNum=lnNUm-nSalto
		IF lnNum>0
			lcGo="Text"+LTRIM(STR(lnNUm))
			IF PEMSTATUS(obj.parent,lcGo,5)
				NODEFAULT
				obj.parent.&lcGo..setfocus
			ENDIF
		ENDIF
 
	CASE nKeyCode=24
		&& Flecha abajo
		lnNUm=lnNUm+nSalto
		lcGo="Text"+LTRIM(STR(lnNUm))
		IF PEMSTATUS(obj.parent,lcGo,5)
			NODEFAULT
			obj.parent.&lcGo..setfocus
		ENDIF
	CASE nKeyCode=4
		&& Flecha derecha
		lnNum=lnNum+1
		lcGo="Text"+LTRIM(STR(lnNUm))
		IF PEMSTATUS(obj.parent,lcGo,5)
			NODEFAULT
			obj.parent.&lcGo..setfocus
		ENDIF
ENDCASE
 
* En el Evento programmaticChange
&& esto se necesita en el almanaque. Al no ser visible, no pueden ganar foco y la orden de SetFocus será ignorada. Como el objeto existe y se coloca NODEFAULT, el objeto que tiene el foco no lo pierde. &&
 
this.Visible=!EMPTY(this.Value)
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

Setfocus no hace ni caso

Publicado por Juan Miguel solis.juanmiguel@gmail.com (79 intervenciones) el 09/07/2013 22:48:39
Ok, gracias por tu tiempo Fidel.

Lo intentare implementar :) : a ver que sale.

Un saludo

P.D: De todas maneras, no se porque con Mayusculas pulsada me recoge bien el nKeyCode y funciona muy bien, y en cambio sin pulsar mayusculas no me hace ni caso :) :) :)

Otro 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

Setfocus no hace ni caso

Publicado por Fidel (558 intervenciones) el 10/07/2013 16:10:27
Juan.
Para la posdata, debes agregarle NODEFAULT, para que Visual Fox no privilegie el movimiento normal de las flechas 5 y 24. Lo que sucede es que la combinación May + Flecha Arriba ó May + Flecha abajo no tienen respuesta alguna en un TextBox. En cambio las flechas solas recorren el TabOrder. Fijate que la flecha izquierda vuelve un tab hacia atrás, mientras que la derecha, avanza un caracter dentro del textbox. Si querés que avance un tabOrder, tenés que detectar la pulsación y ponerle NODEFAULT, con el despacho de foco correspondiente.


LPARAMETERS nKeyCode, nShiftAltCtrl

With Thisform

Do Case

Case nKeyCode = 5 or nKeyCode = 56 && Flecha arriba sola o con MAY
NODEFAULT
.CAMPO2-1.setfocus

Case nKeyCode = 24 or nKeyCode = 50 && Flecha abajo sola o con MAY
NODEFAULT
.CAMPO2-3.setfocus

EndCase

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

Setfocus no hace ni caso

Publicado por Juan Miguel solis.juanmiguel@gmail.com (79 intervenciones) el 11/07/2013 10:40:31
Hola FIdel

Ole, Ole y Ole, efectivamente faltaba el NODEFAULT, muchas gracias, de todas manera seguiré tu consejo y lo montare como comentabas en otra entrada.

Muchas gracias por tu ayuda, a veces aunque llevo mucho tiempo programando, se traba uno en cosas mas simples :) :)

En fin lo dicho muchas gracias y 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