Xavi y José F.Gimenez
Voy a reportar esto por si fuera un bug aunque no lo creo, pero por si
acaso lo pongo y así me quedo mas tranquilo, si pongo lo que tú me has
dicho que parece lógico que es evaluar si he pulsado el botón cancelar y
entonces no evaluar lo que está dentro del IF así:
METHOD F_PUESTAExit( oSender, oNextCtl ) CLASS TFormIndiv
*
LOCAL lCorrecto := Nil
*
IF oNextCtl != ::oCancelar
IF oSender:dValue < ::oF_ENCESTE:dValue
*
MsgAlert(" !! La fecha de puesta en marcha del reloj " + CHR(13) + ;
" no puede ser menor que la fecha de enceste.
!!",AppData:gCaption)
*
lCorrecto := .F.
*
ELSEIF oSender:dValue >= ::oF_SUELTA:dValue
*
MsgAlert(" !! La fecha de puesta en marcha del reloj " + CHR(13) + ;
" no puede ser mayor o igual que la fecha de" + CHR(13) + ;
" suelta. !!",AppData:gCaption)
*
lCorrecto := .F.
*
ENDIF
ENDIF
RETURN lCorrecto
Estando en un TdbDataPicker y al hacer la evaluación del evento OnExit
de dicho control me salta este error.
***************************** Registro de errores
*****************************
Fecha: 10/01/2007
Hora: 12:29:17
Memoria libre: 193192
Area actual: 9
------------------------- Información del compilador
--------------------------
Versión Xailer: Xailer 1.2.1 Version 1.2a
Compilador: xHarbour build 0.99.61 Intl. (SimpLex) PCode Version: 7
Compilador C/C++: Borland C++ 5.5.1
Plataforma: Windows XP Professional 5.01.2600 Service Pack 2
----------------------- Información detallada del error
-----------------------
Subsistema: BASE
Código de error: 1072
Estado: .F.
Descripción: Error de argumento
Operación: <>
Argumentos: [ 1] = Tipo: O Valor: [ 2] = Tipo: O Valor:
Fichero:
Código error SO: 0
Pila de llamadas:
TFORMINDIV:F_PUESTAEXIT (998)
TDBDATEPICKER:ONEXIT (0)
TDBDATEPICKER:VALID (906)
TFORMINDIV:GONEXTCONTROL (0)
(b)XCONTROL:XCONTROL (96)
TDBDATEPICKER:GONEXTCONTROL (0)
TDBDATEPICKER:WMCHAR (991)
TFORMINDIV:SHOWMODAL (0)
TFORMMENU:INDIVIDUAL (319)
(b)TFORMMENU:CREATEFORM (141)
TTOOLBUTTON:ONCLICK (0)
(b)XTOOLBUTTON:XTOOLBUTTON (41)
TTOOLBUTTON:CLICK (0)
TTOOLBAR:COMMAND (372)
TREBAR:WMCOMMAND (256)
RUNFORM (0)
TAPPLICATION:RUN (208)
MAIN (35)
La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
De todas formas gracias Xevi he entendido perfectamente lo que me
querías decir, y tú después de toda la retorica que he metido has dado
con lo importante, pero como ves te ha ocurrido lo que a mí me pasaba
que no me funcionaba.
Mil gracias por tu tiempo.
José Ramón Castro.
xAvi escribió:
> Jo...!, no lo he acabado de entender pero me quedo con.-
> > "lo que yo quiero conseguir es que el evento OnExit no se evalúe
> cuando pulse Cancelar y que no cierre el formulario sino que haga lo que
> tiene definido en OnClick del botón."
>
> Pongamos que el botón Cancelar es: oCancelBtn.
> COMPONENT oCancelBtn
> Con mrNone y lCancel a FALSE.
> oNextCtl != ::oCancelBtn y será como si OnExit no se evalúe al perder el
> foco pulsando Cancelar.
> Se evaluará para el resto de controles del formulario.
> Luego la "pulsación Click" de Cancelar ejecutará OnClick de oCancelBtn.
>
> Un saludo
> Xavi
>
> José Ramón Castro Polinio escribió:
>> Xavi:
>>
>> A raíz de lo expuesto más abajo, imaginemos que tenemos un formulario
>> con cuatro botones:
>>
>> Nuevo cuando lo pulsamos activa AddNew y pone lEnabled := .T. los
>> botones Cancelar y grabar y lEnabled := .F. los botones Nuevo y Salir.
>>
>> Cancelar no cierra el formulario sino que pone Close a la acción de
>> nuevo pone lEnabled := .T. los botones Nuevo y Salir y pone lEnabled
>> := ..F. los botones Cancelar y Grabar.
>>
>> Grabar solo se activa cuando se pulsa en nuevo y sirve para grabar lo
>> que hay en el formulario en modo AddNew con Update
>>
>> Salir Cierra el formulario.
>>
>> Si le damos a nuevo activamos Cancelar y Grabar, pero si estando en
>> cualquier control del formulario en el evento OnExit quiero cancelar
>> teniendo un error con lo que has puesto no funciona o por lo menos a
>> mi no teniendo el botón cancelar a mrNone y lCancel a .F. y si lo
>> pongo a mrCancel me cierra el formulario, lo que yo quiero conseguir
>> es que el evento OnExit no se evalúe cuando pulse Cancelar y que no
>> cierre el formulario sino que haga lo que tiene definido en OnClick
>> del botón.
>>
>> En mi caso no me interesa cerrar el formulario y volverlo a abrir en
>> modo añadir y entrar continuamente porque voy a dar de alta muchos
>> registros que comparten todos los mismos datos menos dos o tres que
>> son los que cambian, por eso dándole al Botón Nuevo tengo con Load()
>> los mismos datos anteriores y solo tengo que modificar lo que me
>> interesa.
>>
>> Me podéis dar alguna sugerencia.
>>
>> José Ramón Castro.
>>
>> xAvi escribió:
>>> Cualquier control (::oControl) del formulario que al recibir el foco
>>> de ::NroRamo no lo valide.
>>> Por ejemplo el Boton de "Cancelar" con lCancel a FALSE.
>>> Que sólo se valide si recibe el foco un control determinado: oNextCtl
>>> == ::oControl.
>>> Que sólo se valide, o no, si recibe el foco un tipo de controles
>>> determinados: oNextCtl:IsKindOf('TEdit') o !oNextCtl:IsKindOf('TEdit').
>>> Disponer de un sistema genérico de validaciones en el método OnClose
>>> de la clase, etc,...
>>>
>>> Un cordial saludo
>>> Xavi
>>>
>>> Daniel Du Pré escribió:
>>>> Xavi:
>>>>
>>>> Gracias por la ayuda, y una pregunta ¿que significa lo que está
>>>> comentado y para que se puede utilizar? *( **.and. oNextCtl !=
>>>> ::oControl )* acá me perdí.
>>>>
>>>> Saludos
>>>> Daniel.
>>>>
>>>>
>>>> xAvi escribió:
>>>>> Prueba esto.
>>>>> Te puede ayudar aunque no sea el Boton "Cancelar"

>>>>>
>>>>> METHOD NroRamoExit( oSender, oNextCtl ) CLASS TProg6110
>>>>> Local lRes
>>>>>
>>>>> if( oNextCtl != nil /* .and. oNextCtl != ::oControl */ )
>>>>> WITH OBJECT oSender
>>>>> if( :Value == 0 )
>>>>> MsgInfo("Nro. de Ramo no válido")
>>>>> lRes := FALSE
>>>>> elseif( :oDataSet:seek(str(:Value,4)) )
>>>>> MsgInfo("Ya existe Ramo con ese nro.")
>>>>> lRes := FALSE
>>>>> endif
>>>>> END
>>>>> endif
>>>>> return lRes
>>>>>
>>>>> Un saludo
>>>>> Xavi
>>>>>
>>>>> Daniel Du Pré escribió:
>>>>>> Hola Foro:
>>>>>>
>>>>>> En una ayuda que le pase a PILO puse dos .prg con ejemplos para
>>>>>> validar la existencia de una valor en un campo de una tabla e
>>>>>> impedir que ese valor quede en 0, pero haciendo pruebas vi que el
>>>>>> método que se dispara en el OnExit del control a validar funciona
>>>>>> bien cuando se da click en el botón "aceptar" pero, si se da click
>>>>>> en el botón "cancelar" del formulario, lógicamente también se
>>>>>> dispara el evento OnExit, mostrando por lo tanto un mensaje que no
>>>>>> se debería mostrar (MsgInfo("Nro. de Ramo no válido").
>>>>>> ¿Como puedo controlar este comportamiento?, si no se ingresa
>>>>>> ningún valor en el formulario la única forma de cerrarlo es dando
>>>>>> click en la cruz de la ventana del formulario y quisiera que
>>>>>> también se cierre dando click en el botón "cancelar"
>>>>>>
>>>>>> METHOD NroRamoExit( oSender, oNextCtl ) CLASS TProg6110
>>>>>>
>>>>>> WITH OBJECT oSender
>>>>>> if :Value == 0
>>>>>> MsgInfo("Nro. de Ramo no válido")
>>>>>> Return .F.
>>>>>> endif
>>>>>> if :oDataSet:seek(str(:Value,4))
>>>>>> MsgInfo("Ya existe Ramo con ese nro.")
>>>>>> Return .F.
>>>>>> endif
>>>>>> END WITH
>>>>>>
>>>>>> Muchas gracias
>>>>>> Daniel.
>>>>>>
>>>>>> Return .T.
>>>>>>