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