PDA

Ver la Versión Completa : Validando datos con el evento OnExit en un TEdit de Firemonkey


newtron
24-11-2018, 12:01:54
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:



ShowMessage('Proyecto no existe');
Edit1.SetFocus;


http://thumbs.subefotos.com/92d9452b0ff4b5a3a1e67d50e55955e6o.jpg (http://subefotos.com/ver/?92d9452b0ff4b5a3a1e67d50e55955e6o.png)
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 (http://codeverge.com/embarcadero.delphi.firemonkey/problem-tedit.setfocus/1046916), 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" (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FMX.Edit.TEdit.OnValidate) y "OnValidating" (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FMX.Edit.TCustomEdit.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

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 (http://c2design5sh.blogspot.com/2016/05/rad-studio-dx-101-berlin-dialog-api.html)

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":


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



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,

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
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