Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   Validando datos con el evento OnExit en un TEdit de Firemonkey (https://www.clubdelphi.com/foros/showthread.php?t=93592)

newtron 24-11-2018 12:01:54

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

dec 24-11-2018 12:30:05

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.

newtron 24-11-2018 18:34:29

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

manelb 24-11-2018 21:48:51

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

newtron 25-11-2018 09:29:33

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.

dec 25-11-2018 13:15:00

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;

manelb 25-11-2018 13:38:10

Cita:

Empezado por newtron (Mensaje 529705)
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.

newtron 26-11-2018 09:58:12

Cita:

Empezado por dec (Mensaje 529706)
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 (Mensaje 529707)
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

dec 26-11-2018 10:31:30

Hola a todos,

Cita:

Empezado por newtron (Mensaje 529721)
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... :confused:

newtron 26-11-2018 12:47:17

Cita:

Empezado por dec (Mensaje 529722)
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... :confused:


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. :o:o


Gracias y un saludo


La franja horaria es GMT +2. Ahora son las 21:56:01.

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