delphi 在TDatePicker.OnCloseUp事件中,如何确定用户是否单击了“取消”?

fwzugrvs  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(127)

我有一个简单的问题
我在 Delphi 10.4中有一个TStringGrid,在那里有一个TDatePicker,我想用它在FixedCol中选择一个日期。当我单击标题单元格时,TDatePicker打开并显示今天的日期。我已经在TForm.OnCreate事件中为TDatePicker预先选择了今天的日期。此外,我有一个TDatePickerOnCloseUp事件,它将所选日期写入单元格。
然而,当我用勾号确认和用X取消时,它都会这样做。
如何查询用户是否已单击“取消”,以便我不输入值?

我的代码或多或少是这样的:

procedure TForm1.DatePicker1CloseUp(Sender: TObject);
begin
  //if DatePicker.Cancel ?? then
  //   exit;
  StringGrid1.Cells[col, row] := FormatDateTime(dateformat, DatePicker1.Date);
end;

我只发现,如果我选择一个日期,然后单击确定,我会得到选择的日期。选择另一个日期,然后单击取消返回预定义的日期。

mo49yndu

mo49yndu1#

在内部,控件(TDatePicker)使用Date属性存储值。在更改组件上的值之前,可以加载并存储此值。最后,可以查看Date属性相对于初始值是否有更改。
如果没有变化,可能是由于:

  • 更改已取消。
  • 已选择相同的日期。

在这两种情况下,都不需要更新TStringGrid
测试如下内容:

...
private
  oldValue:tDate;
...

procedure TForm3.DatePicker1Click(Sender: TObject);
begin
  oldDate := DatePicker1.Date;
end;

procedure TForm3.DateTimePicker1CloseUp(Sender: TObject);
begin
  if DatePicker1.Date <> OldDate then
    StringGrid1.Cells[col, row] := FormatDateTime('dd/mm/yyyy', DatePicker1.Date);
end;
tgabmvqs

tgabmvqs2#

经过尝试,我发现了一个解决方案,至少为鼠标输入:

GetCursorPos(MausPos);
MausPos := DatePicker1.ScreenToClient(MausPos);
if (MausPos.X > DatePicker1.Width / 2)  then
  ShowMessage('Cancel')
else
  ShowMessage('OK');

我取了相对于TDatePicker的Cursor位置。如果X坐标在右半边,按下取消按钮,我可以退出函数,而不将日期写入StringGrid。

相关问题