【问题标题】:Set date on TDateTimePicker On drop down在 TDateTimePicker On 下拉菜单上设置日期
【发布时间】:2014-08-18 23:12:20
【问题描述】:

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

DateTimePicker.Date := 日期

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

我是否需要使用 in this post 之类的东西来操作日历?还是我错过了一个简单的属性?

谢谢 马特

【问题讨论】:

  • 为什么用户必须选择当前日期?为什么不从一开始就将其设置为当前日期?然后,用户只有在不喜欢默认设置时才需要与之交互。此外,如果用户改变主意或犯错误,您的计划会不会很烦人?如果他们第一次选择了错误的日期,那么他们第二次点击按钮时,他们的选择将被重置为当前日期,而不是像正常的日期时间选择器一样保持当前值。

标签: delphi date calendar datetimepicker


【解决方案1】:

您可以直接通过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)。

【讨论】:

    【解决方案2】:

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

    一个简单的“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;
    

    【讨论】:

    • 完美运行。已经使用了这种方法,因为它更简单。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多