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:
Código Delphi
[-]
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
if not DateTimePicker1.DroppedDown then
begin
LastDate := DateTimePicker1.DateTime;
end;
end;
Sólo funciona si el calendario está cerrado. Para cuando esté abierto entonces usamos el evento OnCloseUp:
Código Delphi
[-]
procedure TForm1.DateTimePicker1CloseUp(Sender: TObject);
begin
if DateTimePicker1.DateTime <> LastDate then
begin
LastDate := DateTimePicker1.DateTime;
end;
end;
LastDate sería una variable de tipo TDate declarada en el formulario.
// Saludos