PDA

Ver la Versión Completa : Solo una llamada a Onchange de tedit. ¿Se puede?


jotaeme
05-03-2009, 13:07:00
Hola,

Mi problema es el siguiente:

Tengo un Tedit y un TUpDown para insertar números. Cada vez que se modifica el valor del Tedit(ya sea por teclado o por el TUpDown) tengo que hacer una consulta a Base de Datos.

Estoy usando el evento OnChange del Tedit, pero el problema es por ejemplo, si tengo el valor 2 en el Tedit y el usuario pulsa 8 veces continuas en TUpDown para cambiarlo a 10, quiero que solo se haga la consulta del último valor, no las otras 7 consultas. ¿Sabeis si esto se puede hacer?, lo mismo me ocurre si el usuario escribe 143 en el tedit, no quiero que se hagan las consultas con los valores 1 y 14, solo cuando haya terminado de escribir todo.

Gracias

juanlaplata
05-03-2009, 14:30:22
y, segun lo dicho, el OnChange se produce cuando algo cambia dentro del TEdit, aun si lo estas borrando, por lo cual no conseguiras que no se ejecute la consulta la cantidad de veces que se produce eñ OnChange. Se me ocurre que tendrias que poner la opcion (boton, o lo que sea) que diga, "hay un valor definitivo" para el TEdit.
Tambien habria que ver que tan costosa es esa consulta, ya que tal ves no le va a tu diseño/manejo otra opcion (boton, etc).

PD: mirando un poco, ya dentro de delphi, esta el Evento OnExit, que es cuando el control pierde el foco, talves ahi es el momento de ejecutar la consulta.

PD 1 : Echa un vistazo a la pestaña "Samples" ahi esta el "SpinEdit" es un TEdit con UpDown Incorporado, todo un solo componente. Y este serviria mejor para el OnExit, yq que en tu caso se produciria OnExit al pasar del TEdit al UpDown y aun no te has hido por completo de la operacion.

Espero haber ayudado, estaremos por aqui para lo que podamos.

duilioisola
05-03-2009, 14:33:09
Puedes usar un TTimer para que haga la consulta, por ejemplo, 1/4 de segundo después de la última tecla.


procedure TForm1.OnCreate();
begin
// Inicializo Timer
TimerConsultaSQL.Enabled := False;
TimerConsultaSQL.Interval := 250;
end;

procedure TForm1.TEditOnChange();
begin
// Reseteamos el Timer
TimerConsultaSQL.Enabled := False;
TimerConsultaSQL.Enabled := True;
end;

procedure TForm1.TimerConsultaSQLOnTimer();
begin
// Paramos el Timer
TimerConsultaSQL.Enabled := False;
// Hacemos consulta
//...
//...
//...
end;

kalimero
05-03-2009, 14:35:25
Hola.Pureba con esto
try
miedit.onchange := ni;
HAGO LO QUE SEA
finally
miedit.onchange := miEditOnchange;
end;

saludos

jotaeme
06-03-2009, 11:43:04
Gracias,

Ya lo he solucionado. He usado el SpinEdit y un sleep dentro del Onchange.

El sleep no lo podia usar antes puesto que me daba problemas y se quedaba el foco en el TUpDown, pero con el SpinEdit no ocurre.

Un saludo