In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Boton Cancelar en OnExit

Foro público de Xailer en español
Responder
ddupre
Mensajes: 334
Registrado: Lun Nov 12, 2007 3:53 pm

Boton Cancelar en OnExit

Mensaje por ddupre »

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.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Boton Cancelar en OnExit

Mensaje por jfgimenez »

Daniel,
pon la propiedad del botón lCancel = .T.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
ddupre
Mensajes: 334
Registrado: Lun Nov 12, 2007 3:53 pm

Boton Cancelar en OnExit

Mensaje por ddupre »

Gracias José, anduvo perfecto
Saludos
Jose F. Gimenez escribió:
> Daniel,
>
> pon la propiedad del botón lCancel = .T.
>
>
Xavi[1]
Mensajes: 55
Registrado: Mar Jul 18, 2006 2:02 pm

Boton Cancelar en OnExit

Mensaje por Xavi[1] »

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.
>
ddupre
Mensajes: 334
Registrado: Lun Nov 12, 2007 3:53 pm

Boton Cancelar en OnExit

Mensaje por ddupre »

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
<tt>Xavi:<br>
<br>
Gracias por la ayuda, y una pregunta Âque significa lo que estÃ
comentado y para que se puede utilizar? <b><font color="#3333ff">( </font></b></tt><b><font
color="#3333ff">.and. oNextCtl != ::oControl )</font></b> acà me
perdÃ. <br>
<br>
Saludos<br>
Daniel.<br>
<br>
<br>
xAvi escribiÃ:
<blockquote cite="mid45a3b434$1@news.xailer.com" type="cite">Prueba
esto.
<br>
Te puede ayudar aunque no sea el Boton "Cancelar" ;-)
<br>
<br>
METHOD NroRamoExit( oSender, oNextCtl ) CLASS TProg6110
<br>
ÂÂ Local lRes
<br>
<br>
ÂÂ if( oNextCtl != nil /* .and. oNextCtl != ::oControl */ )
<br>
ÂÂÂÂÂ WITH OBJECT oSender
<br>
ÂÂÂÂÂÂ ÂÂ if( :Value == 0 )
<br>
ÂÂÂÂÂÂ ÂÂÂÂÂ MsgInfo("Nro. de Ramo no vÃlido")
<br>
ÂÂÂÂÂÂ ÂÂÂÂÂ lRes := FALSE
<br>
ÂÂÂÂÂÂ ÂÂ elseif( :oDataSet:seek(str(:Value,4)) )
<br>
ÂÂÂÂÂÂ ÂÂÂÂÂ MsgInfo("Ya existe Ramo con ese nro.")
<br>
ÂÂÂÂÂÂ ÂÂÂÂÂ lRes := FALSE
<br>
ÂÂÂÂÂÂ ÂÂ endif
<br>
ÂÂÂÂÂ END
<br>
ÂÂ endif
<br>
return lRes
<br>
<br>
Un saludo
<br>
Xavi
<br>
<br>
Daniel Du Prà escribiÃ:
<br>
<blockquote type="cite">Hola Foro:
<br>
<br>
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").
<br>
Â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"
<br>
<br>
METHOD NroRamoExit( oSender, oNextCtl ) CLASS TProg6110
<br>
<br>
WITH OBJECT oSender
<br>
 if :Value == 0
<br>
ÂÂÂÂ MsgInfo("Nro. de Ramo no vÃlido")
<br>
ÂÂÂÂ Return .F.
<br>
 endif
<br>
 if :oDataSet:seek(str(:Value,4))
<br>
ÂÂÂÂ MsgInfo("Ya existe Ramo con ese nro.")
<br>
ÂÂÂÂ Return .F.
<br>
 endif
<br>
END WITH
<br>
<br>
Muchas gracias
<br>
Daniel.
<br>
<br>
Return .T.
<br>
<br>
</blockquote>
</blockquote>
</body>
</html>
Xavi[1]
Mensajes: 55
Registrado: Mar Jul 18, 2006 2:02 pm

Boton Cancelar en OnExit

Mensaje por Xavi[1] »

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.
>>>
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Boton Cancelar en OnExit

Mensaje por jrcpoli-quitar »

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.
>>>>
ddupre
Mensajes: 334
Registrado: Lun Nov 12, 2007 3:53 pm

Boton Cancelar en OnExit

Mensaje por ddupre »

Gracias Xavi, me has aclarado mucho.
Daniel.
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.
>>>>
Xavi[1]
Mensajes: 55
Registrado: Mar Jul 18, 2006 2:02 pm

Boton Cancelar en OnExit

Mensaje por Xavi[1] »

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.
>>>>>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Boton Cancelar en OnExit

Mensaje por jfgimenez »

José Ramón,
lo que dice Xavi te puede servir, pero tendrías que comprobar el parámetro
de oNextCtl en cada uno de los eventos OnExit. Es más sencillo poner lCancel
= .T. en ese botón y retornar .F. en su evento OnClick para que no se cierre
el formulario.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Boton Cancelar en OnExit

Mensaje por jrcpoli-quitar »

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.
>>>>>>
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Boton Cancelar en OnExit

Mensaje por jrcpoli-quitar »

José F. Gimenez
Gracias, esto si que hace lo que que deseo, cuando pulso el botón
cancelar aunque tenga un error no evalúa el evento OnExit y tampoco se
sale del formulario.
METHOD CancelarNuevoClick( oSender ) CLASS TFormIndiv
*
** Desactivamos el modo Add
WITH OBJECT ::oDbfIndividual
:Cancel()
:Skip(0)
:Load()
*
** Ponemos Anadir a False
::lAnadir := :lOnAppend
*
END
*
** Activa botones
::Activar()
*
RETURN .F.
José Ramón Castro.
Jose F. Gimenez escribió:
> José Ramón,
>
> lo que dice Xavi te puede servir, pero tendrí­as que comprobar el parámetro
> de oNextCtl en cada uno de los eventos OnExit. Es más sencillo poner lCancel
> = .T. en ese botón y retornar .F. en su evento OnClick para que no se cierre
> el formulario.
>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Boton Cancelar en OnExit

Mensaje por jfgimenez »

José Ramón,
> La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
Es una limitación de xHarbour: no se pueden comparar con el operador !=
(distinto) dos objetos. El único operador que se puede usar es el de
igualdad exacta (==). Por lo tanto, esa línea tienes que cambiarla a:
IF !( oNextCtl == ::oCancelar )
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Xavi[1]
Mensajes: 55
Registrado: Mar Jul 18, 2006 2:02 pm

Boton Cancelar en OnExit

Mensaje por Xavi[1] »

Sólo a modo de ejemplo, para clarificar y, por cambiar de estilo.
METHOD F_PUESTAExit( oSender, oNextCtl ) CLASS TFormIndiv
Local lRes
if( oNextCtl != nil .and. !(oNextCtl == ::oCancelar) )
WITH OBJECT oSender
if( :dValue < ::oF_ENCESTE:dValue )
MsgAlert( e" !! La fecha de puesta en marcha del relojn no puede ser menor que la fecha de enceste. !!", AppData:gCaption )
lRes := FALSE
elseif( :dValue >= ::oF_SUELTA:dValue )
MsgAlert( e" !! La fecha de puesta en marcha del relojn no puede ser mayor o igual que la fecha den suelta. !!", AppData:gCaption )
lRes := FALSE
endif
END
endif
return lRes
Un cordial saludo
Xavi
Jose F. Gimenez escribió:
> José Ramón,
>
>> La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
>
> Es una limitación de xHarbour: no se pueden comparar con el operador !=
> (distinto) dos objetos. El único operador que se puede usar es el de
> igualdad exacta (==). Por lo tanto, esa lí­nea tienes que cambiarla a:
>
> IF !( oNextCtl == ::oCancelar )
>
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Boton Cancelar en OnExit

Mensaje por jrcpoli-quitar »

Jose F. Gimenez escribió:
> José Ramón,
>
>> La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
>
> Es una limitación de xHarbour: no se pueden comparar con el operador !=
> (distinto) dos objetos. El único operador que se puede usar es el de
> igualdad exacta (==). Por lo tanto, esa lí­nea tienes que cambiarla a:
>
> IF !( oNextCtl == ::oCancelar )
>
Perfecto ya se que no puedo comparar dos objetos como lo hací­a lo tendré
en cuenta.
José Ramón Castro.
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Boton Cancelar en OnExit

Mensaje por jrcpoli-quitar »

Xevi:
Perdona pero está claro que el error era mio al comparar los objetos,
ese tema está aclarado.
En cuanto a la forma que me has enviado para no emplear el operador
CHR(13) para el salto de linea en los mensajes, lo desconocí­a ya que en
mi lenguaje anterior no existí­a y xHarbord no lo he utilizado nunca, así­
que quedo enterado del resto se que podí­a haberlo hecho empleando
oSender, pero en fin vicios anteriores hacen que uno se vaya por otro
sitio, los iré mejorando con la práctica.
Muchas gracias por tú atención.
José Ramón Castro.
xAvi escribió:
> Sólo a modo de ejemplo, para clarificar y, por cambiar de estilo.
>
> METHOD F_PUESTAExit( oSender, oNextCtl ) CLASS TFormIndiv
> Local lRes
>
> if( oNextCtl != nil .and. !(oNextCtl == ::oCancelar) )
> WITH OBJECT oSender
> if( :dValue < ::oF_ENCESTE:dValue )
> MsgAlert( e" !! La fecha de puesta en marcha del relojn no
> puede ser menor que la fecha de enceste. !!", AppData:gCaption )
> lRes := FALSE
> elseif( :dValue >= ::oF_SUELTA:dValue )
> MsgAlert( e" !! La fecha de puesta en marcha del relojn no
> puede ser mayor o igual que la fecha den suelta. !!", AppData:gCaption )
> lRes := FALSE
> endif
> END
> endif
> return lRes
>
> Un cordial saludo
> Xavi
>
> Jose F. Gimenez escribió:
>> José Ramón,
>>
>>> La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
>>
>> Es una limitación de xHarbour: no se pueden comparar con el operador
>> != (distinto) dos objetos. El único operador que se puede usar es el
>> de igualdad exacta (==). Por lo tanto, esa lí­nea tienes que cambiarla a:
>>
>> IF !( oNextCtl == ::oCancelar )
>>
Xavi[1]
Mensajes: 55
Registrado: Mar Jul 18, 2006 2:02 pm

Boton Cancelar en OnExit

Mensaje por Xavi[1] »

NO. El error es mio, se me paso por no ejecutar el programa, sorry.
Un saludo
XAVI
José Ramón Castro Polinio escribió:
> Xevi:
>
> Perdona pero está claro que el error era mio al comparar los objetos,
> ese tema está aclarado.
>
> En cuanto a la forma que me has enviado para no emplear el operador
> CHR(13) para el salto de linea en los mensajes, lo desconocí­a ya que en
> mi lenguaje anterior no existí­a y xHarbord no lo he utilizado nunca, así­
> que quedo enterado del resto se que podí­a haberlo hecho empleando
> oSender, pero en fin vicios anteriores hacen que uno se vaya por otro
> sitio, los iré mejorando con la práctica.
>
> Muchas gracias por tú atención.
>
> José Ramón Castro.
>
> xAvi escribió:
>> Sólo a modo de ejemplo, para clarificar y, por cambiar de estilo.
>>
>> METHOD F_PUESTAExit( oSender, oNextCtl ) CLASS TFormIndiv
>> Local lRes
>>
>> if( oNextCtl != nil .and. !(oNextCtl == ::oCancelar) )
>> WITH OBJECT oSender
>> if( :dValue < ::oF_ENCESTE:dValue )
>> MsgAlert( e" !! La fecha de puesta en marcha del relojn
>> no puede ser menor que la fecha de enceste. !!", AppData:gCaption )
>> lRes := FALSE
>> elseif( :dValue >= ::oF_SUELTA:dValue )
>> MsgAlert( e" !! La fecha de puesta en marcha del relojn
>> no puede ser mayor o igual que la fecha den suelta. !!",
>> AppData:gCaption )
>> lRes := FALSE
>> endif
>> END
>> endif
>> return lRes
>>
>> Un cordial saludo
>> Xavi
>>
>> Jose F. Gimenez escribió:
>>> José Ramón,
>>>
>>>> La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
>>>
>>> Es una limitación de xHarbour: no se pueden comparar con el operador
>>> != (distinto) dos objetos. El único operador que se puede usar es el
>>> de igualdad exacta (==). Por lo tanto, esa lí­nea tienes que cambiarla a:
>>>
>>> IF !( oNextCtl == ::oCancelar )
>>>
ddupre
Mensajes: 334
Registrado: Lun Nov 12, 2007 3:53 pm

Boton Cancelar en OnExit

Mensaje por ddupre »

Colegas:
He aprendido mucho con todos los aportes a este Hilo que comencé. Tanto
Xavi, como José Ramón y José F. Gimenez me han enseñado mucho más de lo
que pretendí­a con mi pregunta (cuando vi que la cosa se iba complicando
me mantuve callado, jeje) y por eso les agradezco y les digo que es
impresionante la "buena onda" (como decimos acá) que tienen.
Bueno, como por estas latitudes es verano, me voy a tomar una semanita
de descanso, nos vemos a la vuelta.
Saludos
Daniel.
xAvi escribió:
> NO. El error es mio, se me paso por no ejecutar el programa, sorry.
> Un saludo
> XAVI
>
> José Ramón Castro Polinio escribió:
>> Xevi:
>>
>> Perdona pero está claro que el error era mio al comparar los objetos,
>> ese tema está aclarado.
>>
>> En cuanto a la forma que me has enviado para no emplear el operador
>> CHR(13) para el salto de linea en los mensajes, lo desconocí­a ya que
>> en mi lenguaje anterior no existí­a y xHarbord no lo he utilizado
>> nunca, así­ que quedo enterado del resto se que podí­a haberlo hecho
>> empleando oSender, pero en fin vicios anteriores hacen que uno se
>> vaya por otro sitio, los iré mejorando con la práctica.
>>
>> Muchas gracias por tú atención.
>>
>> José Ramón Castro.
>>
>> xAvi escribió:
>>> Sólo a modo de ejemplo, para clarificar y, por cambiar de estilo.
>>>
>>> METHOD F_PUESTAExit( oSender, oNextCtl ) CLASS TFormIndiv
>>> Local lRes
>>>
>>> if( oNextCtl != nil .and. !(oNextCtl == ::oCancelar) )
>>> WITH OBJECT oSender
>>> if( :dValue < ::oF_ENCESTE:dValue )
>>> MsgAlert( e" !! La fecha de puesta en marcha del relojn
>>> no puede ser menor que la fecha de enceste. !!", AppData:gCaption )
>>> lRes := FALSE
>>> elseif( :dValue >= ::oF_SUELTA:dValue )
>>> MsgAlert( e" !! La fecha de puesta en marcha del relojn
>>> no puede ser mayor o igual que la fecha den suelta. !!",
>>> AppData:gCaption )
>>> lRes := FALSE
>>> endif
>>> END
>>> endif
>>> return lRes
>>>
>>> Un cordial saludo
>>> Xavi
>>>
>>> Jose F. Gimenez escribió:
>>>> José Ramón,
>>>>
>>>>> La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
>>>>
>>>> Es una limitación de xHarbour: no se pueden comparar con el
>>>> operador != (distinto) dos objetos. El único operador que se puede
>>>> usar es el de igualdad exacta (==). Por lo tanto, esa lí­nea tienes
>>>> que cambiarla a:
>>>>
>>>> IF !( oNextCtl == ::oCancelar )
>>>>
Xavi[1]
Mensajes: 55
Registrado: Mar Jul 18, 2006 2:02 pm

Boton Cancelar en OnExit

Mensaje por Xavi[1] »

Menos mal que la GUI de Xailer solventa "una limitación de xHarbour" ;-)
#include "Xailer.ch"
Procedure Main()
Local oObj1, oObj2
Application:cTitle := "Blank"
TForm1():New( Application ):Show()
oObj1 := Application:oMainForm; oObj2 := Application:aForms[1]
MsgInfo( oObj1 == oObj2 ); MsgInfo( oObj1 != oObj2 )
Application:Run()
Return
CLASS TComponent FROM XComponent
// OPERATOR "==" ARG oObj INLINE (Self == oObj)
OPERATOR "!=" ARG oObj INLINE !(Self == oObj)
ENDCLASS
Claro que si quito el remarque es otra historia.
Me quedarí­a más tranquilo de poder generar xHarbour.exe de las fuentes PUBLICAS.
¿Cómo configurar las herramientas bison y borland c para compilar xharbour desde el cvs?
Un saludo
Xavi
Jose F. Gimenez escribió:
> José Ramón,
>
>> La linea 998 corresponde exactamente a IF oNextCtl != ::oCancelar
>
> Es una limitación de xHarbour: no se pueden comparar con el operador !=
> (distinto) dos objetos. El único operador que se puede usar es el de
> igualdad exacta (==). Por lo tanto, esa lí­nea tienes que cambiarla a:
>
> IF !( oNextCtl == ::oCancelar )
>
Responder