Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2018
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.591
Poder: 21
newtron Va camino a la fama
Validando datos con el evento OnExit en un TEdit de Firemonkey

Hola.

Necesito hacer un pequeño programa con firemonkey para una consulta a una base de datos. Estoy haciendo unas pruebas introduciendo un valor en un Edit, en el evento "exit" hago la búsqueda en la base de datos y si no existe doy un mensaje y vuelvo a poner el foco en el Edit. El problema es que el foco se va al siguiente Edit y curiosamente no permite luego "picar" en él con el ratón pero si coge el foco si pulso "Shift+Tab". Imagino que esto en firemonkey tendrá un tratamiento distinto pero no doy con él. ¿Alguna idea?


Código de prueba que pongo en el "exit" del primer Edit:


Código Delphi [-]
  ShowMessage('Proyecto no existe');
  Edit1.SetFocus;


Gracias y un saludo
__________________
Be water my friend.
Responder Con Cita
  #2  
Antiguo 24-11-2018
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Confirmo, que, en Firemonkey, ocurre lo que describes, mientras que, con la VCL, todo funciona como esperas. Según esta información, puede tratarse de un "bug" en Firemonkey, o, tal vez, simplemente, no sea posible hacer algo así con Firemonkey. Yo investigaría sobre los eventos de los "TEdit" (precisamente, nuevos en Firemonkey) "OnValidate" y "OnValidating", aunque, he probado a hacer lo mismo (dar el foco, básicamente, al control que nos interesa) con estos eventos, y, tampoco parece funcionar.

La posible solución, como también comentan en el artículo que enlazo en el primer párrafo, pasa por usar un "botón" que se encargue de la validación de los datos. Partiendo del evento "Click" de dicho botón, ya sí, podrás dar el foco al "TEdit" que precises, sin problemas. Se menciona además en el artículo algo con lo que estoy de acuerdo: tal vez sea una buena idea usar este botón, y, no hacerlo como tú lo planteas. En todo caso, sí que podrían aprovecharse los eventos mencionados, para proporcionar "feedback" al usuario, a la vez que proporciona los datos de entrada, esto es, antes incluso del "Click" en el botón.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 24-11-2018
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.591
Poder: 21
newtron Va camino a la fama
Pues no sé qué decirte, antes de colgar este hilo probé a poner la validación del dato pulsando un botón, pero claro, necesito llamarlo desde el "exit" del componente y al final hace exactamente lo mismo. El tema es que pienso introducir el dato desde un lector de código de barras que, al recibir la tecla "Enter" después de leer el número, valide el dato de forma automática.


Esto es tan básico que tiene que tener algún tipo de solución.


Gracias y un saludo
__________________
Be water my friend.
Responder Con Cita
  #4  
Antiguo 24-11-2018
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 297
Poder: 8
manelb Va por buen camino
Saludos a todos...

Prueba esto
Código Delphi [-]
procedure TForm1.Edit2Exit(Sender: TObject);
var
  ASyncService : IFMXDialogServiceASync;
begin
  if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceAsync, IInterface(ASyncService)) then
  begin
    ASyncService.MessageDialogAsync( 'Proyecto no existe', TMsgDlgType.mtConfirmation,
                                                   [TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, 0,
     procedure(const AResult: TModalResult)
     begin
       case AResult of
         mrOk : edit2.SetFocus;
       end;
     end);
  end;

end;

Me había encontrado con un problema similar en una aplicación android con el showmessage y lo resolví de esta forma
Te dejo un enlace

Saludos

Última edición por manelb fecha: 24-11-2018 a las 22:52:45.
Responder Con Cita
  #5  
Antiguo 25-11-2018
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.591
Poder: 21
newtron Va camino a la fama
Manelb.


Gracias por tu respuesta. Efectivamente este código me viene bien y fíjate que esa página que me indicas la había visto y había hecho algunas pruebas con esta instrucción pero, no sé por qué, sin resultado.


Veo que cuando sale el cartel del aviso, por debajo el programa sigue su ejecución. Imagino que no se podrá parar la ejecución hasta que no aceptes en el mensaje. ¿Es así?


Gracias de nuevo y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #6  
Antiguo 25-11-2018
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Además de lo que te ha comentado el compañero, ¿has probado a hacer lo que necesitas (si no me equivoco, dar el foco al control si su contenido no es el esperado) en el evento "OnKeyUp"? No sé si en tu caso particular te serviría, pero, lo siguiente, sí que parece funcionar como se espera, es decir, en caso de error, el foco acaba en el "Edit1":

Código Delphi [-]
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  if Key = vkReturn then
  begin
    if Edit1.Text <> 'expected' then
    begin
      ShowMessage('Unexpected input!');
      Edit1.SetFocus();
    end;
  end;
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 25-11-2018
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 297
Poder: 8
manelb Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
Manelb.

Veo que cuando sale el cartel del aviso, por debajo el programa sigue su ejecución. Imagino que no se podrá parar la ejecución hasta que no aceptes en el mensaje. ¿Es así?
Precisamente, lo que a mi me había pasado en Android era eso. El showmodal no detenía la ejecución del programa y se ejecutaban las sentencias posteriores al showmodal antes de aceptar el mensaje.
Responder Con Cita
  #8  
Antiguo 26-11-2018
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.591
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por dec Ver Mensaje
Además de lo que te ha comentado el compañero, ¿has probado a hacer lo que necesitas (si no me equivoco, dar el foco al control si su contenido no es el esperado) en el evento "OnKeyUp"? No sé si en tu caso particular te serviría, pero, lo siguiente, sí que parece funcionar como se espera, es decir, en caso de error, el foco acaba en el "Edit1":


Negativo. Paso el foco al "Edit1" pero "selasopla" y se va al siguiente.



Cita:
Empezado por manelb Ver Mensaje
Precisamente, lo que a mi me había pasado en Android era eso. El showmodal no detenía la ejecución del programa y se ejecutaban las sentencias posteriores al showmodal antes de aceptar el mensaje.

Bueno... es un mal menor, ya le buscaremos solución.


Gracias a los dos
__________________
Be water my friend.
Responder Con Cita
  #9  
Antiguo 26-11-2018
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Cita:
Empezado por newtron Ver Mensaje
Negativo. Paso el foco al "Edit1" pero "selasopla" y se va al siguiente.
En Windows sí que funciona... lo que pasa es que ahí estamos pulsando la tecla ENTER de veras... o sea, no sé si funcionará en dispositivos móviles, pero, en Windows funciona...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #10  
Antiguo 26-11-2018
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.591
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por dec Ver Mensaje
Hola a todos,



En Windows sí que funciona... lo que pasa es que ahí estamos pulsando la tecla ENTER de veras... o sea, no sé si funcionará en dispositivos móviles, pero, en Windows funciona...

Andalaleche.... pues llevas razón. He vuelto a probar y si que funciona. En la prueba que había hecho no me salía del evento y al continuar, después de coger el foco el "edit" hacía un retorno de carro y se iba otra vez al siguiente.


Gracias y un saludo
__________________
Be water my friend.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Declarar evento OnExit en StringGrid newtron OOP 8 11-05-2012 18:01:16
Evento onExit() rodno C++ Builder 2 20-12-2010 22:44:20
Evento 'OnExit' del Form Wellnic OOP 3 10-04-2007 20:08:51
Problemas con evento OnExit santi33a Varios 4 15-04-2006 14:30:50
Evento OnExit de un Edit Caro OOP 1 03-02-2006 18:57:01


La franja horaria es GMT +2. Ahora son las 01:31:02.


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