PDA

Ver la Versión Completa : Ejecutar cierto codigo una vez seleccionada la fecha en DateTimePicker


Lizette
27-02-2009, 07:29:43
Hola, lo que pretendo hacer, es que una vez que seleccione la fecha y que ésta se visualice en el DateTimePicker, me revise una tabla de la base de datos para verificar si coincide algun registro con la fecha elegida, si coincide me despliega los datos en un dbgrid, de lo contrario me dice k no existen registros con esa fecha.

Pero no sé si exista algun evento del DateTimePicker que se active cuando selecciono la fecha.. :confused:

Gracias y saludos

pjmedina
27-02-2009, 09:30:02
Utiliza el evento "on change"

Neftali [Germán.Estévez]
27-02-2009, 09:32:34
¿Has probado con son simples?
Es decir OnClick/OnChange.

No lo tengo delente, pero lo lógico es que cuando seleccionas una fecha, salte el segundo. El primero tal vez no si lo haces con teclado, pero es cuestión de probar.

Caro
27-02-2009, 16:31:25
Hola, Neftali lo unico malo con el OnClick es que, no se da cuando se hace click sobre el calendarío, por lo que sería mejor usar el OnChange, pero en este caso ocurren dos veces el OnChange al cambiarse la fecha desde el calendarío, supongo cuando presionas en el calendarío y cuando se cambia la fecha en el edit del dateTimePicker y algo parecido sería cuando se cambia directamente la fecha, por lo que tendría que controlar de hacer la busqueda solo una vez.

Saluditos

Lizette
27-02-2009, 18:38:56
Exactamente Caro, utilice el OnChange, pero me repite 2 veces la búsqueda, por lo tanto me salen 2 veces el mismo mensaje de k no lo encontro.. Otro problema que detecte, esk si me desplazo a otro mes, como que se cicla, y me aparece el monton de mensajes de k no se encontro el registro, pk incrementa solo el mes, el año, no sé pk pase eso.. :eek:

ContraVeneno
27-02-2009, 19:15:23
lo que pasa es que cuando te mueves de mes o de año, se ejecuta el evento onchange y hace todo lo que tengas ahí. Por eso no es recomendable hacer validaciones en este evento. Es muy recomendable para verificar cosas, pero no para validar.

Es decir, el evento onchange es muy bueno para verificar valores de otro datetimepicker, por ejemplo, cuando tienes que seleccionar fecha inicial y fecha final, en el onchange puedes cambiar el mindate de la fecha final para que no sea menor a la fecha inicial. Ahí si es recomendable el evento onchange.

Pero para validar, como supongo lo estas haciendo tu, es mejor utilizar otro evento. Tal vez en el botón "procesar" o "buscar", o al finalizar el proceso de captura.

aunque también simplemente podrías no mostrar el mensaje de "no se encuentra". A final de cuentas el usuario va a ver la tabla vacía, no es necesario el mensaje. Digo, si ya ve la tabla vacía, asume que no hay nada.

rgstuamigo
27-02-2009, 20:42:06
Quisas seria mejor utilizar el evento OnCloseUp ya que el componente
TDateTimePicker no cuenta con un evento OnSelect como un TComboBox.
Segun veo seria el mas adecuado para tu caso.;).
Saludos.:)

roman
27-02-2009, 21:27:13
Lo malo con el CloseUp es que el usuario puede cambiar la fecha en el control sin abrir el calendario. Por otra parte, como ya han observado, el evento OnChange se produce dos veces cuando se selecciona la fecha en el calendario, pero, además, el usuario puede desplazarse de fecha con las teclas de flecha estando abierto el calendario, y cada cambio generaría la consulta a la base, aun cuando el usuario cancele y la fecha finalmente no cambie.

Creo que lo ideal sería utilizar otro control mejor hecho. Probé con el DateEdit de la biblioteca RX y funciona mejor pero éste genera dos OnChange si el cambio de fecha se hace desde el edit en lugar del calendario. Quizá en la biblioteca Jedi lo hayan corregido.

Por lo pronto, parece que no queda de otra que controlar uno mismo el cambio de fecha llevando registro de la última fecha seleccionada y generando la consulta sólo si realmente ha cambiado. Pero también hay que controlar el cambio que menciono con las teclas de flecha, pues lo detectaríamos como cambio antes de saber si el usuario realmente selecciona esa fecha.

Este evento OnChange, de plano hace caso omiso de cualquier cambio realizado mientras el calendario está abierto:


procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
if not DateTimePicker1.DroppedDown then
begin
{
Aquí la consulta a la base
}

LastDate := DateTimePicker1.DateTime;
end;
end;


Sólo funciona si el calendario está cerrado. Para cuando esté abierto entonces usamos el evento OnCloseUp:


procedure TForm1.DateTimePicker1CloseUp(Sender: TObject);
begin
if DateTimePicker1.DateTime <> LastDate then
begin
{
Aquí la consulta a la base
}

LastDate := DateTimePicker1.DateTime;
end;
end;


LastDate sería una variable de tipo TDate declarada en el formulario.

// Saludos

Lizette
27-02-2009, 21:58:14
Gracias Roman ;)