Delphi 在下拉列表中设置TDateTimePicker上的日期

Delphi 在下拉列表中设置TDateTimePicker上的日期,delphi,date,calendar,datetimepicker,Delphi,Date,Calendar,Datetimepicker,我在Delphi6表单上有一个DateTimePicker,默认日期为1899年12月30日。我希望用户能够点击它或打开下拉日历,它选择当前日期。将OnClick过程用于: DateTimePicker.Date:=日期 将可编辑部分中的日期设置为用户单击该部分或“日历”下拉按钮时的日期,但不会强制日历自动选择今天的日期。如果在DateTimePicker的OnDropDown过程中使用此代码,结果是相同的 我是否需要使用类似的工具来操纵日历?还是我错过了一个简单的属性 谢谢 Matt我找不到可

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

DateTimePicker.Date:=日期

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

我是否需要使用类似的工具来操纵日历?还是我错过了一个简单的属性

谢谢
Matt

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

一个简单的“黑客”解决方案可以如下所示

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;
过程TFormMain.FormCreate(发送方:TObject);
var DefaultDate:TDate;
开始
//设置默认日期
DefaultDate:=编码日期(1899,12,30);
DateTimePicker1.MinDate:=默认日期//使用MinDate存储默认日期
DateTimePicker1.Date:=默认日期;
终止
过程TFormMain.DateTimePicker1下拉列表(发送方:ToObject);
开始
//仅当组件设置为默认日期时才继续
如果CompareDate(DateTimePicker1.MinDate,DateTimePicker1.Date)为0,则退出;
//Hack:更改DateTimePicker的种类类型以中断当前下拉事件
DateTimePicker1.Kind:=dtkTime;
DateTimePicker1.Kind:=dtkDate;
//换到今天
DateTimePicker1.DateTime:=现在;
//再次向下拉日历发送消息
SendMessage(DateTimePicker1.Handle,WM_SYSKEYDOWN,VK_DOWN,0);
终止

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

一个简单的“黑客”解决方案可以如下所示

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;
过程TFormMain.FormCreate(发送方:TObject);
var DefaultDate:TDate;
开始
//设置默认日期
DefaultDate:=编码日期(1899,12,30);
DateTimePicker1.MinDate:=默认日期//使用MinDate存储默认日期
DateTimePicker1.Date:=默认日期;
终止
过程TFormMain.DateTimePicker1下拉列表(发送方:ToObject);
开始
//仅当组件设置为默认日期时才继续
如果CompareDate(DateTimePicker1.MinDate,DateTimePicker1.Date)为0,则退出;
//Hack:更改DateTimePicker的种类类型以中断当前下拉事件
DateTimePicker1.Kind:=dtkTime;
DateTimePicker1.Kind:=dtkDate;
//换到今天
DateTimePicker1.DateTime:=现在;
//再次向下拉日历发送消息
SendMessage(DateTimePicker1.Handle,WM_SYSKEYDOWN,VK_DOWN,0);
终止

您可以通过直接更新月历窗口。
类似这样(我将“默认”逻辑留给您):


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

您可以通过直接更新月历窗口。
类似这样(我将“默认”逻辑留给您):


就我个人而言,我会将默认日期设置为默认日期(
date
)。

工作得很好。我用过这个方法,因为它简单得多。谢谢,做得很好。我用过这个方法,因为它简单得多。谢谢。为什么用户必须选择当前日期?为什么不从一开始就将其设置为当前日期?然后,如果用户不喜欢默认设置,他们只需要与它交互。此外,如果用户改变主意或犯错误,你的计划会不会很烦人?如果他们第一次选择了错误的日期,第二次单击按钮时,他们的选择将重置为当前日期,而不是像普通的日期-时间选择器一样保持当前值。为什么用户必须选择当前日期?为什么不从一开始就将其设置为当前日期?然后,如果用户不喜欢默认设置,他们只需要与它交互。此外,如果用户改变主意或犯错误,你的计划会不会很烦人?如果他们第一次选择了错误的日期,第二次单击按钮时,他们的选择将重置为当前日期,而不是像正常的日期-时间选择器一样保持当前值。