ON LOSTFOCUS - PROBLEMA

HMG en Español

Moderator: Rathinagiri

User avatar
SALINETAS24
Posts: 200
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

ON LOSTFOCUS - PROBLEMA

Post by SALINETAS24 » Sun Oct 14, 2018 12:07 pm

Hola a todos, tengo un problema de validación.
El usuario dispone de varios campos de entrada TEXTBOX y cuando salta a otro campo, osea, cuando pierden el foco son dirigidos a una función de búsqueda y retorna.
Para ilustrar el problema he cogido un programa ejemplo de HMG y lo he puesto a continuación. El caso es que después de varias pruebas, no consigo que me funcione.
Si por el contrario cambio el ON LOSTFOCUS por un ON ENTER, entonces funciona sin problemas, pero entonces no detecta de los cambios con el Ratón.
¿Alguien me puede iluminar...?
Muchas gracias.

Code: Select all

/*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
*/

#include "hmg.ch"

Function Main

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN 

		@ 10,10 TEXTBOX Text_1 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("PRIMERA" )


		@ 40,10 TEXTBOX Text_2 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("SEGUNDA")


	END WINDOW

	Form_1.Center

	Form_1.Activate

Return Nil

STATIC PROC Poner_Ventana(cTitulo)
		
*	IF !IsWIndowActive (Form_2) 
		
		DEFINE WINDOW Form_2 ;
			AT 0,0 ;
			WIDTH 140 HEIGHT 180 ;
			TITLE cTitulo ;
			MODAL
			
			@ 50,10 TEXTBOX Text_2 ;
				VALUE 123 ;
				TOOLTIP 'PASA SALIR' ;
				NUMERIC ;
				MAXLENGTH 5 ;
				RIGHTALIGN 
			
			DEFINE BUTTON D
				ROW	10
				COL	10
				WIDTH	160
				CAPTION	'Pulsa para salir'
				ACTION	Form_2.Release
			END BUTTON
		END WINDOW

		Form_2.Center

		Form_2.Activate	

*	ENDIF
	
RETURN
		

		


User avatar
SALINETAS24
Posts: 200
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Sun Oct 14, 2018 12:12 pm

Como curiosidad, poniendo un TEXTBOX entre los que tienen el ON LOSTFOCUS, el programa aparentemente funciona, pero eso no es solución, por lo menos para mi problema. Ya que en mis caso los tres TEXTBOX tiene un ON LOSTFOCUS.
Extraño comportamiento..., o soy yo que no se como aplicar esta caracteristica.

Code: Select all

*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
*/

#include "hmg.ch"

Function Main

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN 

		@ 10,10 TEXTBOX Text_1 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("PRIMERA" )


		@ 40,10 TEXTBOX Text_3 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN 

		@ 90,10 TEXTBOX Text_2 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("SEGUNDA")


	END WINDOW

	Form_1.Center

	Form_1.Activate

Return Nil

STATIC PROC Poner_Ventana(cTitulo)
		
*	IF !IsWIndowActive (Form_2) 
		
		DEFINE WINDOW Form_2 ;
			AT 0,0 ;
			WIDTH 140 HEIGHT 180 ;
			TITLE cTitulo ;
			MODAL
			
			@ 50,10 TEXTBOX Text_2 ;
				VALUE 123 ;
				TOOLTIP 'PASA SALIR' ;
				NUMERIC ;
				MAXLENGTH 5 ;
				RIGHTALIGN 
			
			DEFINE BUTTON D
				ROW	10
				COL	10
				WIDTH	160
				CAPTION	'Pulsa para salir'
				ACTION	Form_2.Release
			END BUTTON
		END WINDOW

		Form_2.Center

		Form_2.Activate	

*	ENDIF
	
RETURN
		


User avatar
mustafa
Posts: 704
Joined: Fri Mar 20, 2009 11:38 am
Location: Alicante - Spain
Been thanked: 80 times

Post by mustafa » Sun Oct 14, 2018 2:56 pm

Hola Nanu
Te paso una solución que no me termina de gustar pero no está dando Error
por que esta parando el Error en:

IF IsWindowDefined( Form_2 )
* msgStop( SPACE(3)+"Window is in Use -> Form_2","Attention !!!" )
RETURN NIL
ENDI

Los expertos si pueden mirarlo , ya nos darán la solución

Code: Select all

*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
*/

#include "hmg.ch"

DECLARE WINDOW Form_2

Function Main

PRIVATE cTitulo
PRIVATE nMemo 

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN  NOMAXIMIZE NOSIZE              

                ON KEY ESCAPE ACTION Form_1.Release

		@ 10,10 TEXTBOX Text_1 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("PRIMERA" )


		@ 90,10 TEXTBOX Text_2 ;
			VALUE 345 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("SEGUNDA")


	END WINDOW


	Form_1.Center
	Form_1.Activate

Return Nil

*----------------------------------------------------------------*
STATIC PROC  Poner_Ventana(cTitulo)
*----------------------------------------------------------------*

   IF  IsWindowDefined( Form_2 ) 
     * msgStop(  SPACE(3)+"Window is in Use -> Form_2","Attention !!!" )
       RETURN NIL
   ENDIF 

   IF cTitulo = "PRIMERA"
      nMemo := Form_1.Text_1.Value
   ELSE
      nMemo := Form_1.Text_2.Value
   ENDIF

  		 DEFINE WINDOW Form_2 ;
			AT 0,0 ;
			WIDTH 240 HEIGHT 180 ;
			TITLE cTitulo ;
			MODAL
                
                   ON KEY ESCAPE ACTION Form_2.Release
			
			@ 50,10 TEXTBOX Text_2x ;
				VALUE nMemo    ;
				TOOLTIP 'PASA SALIR' ;
				NUMERIC ;
				MAXLENGTH 5 ;
				RIGHTALIGN 
			
			DEFINE BUTTON D
				ROW	10
				COL	10
				WIDTH	160
				CAPTION	'Pulsa para salir'
				ACTION	Form_2.Release
			END BUTTON
		END WINDOW

                Form_2.Center
		Form_2.Activate	


	
RETURN
		
Saludos
Mustafa :?

User avatar
serge_girard
Posts: 2140
Joined: Sun Nov 25, 2012 2:44 pm
DBs Used: 1 MySQL - MariaDB
2 DBF
Location: Belgium
Has thanked: 449 times
Been thanked: 102 times
Contact:

Post by serge_girard » Sun Oct 14, 2018 4:28 pm

I use this:

Code: Select all

If !IsWIndowActive (Form_1) 
   DEFINE WINDOW Form_1   ;
   ...
   END WINDOW

   CENTER WINDOW   Form_1
   ACTIVATE WINDOW Form_1

ELSE
   Form_1.SetFocus
ENDIF

User avatar
SALINETAS24
Posts: 200
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Sun Oct 14, 2018 5:47 pm

Hola Mustafa, como tu indicas también funciona.
Tenemos las dos opciones, o intercalamos un TEXTBOX sin el ON LOSTOFOCUS o añadimos la condición que tu indicas y entonces si que todos los TEXTBOX puede llevar en ON LOSTFOCUS.
Creo que no debería existir este error, pero así lo hemos parado.
Esperaremos a ver noticias de los "padres fundadores". ;)
Muchas gracias como siempre :D

Code: Select all

/*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
*/

#include "hmg.ch"

Function Main

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN 

		@ 10,10 TEXTBOX Text_1 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("PRIMERA" )


		@ 40,10 TEXTBOX Text_2 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("SEGUNDA" )

		@ 70,10 TEXTBOX Text_3 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN 
			
		@ 100,10 TEXTBOX Text_4 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS Poner_ventana("CUARTA")


	END WINDOW

	Form_1.Center

	Form_1.Activate

Return Nil

STATIC PROC Poner_Ventana(cTitulo)
		
	IF !IsWindowDefined( Form_2 )
		DEFINE WINDOW Form_2 ;
			AT 0,0 ;
			WIDTH 140 HEIGHT 180 ;
			TITLE cTitulo ;
			MODAL
			
			@ 50,10 TEXTBOX Text_2 ;
				VALUE 123 ;
				TOOLTIP 'PASA SALIR' ;
				NUMERIC ;
				MAXLENGTH 5 ;
				RIGHTALIGN 
			
			DEFINE BUTTON D
				ROW	10
				COL	10
				WIDTH	160
				CAPTION	'Pulsa para salir'
				ACTION	Form_2.Release
			END BUTTON
		END WINDOW

		Form_2.Center

		Form_2.Activate	

	ENDIF
	
RETURN
		
		

User avatar
SALINETAS24
Posts: 200
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Wed Oct 17, 2018 9:07 pm

Hola, sigo teniendo problemas con ON LOSTFOCUS
Esto que dice el manual es una trola
OnLostFocus Event
Occurs when a control or window had lost the input focus

Si pones dos seguidos el sistema se vuelve loco.., como una regadera.

Code: Select all

*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
*/

#include "hmg.ch"

Function Main

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN 

		@ 10,10 TEXTBOX Text_1 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("PRIMERA" ))


		@ 40,10 TEXTBOX Text_2 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("SEGUNDA" ))

		@ 70,10 TEXTBOX Text_3 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("TERCERA" ))
			
		@ 100,10 TEXTBOX Text_4 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("CUARTA" ))


	END WINDOW

	Form_1.Center

	Form_1.Activate

Return Nil

STATIC PROC Poner_Ventana(cTitulo)
	MSGBOX("SALIENDO DEL TEXTBOX "+ctitulo)
RETURN
	
Una vez compilado y ejecutado verás que hace un LOSTKEY de un TEXTBOX sin saber el porqué. Imaginate ahora el lio si llamas a funciones y traspasas variables, arrays ., etc.., un desastre.

¿alguien sabe la manera correcta de utilizar el ON LOSTFOCUS en más de un TEXTBOX..?

Muchas gracias y una cervecita fresquita...

User avatar
srvet_claudio
Posts: 2044
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 35 times
Been thanked: 146 times
Contact:

Post by srvet_claudio » Thu Oct 18, 2018 12:24 am

Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

User avatar
SALINETAS24
Posts: 200
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Thu Oct 18, 2018 6:03 am

Hola Claudio, gracias por contestar.

Me imagino por su respuesta que debe ser sencillo de solucionar, pero yo lo consigo. No se como implementar en el programa que puse líneas más arriba lo que me indica, debo ser muy torpe.

Por favor, si usted pudiese o alguien que haya tenido lo mismo, (varios ON LOSTFOCUS seguidos) colocar la solución en mi ejemplo creo que todos los usuario de HMG quedaríamos agradecidos.

¿o acaso soy yo solo el que utiliza varios ON LOSTFOCUS seguidos..?

Muchas gracias y cervezas fresquitas para todos.

User avatar
srvet_claudio
Posts: 2044
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 35 times
Been thanked: 146 times
Contact:

Post by srvet_claudio » Thu Oct 18, 2018 1:59 pm

El problema está en que al procesar un evento lostfocus es muy peligroso asignar el foco a otro control o ventana.

Ver en el link anterior:

...
While processing this message, do not make any function calls that display or activate a window. This causes the thread to yield control and can cause the application to stop responding to messages
...
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

User avatar
SALINETAS24
Posts: 200
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Thu Oct 18, 2018 6:47 pm

Pues no.., ya está resuelto.
Creo que por alguna razón que desconozco cuando se compila el código realiza un ajuste raro con el LOSTFOCUS forzando su ejecución. Es como si se ejecutara dos veces. Como si un pre compilador montase esta función por duplicado, siempre que no haya nada que se lo impida....., PUES IMPIDASEMOSLO.., somos más y mejores que el Bill Puertas. :lol:

Code: Select all

/*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
 *
 * MODIFICACION PARA VARIOS LOSTFOCUS REALIZADA POR SARGANTANA.SOFT
 * José Manuel Carbonell Bernabe
 * SargantanaSoft@Gmail.com
 * Petrer City - Alicante - Spain.
*/

#include "hmg.ch"
#define WM_KILLFOCUS 

Function Main

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN 

		@ 10,10 TEXTBOX Text_1 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("PRIMERA1","Form_1" ))


		@ 40,10 TEXTBOX Text_2 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("SEGUNDA","Form_1" ))

		@ 70,10 TEXTBOX Text_3 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("TERCERA1","Form_1" ))
			
		@ 100,10 TEXTBOX Text_4 ;
			VALUE 123 ;
			TOOLTIP 'Numeric TextBox' ;
			NUMERIC ;
			MAXLENGTH 5 ;
			RIGHTALIGN ;
			ON LOSTFOCUS (Poner_ventana("CUARTA","Form_1"))

	END WINDOW

	Form_1.Center
	Form_1.Text_1.Setfocus
	Form_1.Activate

Return Nil

STATIC PROC Poner_Ventana(cTitulo,cForm)
	IF !EMPTY(GetProperty( cForm, 'FocusedControl'))
			MSGBOX("AHORA PUEDO HACER LO QUE QUIERA","SIN PROBLEMAS EN "+cTitulo)
		ENDIF
RETURN
Ya me diréis si funciona y a disfrutarlo.
Gracias por leerme, aguantarme y por ayudarme.
Unas cervezas fresquitas para todos.

Post Reply