LIMPIAR BUFFER TECLADO + COSAS RARAS

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
SALINETAS24
Posts: 430
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 37 times
Been thanked: 51 times

LIMPIAR BUFFER TECLADO + COSAS RARAS

Post by SALINETAS24 »

Hola os paso un código sencillo que hace cosas raras.

Se trata una petición de datos que se repetirá mientras el usuario no pulse la tecla ESC. "Es necesario hacerlo así".
Para lo cual defino una ventana, pido los datos y la cierro. Si el usuario no ha pulsado ESC vuelvo a generar la misma ventana..., para eso la tengo dentro de un DO WHILE.
En el primer campo tengo un ON LOSTFOCUS ya que necesitaría hacer unas comprobaciones, y en el último también tengo otro ON LOSTFOCUS para hacer otras comprobaciones y un ON ENTER para salir. Sencillo

COSAS RARAS.
1/ Cuando ejecutas el programa la primera vez "PANTALLA 1" funcionara bien, pero a partir de ese momento si haces más entradas de datos verás que la condición

Code: Select all

ON LOSTFOCUS AccionInicial()
se ejecuta al finalizar la introducción del ultimo campo. SE EJECUTA DOS VECES. Pensé que sería por el BUFFER del teclado, he intentado borrarlo, pero no me ha servido de nada.

2/Otra cosa rara. Si hago un

Code: Select all

WIN_1.release
, es lógico pensar que se pierden todos los datos, y que cuando se vuelve a definir la ventana los campos se mostrarán en blanco...., PORQUE NO OCURRE.??

¿ Es posible que el comando "RELEASE" no lo limpie todo ?

Muy agradecido por vuestras respuestas y vamos a por una cervecita fresquita !! :D

Code: Select all

#include <hmg.ch>

FUNCTION Main

SET NAVIGATION EXTENDED


	DEFINE WINDOW  main ;
		AT 1,1 ;
		WIDTH 1020 ;
		HEIGHT 735 ;
		TITLE 'RARAS ' ;		
		MAIN 
	
		
		@ 10, 10 BUTTON Button_0 CAPTION "Pide datos" ACTION Rutina()
		
		
	END WINDOW	
	Main.Center
    Main.Activate	
	
RETURN


STATIC PROC Rutina()
PRIVATE lSalir:=.T.
PRIVATE nPan:=0

		DO WHILE lSalir
			nPan++
	
			DEFINE WINDOW WIN_1  at 10,10 width 300 height 200  MODAL
			
		 		ON KEY ESCAPE ACTION  (lSalir:=.f.,WIN_1.release)
				
				@ 10,10 LABEL   LB1 VALUE "Pantalla "+STR(nPan)
				
				@ 40,10 textbox t1  VALUE 	" " width 100 ;	
					ON LOSTFOCUS AccionInicial()
					
				@ 70,10 textbox t2  VALUE 	" " width 100
				
				@ 100,10 textbox t3  VALUE 	" " width 100
				
				@ 130,10 textbox t4  VALUE 	" " width 100 ;
					ON LOSTFOCUS AccionFinal()
					ON ENTER (HMG_CLEANLASTVIRTUALKEYDOWN(),WIN_1.release)
					
			END WINDOW	
			Win_1.Center
			ACTIVATE WINDOW Win_1
			HMG_CLEANLASTVIRTUALKEYDOWN()
		ENDDO
RETURN

STATIC PROC AccionInicial()
	MSGBOX("Accion al abandonar 1er TEXTBOX")
return
STATIC PROC AccionFinal()
	MSGBOX("Acción al abandonar ULTIMO")
return
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:

User avatar
srvet_claudio
Posts: 2111
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 48 times
Been thanked: 223 times
Contact:

Post by srvet_claudio »

Hola,
El comportamiento extraño es porque en un lostfocus le estas pasando el foco a otro elemento (a la ventana del msgbox) lo cual no se debe hacer en Windows. Prueba cambiar el mensaje del msgbox por un mensaje en un label.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

User avatar
SALINETAS24
Posts: 430
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 37 times
Been thanked: 51 times

Post by SALINETAS24 »

Gracias por la respuesta.

El problema de activar la ventana ya lo tengo solucionado, de hecho en los programas fuentes que he subido a este foro está implementada la solución. Ahora bien , mi gran problema era la activación de ese primer LOSTFOCUS de forma automática cuando terminaba la introducción de datos y en este tipo de proceso..., una ventana que se activa detrás de la otra y así hasta que el usuario pulsa ESC. El hacer este proceso así es para simular la entrada tipo GRID, o EXCEL.

He encontrado una solución, he eliminado el 2º LOSTFOCUS, dado que en mi programa en este 2º LOSTFOCUS solo hago el REPLACE de las DBf, por lo tanto no activo ninguna ventana Y no hay problema. Para la solución he añadido una variable a modo de SWP que me permite saber si puedo ejecutar o no la función del ON LOSTFOCUS, y también he incorporado un ON ENTER que me cambia el valor de esa variable para forzar su entrada y solucionado.
Por si alguien quiere usarlo, experimentar y mejorarlo.

Muy agradecido, vamos con la cervecita.

Code: Select all

#include <hmg.ch>

FUNCTION Main

SET NAVIGATION EXTENDED


	DEFINE WINDOW  main ;
		AT 1,1 ;
		WIDTH 1020 ;
		HEIGHT 735 ;
		TITLE 'RARAS ' ;		
		MAIN 
	
		
		@ 10, 10 BUTTON Button_0 CAPTION "Pide datos" ACTION Rutina()
		
		
	END WINDOW	
	Main.Center
    Main.Activate	
	
RETURN


STATIC PROC Rutina()
LOCAL A:=B:=C:=D:=""
LOCAL nSwp:=0
PRIVATE lSalir:=.T.
PRIVATE nPan:=0

		DO WHILE lSalir
			nPan++
	
			DEFINE WINDOW WIN_1  at 10,10 width 300 height 200  MODAL
			
				A:=B:=C:=D:=space(10)
			
		 		ON KEY ESCAPE ACTION  (lSalir:=.f.,WIN_1.release)
				
				@ 10,10 LABEL   LB1 VALUE "Pantalla "+STR(nPan)
				
				@ 40,10 textbox t1  VALUE 	a  width 100 ;	
					ON ENTER nSwp:=0 ;
					ON LOSTFOCUS IF(nSwp=0,AccionInicial(),(nSwp:=0,This.Setfocus) )
					
				@ 70,10 textbox t2  VALUE 	b width 100
				
				@ 100,10 textbox t3  VALUE 	c  width 100
				
				@ 130,10 textbox t4  VALUE 	d width 100 ;
					ON ENTER (nSwp:=1,WIN_1.release)
					
			END WINDOW	
			Win_1.Center
			ACTIVATE WINDOW Win_1
			HMG_CLEANLASTVIRTUALKEYDOWN()
		ENDDO
RETURN

STATIC PROC AccionInicial()
		DEFINE WINDOW WIN_2 at 10,10 width 100 height 150  MODAL
		
			@ 10,10 LABEL MENJ VALUE "NADA DE NADA"
			@ 40,10 BUTTON Button_0 CAPTION "SAL" ACTION WIN_2.release
							
		END WINDOW	
		Win_2.Center
		ACTIVATE WINDOW Win_2
RETURN
		

Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:

Post Reply