Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-11-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
Como anular el ModalResult de un botón ?

Hola !!

Tengo un formulario con los clásicos botones 'Aceptar' y 'Cancelar'. En el botón Aceptar tengo seteado el ModalResult como 'mrOK'
Estoy realizando unas validaciones en este botón y de estar todo ok recién quiero que continúe, de lo contrario quiero que retorne donde estaba antes, pero lo que hace es continuar su salida del formulario.
Estoy necesitando que sea mrOk por un tratamiento especial que utilizo en onCloseQuery.

Ejemplo de mi código en el botón Aceptar con modalResult en mrOk
-------------------------------
if valida() = false then
Exit; // quiero que no vaya al onCloseQuery ... pero no me hace caso

... sigue mi código y se va al onCloseQuery
-------------------------------


¿Cómo hago para que me retorne al form sin que sigue su acción normal de irse al onCloseQuery?

Gracias por la ayuda que puedan brindarme.
__________________
Carlos Marí
Responder Con Cita
  #2  
Antiguo 13-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Lo que hago normalmente en estos casos (no es la única solución), es poner en la propiedad ModalResult del botón mrNone, y cuando la validación es correcta, desde el mismo código asigno el ModalResult mrOk.
Código:
if valida then
  ModalResult := mrOk;
Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 13-11-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
probé lo que tu me dices funcionó, solo que tiene un problema ... tengo que apretar dos veces el botón Aceptar para que salga.

Supongo que la primera vez como está en mrNone no asume que tiene que salir y la segunda vez, como le asigné en el código del botón el mrOk, ahora puede salir.

gracias por cualquier sugerencia !!
__________________
Carlos Marí
Responder Con Cita
  #4  
Antiguo 13-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Me parece que el problema esta en tu función "Valida", si cuando termina de ejecutarse el evento, el ModalResult del form <> mrNone, se cierra el form.
Te recomendaría que lo sigas paso a paso a ver si verdaderamente pasa siempre por la línea: ModalResult := mrOk;

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 13-11-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
lo he seguido paso a paso y efectivamente pasa por la asignación que le hice: btAceptar.ModalResult := mrOk ...
es más, eliminé la función y si o si pasa por esta asignación e igualmente tengo que apretar dos veces el botón Aceptar para que finalmente salga
__________________
Carlos Marí
Responder Con Cita
  #6  
Antiguo 13-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¡¡¡Es que has modificado mi código!!!

Yo le asignaba directamente el modal result al Form y tu lo has cambiado asignándoselo al botón. Por eso la primera vez no funciona y si la segunda.

Nota la diferencia:

Mi Código:
Código:
if valida then
  ModalResult := mrOk;
Tu Código:
Código:
if valida then
  btAceptar.ModalResult := mrOk;
Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 13-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lo que no entinedo del problema original es que el evento OnCloseQuery está precisamente para hacer validaciones e impedir que se cierre el formulario en caso de que no se cumplan las condiciones. ¿Por qué no hacerlo así?

// Saludos
Responder Con Cita
  #8  
Antiguo 13-11-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
sorry por el despiste

Funcionó !!!!!!

Gracias por todo.
__________________
Carlos Marí
Responder Con Cita
  #9  
Antiguo 13-11-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
Roman:

Al principio había puesto la validación en el onCloseQuery. El problema lo tenía cuando se producía un error de validación pero igualmente quería abandonar el form (por que me arrepentí y no quiero seguir con la carga), es ahí donde quedaba atrapado por los erros de validación y no podía salir de ninguna manera.

Ej:

if valida() = false then
canClose = false
else
canClose = true;

por esta razón es que quería validar antes de llegar al onCloseQuery

Si hubiera otra manera de solucionar mi problema, me gustaría sus consejos.

Gracias por todo.
__________________
Carlos Marí
Responder Con Cita
  #10  
Antiguo 13-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
carlosmari comentó:
Roman:

Al principio había puesto la validación en el onCloseQuery. El problema lo tenía cuando se producía un error de validación pero igualmente quería abandonar el form (por que me arrepentí y no quiero seguir con la carga), es ahí donde quedaba atrapado por los erros de validación y no podía salir de ninguna manera.
Sigo sin entender.

Por error de validación te refieres a que se produce una excepción en la función valida() o simplemente a que regresa false?

De cualquier forma si la validación falla, es decir, no se cumplen las condiciones para aceptar los cambios entonces basta que te regrese al formulario y el usuario oprima el botón Cancelar en lugar de Aceptar. La estructura de prácticamente cualquier evento OnCloseQuery que hago es:

Código:
if ModalResult = mrOk then
begin
  { Hacer validaciones }
end;
De hecho casi nunca hago uso del parámetro CanClose-- y no digo que esta sea la forma correcta de manejar el evento --, en su lugar, si algo falla en la validación lanzo una excepción ya que normalmente me interesa no sólo impedir que se cierre el formulario sino además situar al usario en el control que contiene algún dato incorrecto:

Código:
if ValorDelControlIncorrecto then
begin
  Control.SetFocus;
  raise Exception.Create('Usted debe acostumbrarse a poner valores correctos');
end;
Cita:
carlosmari comentó:
Ej:

if valida() = false then
canClose = false
else
canClose = true;

[/b]
Por cierto, este código quedaría más claro así:

Código:
canClose := valida();
// Saludos
Responder Con Cita
  #11  
Antiguo 13-11-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
gracias !! me ha resultado muy interesante la manera en que manejas tu las validaciones.
__________________
Carlos Marí
Responder Con Cita
  #12  
Antiguo 14-03-2007
Alexis De la Cr Alexis De la Cr is offline
Miembro
 
Registrado: may 2006
Ubicación: Puebla
Posts: 124
Poder: 19
Alexis De la Cr Va por buen camino
Cita:
Empezado por delphi.com.ar
¡¡¡Es que has modificado mi código!!!

Yo le asignaba directamente el modal result al Form y tu lo has cambiado asignándoselo al botón. Por eso la primera vez no funciona y si la segunda.

Nota la diferencia:

Mi Código:
Código:
if valida then
  ModalResult := mrOk;
Tu Código:
Código:
if valida then
  btAceptar.ModalResult := mrOk;
Saludos!

Estimados Colegas:

Disculpen mi Ignorancia, pero tengo este mismo problema, necesito utilizar el modarlresult en MrOK., pero no entiendo donde en el form debo asignar el modalresult a MrOK, lo intento poner en el evento onkeypress del form, pero no funciona. Disculpen las ignorancia
Responder Con Cita
  #13  
Antiguo 14-03-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
El FormStyle de tu forma debe ser fsNormal...

Otra causa podria ser porque quiza sea que no se este disparando el evento... Como dices que estas usando el OnKeyPress del Form pues debes revisar que el KeyPreview sea True
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 14-03-2007 a las 23:14:10.
Responder Con Cita
  #14  
Antiguo 14-03-2007
Alexis De la Cr Alexis De la Cr is offline
Miembro
 
Registrado: may 2006
Ubicación: Puebla
Posts: 124
Poder: 19
Alexis De la Cr Va por buen camino
Cita:
Empezado por jhonny
El FormStyle de tu forma debe ser fsNormal...

Otra causa podria ser porque quiza sea que no se este disparando el evento... Como dices que estas usando el OnKeyPress del Form pues debes revisar que el KeyPreview sea True
de hecho mi formstyle esta en normal, ya active el keypreview,


el kind del bitbtn esta en BkCustom

no funciona
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:21:14.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi