Page 1 of 2

VALIDAR TEXTBOX Y SALIR

Posted: Mon Mar 12, 2018 7:37 pm
by SALINETAS24
Hola, tengo un problema que es de suponer que tiene facil solución pero no la encuento.

En un programa tengo un TEXTBOX que pide un código de cliente articulo y ejecuta Busca_Arti.
El problema, que siempre me lo busca, aunque cancele la opción.
Lo que quiero es que no se ejecute la Funcion si se quiere salir, sea con el boton cancel, con la tecla ESC o cerrando la ventana.
Antes sabia que tecla se pulsaba con el Lastkey(), ¿tenemos en harbour alguna que nos permita realizar o no realizar algo en base a la tecla pulsada..?

Muchas gracias.


@ 96 , 405 TEXTBOX Control_2 ;
WIDTH 85 ;
VALUE aField[2];
MAXLENGTH 10 ;
ON LOSTFOCUS Busca_arti(This.Value)

FUNCTION Busca_arti(cValor)
Local lRet:=.F.
IF !EMPTY(cValor)
ARTICULOS->(DbSeek(cValor))
@ 96,500 LABEL Narti ;
VALUE ARTICULOS->DESCRIP
lRet:=.T.
endif
RETURN lRet

Re: VALIDAR TEXTBOX Y SALIR

Posted: Mon Mar 12, 2018 8:17 pm
by andyglezl
SALINETAS24 wrote: Mon Mar 12, 2018 7:37 pm Hola, tengo un problema que es de suponer que tiene facil solución pero no la encuento.

En un programa tengo un TEXTBOX que pide un código de cliente articulo y ejecuta Busca_Arti.
El problema, que siempre me lo busca, aunque cancele la opción.
Lo que quiero es que no se ejecute la Funcion si se quiere salir, sea con el boton cancel, con la tecla ESC o cerrando la ventana.
Antes sabia que tecla se pulsaba con el Lastkey(), ¿tenemos en harbour alguna que nos permita realizar o no realizar algo en base a la tecla pulsada..?

Muchas gracias.


@ 96 , 405 TEXTBOX Control_2 ;
WIDTH 85 ;
VALUE aField[2];
MAXLENGTH 10 ;
ON LOSTFOCUS Busca_arti(This.Value) <======== Si cambias esta linea por ON ENTER

********** ON LOSTFOCUS Siempre lo ejecuta porque este control siempre pierde el foco, al seleccionar otro control


FUNCTION Busca_arti(cValor)
Local lRet:=.F.
IF !EMPTY(cValor)
ARTICULOS->(DbSeek(cValor))
@ 96,500 LABEL Narti ;
VALUE ARTICULOS->DESCRIP
lRet:=.T.
endif
RETURN lRet

Re: VALIDAR TEXTBOX Y SALIR

Posted: Tue Mar 13, 2018 12:27 pm
by koke
O crea una función que funcione como intermediaria para validar la tecla presionada.

Re: VALIDAR TEXTBOX Y SALIR

Posted: Tue Mar 13, 2018 2:46 pm
by srvet_claudio

Re: VALIDAR TEXTBOX Y SALIR

Posted: Tue Mar 13, 2018 9:13 pm
by SALINETAS24
Hola, muchas gracias a todos, pero sigo sin conseguirlo.

Si el campo código está a cero o en blanco y le doy al boton cancelar siempre me ejecuta la busqueda. Si cerro la ventana no.
He imprimido los valores que me ha indicado el Sr. Claudio para comprobar si alguno hacia referencia al boton cancelar pero debo ser más corto que las mangas de un chaleco..,no lo he logrado.
Antes en clipper bastaba un
If lastkey()!=27 ----> a buscar.

buaaaaaaa.., me esta constando avanzar con cosas simples.., ya veremos cuando lleguemos al meollo.

Por favor, como puedo hacer algo tan simple.
Muchas gracias. :shock:

Re: VALIDAR TEXTBOX Y SALIR

Posted: Tue Mar 13, 2018 9:58 pm
by EduardoLuis
Hola Saniletas24:

Yo utilizaría ON CHANGE en lugar de ON LOSTFOCUS ó ON ENTER.-

Re: VALIDAR TEXTBOX Y SALIR

Posted: Wed Mar 14, 2018 10:27 pm
by SALINETAS24
Hola, sigue sin funcionar. NO ENCUENTRO LA FORMA de que se cancele el formulario si que previamente ejecute el LOSTFOCUS o el ON ENTER.

Me he creado una variable lSalir que vale .F. mientras no pulse el botón cancelar, pero ni por esas.
Cuando en el TEXTBOX Control_2 pongo un valor de un código que existe y pulso el botón cancelar, funciona a las mil maravillas, si no pongo nada también. El problema lo tengo cuando pongo un código que no existe y pulso el botón cancelar, entonces me dice que el articulo no existe, (no tendría que decir nada..., simplemente salir), y se queda en punto muerto, si pulso otra vez el botón cancelar entonces sale.

Es de suponer que este problema se les habrá presentado a muchos de ustedes, he estado leyendo en los foros y no encuentro ninguna solución. No se trata de nada raro, solo comprobar un valor siempre y cuando no se haya decicido salir.


Me pueden ayudar.?

Aqui les paso parte del código. Muchas gracias de antemano.

Code: Select all

#include 'hmg.ch'
#include "dbf.ch"


Function _MANTPEDI()

LOCAL lNuevo:=.F.
LOCAL lSalir:=.F.
PRIVATE aField:={}
PRIVATE Getlist:={}

Set Navigation Extended

OPEN ARTICULOS, TIPOS, PEDIDOS, LPEDIDOS

PEDIDOS -> ( SaveFields( aField , 1 ) )

   DEFINE WINDOW Win_1				;
	AT 0,0					;
	WIDTH 800				;
	HEIGHT 560				;
	TITLE 'Mantenimiento de Pedidos'	;
	MODAL   				

	DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 59,35 IMAGESIZE 20,20  FLAT BORDER

		BUTTON Nuevo 		;
			CAPTION '&Nuevo' 	;
			PICTURE 'nuevo'	;
			ACTION ( lSalir:=.F., lNuevo:=.T. , Nuevo2(aField) )

		BUTTON CERRAR 	;
			CAPTION '&Cerrar'	;
			PICTURE 'cerrar' ;
			ACTION Win_1.release 

	END TOOLBAR

     @ 56,10 GRID grid_1				;
		WIDTH 290  				;
		HEIGHT 460 				;	
		HEADERS { "F.Pedido", "Artículo","DESCRIPCIÓN" }	;
		WIDTHS { 80 , 100 ,100 }			;
		ROWSOURCE "PEDIDOS"			;
		COLUMNFIELDS { 'Fecha' , 'Articulo' , "IF(ARTICULOS->DbSeek(Pedidos->ARTICULO), ARTICULOS->DESCRIP, nil)" } ;
		ON CHANGE Actualizar2(aField) ;
		ON DBLCLICK ActivarEdicion1() 

	@ 56,310 FRAME FRAME_1 ;
		WIDTH 475     ;
		HEIGHT 460 				
	
  	@ 66 , 330 LABEL LABEL_1 ;
		VALUE 'Fecha:' ;
		WIDTH 80
		
	@ 66 , 405 DATEPICKER Control_1 ;
	        TOOLTIP "FECHA DE PEDIDO" ;
		    VALUE aField[1] 

	@ 96 , 330 LABEL LABEL_2 ;
		VALUE 'Artículo:' ;
		WIDTH 80

		
	@ 96 , 405 TEXTBOX Control_2 ;
		WIDTH 85  ;
        VALUE aField[2];
		MAXLENGTH 10 ;
		ON LOSTFOCUS IF(!lSalir,IF(Busca_arti(This.Value, lSalir), nil , nil),nil)

///--------------------------------------------------------------------------------
/// --> TODOS LAS PRUEBAS QUE HE UTILIZADO 
* ON LOSTFOCUS IF(!lSalir,IF(Busca_arti(This.Value, lSalir), nil , Win_1.Control_2.setFocus),nil)
* ON LOSTFOCUS IF(!lSalir,IF(Busca_arti(This.Value, lSalir), nil , This.SetFocus),nil)
* ON ENTER Busca_arti(This.Value , lSalir)		
* ON LOSTFOCUS Busca_arti(This.Value) 


    @ 96, 550 LABEL n_arti VALUE "" TRANSPARENT

	@ 126 , 330 LABEL LABEL_3 ;
		VALUE 'Descripción:' ;
		WIDTH 80

	@ 126 , 405 TEXTBOX Control_3 ;
	        WIDTH 270        ;
		VALUE aField[3];
		MAXLENGTH 30

	@ 476,425 BUTTON CANCELAR ;
		CAPTION 'Cancela&r' ;
		ACTION ( lSalir:=.T., DesactivarEdicion2(), Actualizar2(aField), lNuevo:=.F.  )	

   END WINDOW

   DesactivarEdicion2()     //-> ACTIVAMOS SOLO EL GRID
   Win_1.grid_1.SetFocus    //-> Le damos el control al GRID
   Win_1.grid_1.RecNo := PEDIDOS->(RecNo())

   CENTER WINDOW Win_1
*   Actualizar2(aField)  
   ACTIVATE WINDOW Win_1
   CLOSE DATABASES

RETURN Nil



///------------>
/// ESTA ES LA RUTINA QUE EJECUTA SIEMPRE .., SI O SI
/// ----------------

[code]
FUNCTION Busca_arti(cValor, lSalir)
Local lRet:=.T.

	IF !lSalir
		IF !EMPTY(cValor)
			ARTICULOS->(DbSeek(cValor))
			IF ARTICULOS->(Found())
				Win_1.n_arti.Value := ARTICULOS->DESCRIP
			  ELSE
			    Win_1.n_arti.Value := SPACE(30)
			    lRet:=.F.
				MsgBox("Registro no creado")		
			ENDIF
			Win_1.n_arti.Refresh
		ENDIF
		
	ENDIF
		
RETURN lRet

Re: VALIDAR TEXTBOX Y SALIR

Posted: Wed Mar 14, 2018 11:17 pm
by SALINETAS24
Bueno .., después de varios intentos creo que he dado con la solución.
Cuando la tenga la pondré aquí mismo con el fin de evitar a otro compañero que vaya penando por este valle de lagrimas buscando una ayuda para pasar un mantenimiento mondo y lirondo de Clipper a Hmg.

Re: VALIDAR TEXTBOX Y SALIR

Posted: Thu Mar 15, 2018 1:08 am
by srvet_claudio
Es algo así:

SET CONTROL <ControlName> OF <FormName> ONKEYEVENT  TestKey ()

Function TestKey
IF HMG_GetLastVirtualKeyDown() <> VK_ESCAPE
HMG_CleanLastVirtualKeyDown()
...
Endif
Return nil

Re: VALIDAR TEXTBOX Y SALIR

Posted: Thu Mar 15, 2018 1:48 am
by andyglezl
Es complicado probar si no envias lo necesario...

Pero con ON ENTER funciona

Code: Select all

	@ 96 , 405 TEXTBOX Control_2 ;
		WIDTH 85  ;
        VALUE "aField[2]";	//aField[2];
		MAXLENGTH 10 ;
		ON ENTER Busca_arti(This.Value)
------------------------------------------------------------------
FUNCTION Busca_arti(cValor, lSalir)
Local lRet:=.T.

	*IF !lSalir
		IF !EMPTY(cValor)
			*ARTICULOS->(DbSeek(cValor))
			*IF ARTICULOS->(Found())
			*	Win_1.n_arti.Value := ARTICULOS->DESCRIP
			*  ELSE
			*    Win_1.n_arti.Value := SPACE(30)
			*    lRet:=.F.
			*	MsgBox("Registro no creado")		
			*ENDIF
			MsgBox("Entre a Busca_arti")
			Win_1.n_arti.Refresh
		ENDIF
	*ENDIF
RETURN lRet