在TDateTimePicker上设置日期下拉

时间:2014-08-18 07:55:47

标签: delphi date calendar datetimepicker

我在Delphi 6表单上有一个DateTimePicker,默认日期为30/12/1899。我希望用户能够点击它或打开下拉日历并选择当前日期。使用OnClick过程:

  

DateTimePicker.Date:=日期

将可编辑部分中的日期设置为用户点击日期或日历下拉按钮时的日期,但不会强制日历自动选择今天的日期。如果我在DateTimePicker的OnDropDown过程中使用此代码,结果是一样的。

我是否需要使用类似in this post的内容来操作日历?还是有一个我错过的简单财产?

由于 马特

2 个答案:

答案 0 :(得分:5)

您可以通过MonthCal_SetCurSel直接更新月份日历窗口 这样的事情(我将“默认”逻辑留给你):

uses Commctrl;

type TDateTimePickerAccess = class(TDateTimePicker);

procedure TForm1.DateTimePicker1DropDown(Sender: TObject);
var
  ST: TSystemTime;
  CalendarHandle: HWND;
begin
  DateTimePicker1.Date := Date;
  DateTimeToSystemTime(Date, ST);
  CalendarHandle := TDateTimePickerAccess(DateTimePicker1).GetCalendarHandle;
  MonthCal_SetCurSel(CalendarHandle, ST);
end;

我个人会将默认日期设置为默认日期(Date)。

答案 1 :(得分:0)

我找不到可以解决您的请求的现有属性。看起来您提供的链接可以解决问题,但我还没有测试过。

简单的“Hacky”解决方案如下:

procedure TFormMain.FormCreate(Sender: TObject);
var  DefaultDate : TDate;
begin
  //Set the default date
  DefaultDate := EncodeDate(1899, 12, 30);
  DateTimePicker1.MinDate := DefaultDate; //Use MinDate to store the default date
  DateTimePicker1.Date := DefaultDate;
end;

procedure TFormMain.DateTimePicker1DropDown(Sender: TObject);
begin
  //Only continue if the component is set to the default date
  if CompareDate(DateTimePicker1.MinDate, DateTimePicker1.Date) <> 0 then exit;

  //Hack: Change the DateTimePicker's Kind Type to disrupt the current drop down event
  DateTimePicker1.Kind := dtkTime;
  DateTimePicker1.Kind := dtkDate;

  //Change to today
  DateTimePicker1.DateTime := now;

  //Send a message to the drop down the calander once again
  SendMessage(DateTimePicker1.Handle,WM_SYSKEYDOWN,VK_DOWN, 0);
end;