Page 1 of 1

ERROR

Posted: Fri Aug 31, 2018 8:49 pm
by SALINETAS24
Hola, os adjunto el programa SAMPLES/COMBO_9. Lo he puesto por comodidad, el error detectado sucede en la secuencia del TEXTBOX.

En el ".PRG" incorporado la siguiente linea

Code: Select all


		@ 40 ,10 TEXTBOX GET_2 WIDTH 50 VALUE 0 NUMERIC  INPUTMASK "999" ON LOSTFOCUS  miraver()
		
y también le he añadido esta función

Code: Select all

STATIC FUNC miraver()
	DEFINE WINDOW Win_2	AT 1,1	WIDTH 400 HEIGHT 420 ;
		TITLE 'VENTANA DE PRUEBA' ;	
		MODAL   				;
		ON INIT (msgbox("probando"), Win_2.Release)
	END WINDOW
	CENTER WINDOW   Win_2
	ACTIVATE WINDOW Win_2
RETURN
Es simple, cada vez que pierda el foco que ejecute la función, y en principio funciona correctamente ...., hasta que :
Si nos situamos en el TEXTBOX y acto seguido desplazamos el ratón fuera de pantalla y pulsamos en cualquier lado se casca el programa y aparece la siguiente pantalla ?¿?¿??¿¿¿?¿?¿?¿?¿?¿

Image

Re: ERROR

Posted: Fri Aug 31, 2018 11:27 pm
by luisvasquezcl
Es porque hay 2 ventanas modales. La win_2 y la magbox. Si cambias la win_2 a child andará bien.

Re: ERROR - BUG

Posted: Sat Sep 01, 2018 8:44 am
by SALINETAS24
Hola Luis, gracias por contestar. No funciona.
Vuelvo a enviar de nuevo el ejemplo con el mismo error pero en este caso va con la estructura que yo utilizo en mis ".PRG".

Yo parto de una ventana MAIN (como todos y es la que tiene el MENU)
Esta ventana llama a distintos ".PRG", con procesos para "ALTAS, BAJAS, CONSULTAS, LISTADOS, ETC" y en estos la ventana que empleo es una "MODAL".
Y por último, en algunos de estos procesos, por necesidades del programa, utilizo una llamada a una función, como es el caso, que me abre una ventana donde muestro los registros de un fichero, tambien es una ventana "MODAL" y es ahí donde me sigue "cascando".
No se cual es la estructura de la llamada a las diferentes ventanas, ni para que se debería utilizar cada una, o si es mejor en un momento dado utilizar un formato u otro....., no he encontrado nada y lo poco.., no lo he terminado de entender. :lol:


Bueno, lo dicho, "recuelgo" el ".PRG" con lo que de momento es un BUG :mrgreen:

Y gracias por anticipado por la ayuda.

Re: ERROR

Posted: Sat Sep 01, 2018 11:54 am
by edk
Hi, try this:

Code: Select all

STATIC FUNC miraver()

        IF HB_IsString ( Form_2.FocusedControl ) .AND. ( Empty ( Form_2.FocusedControl ) .OR. Form_2.FocusedControl == "CANCELA" )
		Return NIL
	ENDIF
		
	DEFINE WINDOW Win_2	AT 1,1	WIDTH 400 HEIGHT 420 ;
		TITLE 'VENTANA DE PRUEBA' ;	
		MODAL  ;
		ON INIT (msgbox("probando"), Win_2.Release)			;
		BACKCOLOR  { 209,220,231 } ;
		FONT "Arial" SIZE 10 
	
		
	END WINDOW
	CENTER WINDOW   Win_2
	ACTIVATE WINDOW Win_2
RETURN

Re: ERROR

Posted: Sat Sep 01, 2018 4:44 pm
by SALINETAS24
Hola edk y gracias por contestar.
Sigue teniendo el mismo problema. Te pongo la pantalla con el error.
Una observación, la FUNC miraver(), es una FUNCION GENERICA, que en mi apliación puede ser llamada desde cualquier ventana o cualquier ".PRG", no sirve (FORM_2.FocusedControl), ya que FORM_2 puede cambiar.
Por ponerte un ejemplo, lo que hace miraver(), una vez el usuario introduce un código, lo busca pero si lo deja en blanco presenta una ventana con los Registros para que usuario pueda seleccionar uno. Es por eso que la función miraver() es llamada desde el Mantenimiento de Artículos, clientes, proveedores, facturas, etc, etc.
Salvo que el uso de la tercera ventana no pueda ser MODAL, (que alguien me indique como usarlas)...., creo sinceramente que es un BUG de la libreria. Los padres creadores no contemplaron la posibilidad que yo muestro y que detectará el usuario cuando coincida todo lo que he indicado.., un lostfocus, una ventana... y un error.

Re: ERROR

Posted: Sat Sep 01, 2018 5:35 pm
by SALINETAS24
Ya tengo la solución .., y muy sencilla. Muchas gracias "edk" por la idea.
De todas formas es una solución "chapucerilla", creo que deberian mirar que produce este "error" de flujo del programa.

Code: Select all

	If (.Not. IsWIndowActive (Win_2) ) 

		DEFINE WINDOW Win_2	AT 1,1	WIDTH 400 HEIGHT 420 ;
			TITLE 'VENTANA DE PRUEBA' ;	
			MODAL  ;
			ON INIT (msgbox("probando"), Win_2.Release)			;
			BACKCOLOR  { 209,220,231 } ;
		FONT "Arial" SIZE 10 
	
		
		END WINDOW
		CENTER WINDOW   Win_2
		ACTIVATE WINDOW Win_2
	ENDIF

Re: ERROR

Posted: Sat Sep 01, 2018 6:29 pm
by edk
Hola SALINETAS24.

Me di cuenta de que estás usando Windows XP.
Uso Windows 10 y mi solución funciona correctamente, mientras que la tuya tiene un efecto secundario: cuando haces clic en el control GET_2 en Windows START (Inicio), el evento ON INIT del formulario Win_2 es exagerado y MsgBox aparece "probando".
Además, al hacer clic en el control GET_2 en el botón CANCELAR, se muestra el evento que causa la ventana Win_2, que probablemente no sea su intención.
Probablemente haya diferencias en los sistemas XP y 10 para desencadenar eventos posteriores.
20180901_205234.7z
(1.39 MiB) Downloaded 182 times
SALINETAS24 wrote: Sat Sep 01, 2018 4:44 pm Una observación, la FUNC miraver(), es una FUNCION GENERICA, que en mi apliación puede ser llamada desde cualquier ventana o cualquier ".PRG", no sirve (FORM_2.FocusedControl), ya que FORM_2 puede cambiar.
Para que mi solución funcione para diferentes formas, puede usar esto:

Code: Select all

Local cFocusedControl := GetProperty( ThisWindow.Name, 'FocusedControl')
IF HB_IsString ( cFocusedControl ) .AND. ( Empty ( cFocusedControl ) .OR. cFocusedControl == "CANCELA" )
	Return NIL
ENDIF
donde en todas las formas el control llamado CANCELA es responsable de cancelar el formulario.

PS. Si desea que la función funcione desde cualquier ".PRG", no debe usar la STATIC Function ;)

Re: ERROR

Posted: Sun Sep 02, 2018 12:39 am
by SALINETAS24
Hola edk, ¡¡MUCHAS GRACIAS!!, muy buena la función

Code: Select all

GetProperty( ThisWindow.Name, 'FocusedControl')
Me gusta y la usare.., seguro.
En cuanto a mi opción me funciona muy bien, en el ejemplo como dices tu al cancelar se muestra la ventana, (era un ejemplo incompleto), pero tiene fácil solución. Hasta ahora yo lo hacia con una variable tipo lSwp que tomaba valor ".T." o falso, pero debo reconocer que con tu función el resultado es mucho mejor... :P

Code: Select all

	@ 10 ,110 TEXTBOX GET_2 WIDTH 50 VALUE 0 NUMERIC  INPUTMASK "9" ;
	ON LOSTFOCUS  IF(GetProperty( ThisWindow.Name, 'FocusedControl')!="CANCELAR",miraver(),nil)
PD. Muy bien visto..., si quieres una función genérica no uses STATIC :lol:

Re: ERROR

Posted: Sun Sep 02, 2018 8:40 pm
by edk
SALINETAS24 wrote: Sat Sep 01, 2018 4:44 pm Salvo que el uso de la tercera ventana no pueda ser MODAL, (que alguien me indique como usarlas)...., creo sinceramente que es un BUG de la libreria. Los padres creadores no contemplaron la posibilidad que yo muestro y que detectará el usuario cuando coincida todo lo que he indicado.., un lostfocus, una ventana... y un error.
Hola de nuevo
Estaba intrigado por lo que escribiste que no puede haber tres ventanas MODAL.
Decidí verificarlo y no es verdad.
A continuación se muestra un ejemplo simple de quince ventanas MODAL generadas en tiempo de ejecución.

Code: Select all

#Include "hmg.ch"

Function Main()

	DEFINE WINDOW Form_1			;
		AT 0,0				;
		WIDTH 500			;  
		HEIGHT 220			;
		TITLE "Modals"	;		
		MAIN				;      
		NOMAXIMIZE			;
		NOSIZE				

		DEFINE MAIN MENU
			DEFINE POPUP '&Test'
				MENUITEM "Modal Windows" ACTION Modals()
			END POPUP
		END MENU
	END WINDOW		

	CENTER WINDOW   Form_1

	ACTIVATE WINDOW Form_1

Return

Func Modals()

Local i, fname, BCaption
	For i=1 to 15
		fname:='Modal_' + AllTrim (Str ( i ) )
		BCaption:='Next Modal Window #' + AllTrim (Str ( i + 1 ) )
		fNext:='"Modal_' + AllTrim (Str (i + 1) ) + '"'
		fPrev:='"Modal_' + AllTrim (Str (i - 1) ) + '"'

		DEFINE WINDOW &fname AT 0+(i*25),0+(i*25) WIDTH 500 HEIGHT 220 ;
				TITLE fName  ;
				MODAL ;
				NOSIZE ;
				ON RELEASE IF( _IsWindowDefined (&fPrev), ( DoMethod ( &fPrev, 'Next_modal', 'Release') , DoMethod( &fPrev, 'Release_modal', 'Show')), Nil)
				
				@ 150,100 BUTTON Release_modal CAPTION 'Release Modal Window' WIDTH 180 HEIGHT 30 ACTION ThisWindow.Release
			
				IF i < 15
					DoMethod( fname, 'Release_modal', 'Hide')
					@ 150,100 BUTTON Next_modal CAPTION BCaption WIDTH 180 HEIGHT 30 ACTION DoMethod( &fNext, 'Activate' )
				ENDIF
					
		END WINDOW
	Next i
	
	ACTIVATE WINDOW Modal_1
	
Return

Re: ERROR

Posted: Sun Sep 02, 2018 10:20 pm
by SALINETAS24
Hola Edk, si lees el post anterior dice .
luisvasquezcl wrote: Fri Aug 31, 2018 11:27 pm Es porque hay 2 ventanas modales. La win_2 y la magbox. Si cambias la win_2 a child andará bien.
y es a raiz esa respuesta que me indica el amigo Luis que tengo que cambiar el tipo de la ventana, cuando yo digo

SALINETAS24 wrote: ↑Sat Sep 01, 2018 4:44 pm
Salvo que el uso de la tercera ventana no pueda ser MODAL, (que alguien me indique como usarlas)....

No afirmo.., pregunto y pido ayuda.., igual falta el signo de interrogación despues de MODAL ?¿¿?¿ :lol:

Pero el problema no era la ventana en si.., recuerda que es la perdida del foco, o la resursividad que tenia en el TEXTBOX y que quedo solucionado con

If (.Not. IsWIndowActive (Win_2) )

Muchas gracias por preocuparte.., una cerveza fresquita a tu salud. ;)