You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 10.4中如何在TDatePicker.OnCloseUp事件判断用户是否点击取消

解决Delphi TDatePicker OnCloseUp事件区分确认/取消的问题

核心思路

利用TDatePicker的OnCancel事件标记取消状态,在OnCloseUp中根据标记判断是否执行写入操作。因为OnCancel仅在用户点击叉号取消时触发,确认操作不会触发该事件,能准确区分两种场景。

实现步骤

  1. 在窗体类中添加私有变量,用于记录取消状态和初始日期(可选):
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    DatePicker1: TDatePicker;
    procedure FormCreate(Sender: TObject);
    procedure DatePicker1CloseUp(Sender: TObject);
    procedure DatePicker1Cancel(Sender: TObject);
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
    FIsDatePickerCanceled: Boolean;
    FInitialDate: TDate; // 记录打开时的初始日期,按需使用
    col, row: Integer; // 记录当前操作的单元格位置
  public
    { Public declarations }
  end;
  1. 初始化日期和状态变量:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FInitialDate := Date;
  DatePicker1.Date := FInitialDate;
  FIsDatePickerCanceled := False;
end;
  1. 绑定OnCancel事件,标记取消状态:
procedure TForm1.DatePicker1Cancel(Sender: TObject);
begin
  FIsDatePickerCanceled := True;
end;
  1. 修改OnCloseUp事件,根据取消状态决定是否写入单元格:
procedure TForm1.DatePicker1CloseUp(Sender: TObject);
begin
  if FIsDatePickerCanceled then
  begin
    FIsDatePickerCanceled := False; // 重置标志,避免影响下次操作
    Exit;
  end;

  // 可选:如果需要排除用户选择和初始日期相同的情况,添加以下判断
  // if DatePicker1.Date = FInitialDate then Exit;

  StringGrid1.Cells[col, row] := FormatDateTime(dateformat, DatePicker1.Date);
end;
  1. 打开DatePicker时重置状态(以点击表头为例):
procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  TargetCol, TargetRow: Integer;
begin
  if Button = mbLeft then
  begin
    StringGrid1.MouseToCell(X, Y, TargetCol, TargetRow);
    // 假设FixedRow为0,点击表头行时打开DatePicker
    if TargetRow = 0 then
    begin
      FIsDatePickerCanceled := False;
      // 若单元格已有日期,将初始日期设为单元格值,否则用今日
      if TryStrToDate(StringGrid1.Cells[TargetCol, TargetRow], FInitialDate) then
        DatePicker1.Date := FInitialDate
      else
        DatePicker1.Date := Date;
      // 定位DatePicker到表头单元格位置
      DatePicker1.Left := StringGrid1.ClientToScreen(Point(StringGrid1.ColWidths[0..TargetCol-1].Sum, 0)).X;
      DatePicker1.Top := StringGrid1.ClientToScreen(Point(0, 0)).Y;
      DatePicker1.Visible := True;
      // 记录当前操作的列和行
      col := TargetCol;
      row := TargetRow;
    end;
  end;
end;

补充说明

你提到的“取消后返回预设日期”是TDatePicker的默认行为,通过上述OnCancel标记的方法,无需依赖日期对比即可准确判断取消操作,避免了用户选择与初始日期相同的日期时误判为取消的情况。

内容的提问来源于stack exchange,提问作者Syndi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:21:23