VALIDAR TEXTBOX Y SALIR

HMG en Español

Moderator: Rathinagiri

SALINETAS24
Posts: 65
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 1 time

VALIDAR TEXTBOX Y SALIR

Post by SALINETAS24 » 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)

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

User avatar
andyglezl
Posts: 919
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 11 times
Been thanked: 34 times
Contact:

Post by andyglezl » Mon Mar 12, 2018 8:17 pm

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
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
koke
Posts: 41
Joined: Wed Aug 21, 2013 3:54 pm
DBs Used: DBF, mySql, mariaDB
Has thanked: 3 times
Been thanked: 10 times

Post by koke » Tue Mar 13, 2018 12:27 pm

O crea una función que funcione como intermediaria para validar la tecla presionada.
,___,
[O.o]
/)__)
-”–”-
KoKe

User avatar
srvet_claudio
Posts: 2014
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 34 times
Been thanked: 140 times
Contact:

Post by srvet_claudio » Tue Mar 13, 2018 2:46 pm

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

SALINETAS24
Posts: 65
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 1 time

Post by SALINETAS24 » Tue Mar 13, 2018 9:13 pm

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:

EduardoLuis
Posts: 553
Joined: Tue Jun 04, 2013 6:33 pm
Location: Argentina
Been thanked: 33 times

Post by EduardoLuis » Tue Mar 13, 2018 9:58 pm

Hola Saniletas24:

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

SALINETAS24
Posts: 65
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 1 time

Post by SALINETAS24 » Wed Mar 14, 2018 10:27 pm

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

SALINETAS24
Posts: 65
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 1 time

Post by SALINETAS24 » Wed Mar 14, 2018 11:17 pm

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.

User avatar
srvet_claudio
Posts: 2014
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 34 times
Been thanked: 140 times
Contact:

Post by srvet_claudio » Thu Mar 15, 2018 1:08 am

Es algo así:

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

Function TestKey
IF HMG_GetLastVirtualKeyDown() <> VK_ESCAPE
HMG_CleanLastVirtualKeyDown()
...
Endif
Return nil
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

User avatar
andyglezl
Posts: 919
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 11 times
Been thanked: 34 times
Contact:

Post by andyglezl » Thu Mar 15, 2018 1:48 am

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
Andrés González López
Desde Guadalajara, Jalisco. México.

Post Reply