Ver Mensaje Individual
  #8  
Antiguo 27-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
    {
      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:

Código Delphi [-]
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
Responder Con Cita