Delphi 10.4中如何在TDatePicker.OnCloseUp事件判断用户是否点击取消
解决Delphi TDatePicker OnCloseUp事件区分确认/取消的问题
核心思路
利用TDatePicker的OnCancel事件标记取消状态,在OnCloseUp中根据标记判断是否执行写入操作。因为OnCancel仅在用户点击叉号取消时触发,确认操作不会触发该事件,能准确区分两种场景。
实现步骤
- 在窗体类中添加私有变量,用于记录取消状态和初始日期(可选):
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;
- 初始化日期和状态变量:
procedure TForm1.FormCreate(Sender: TObject); begin FInitialDate := Date; DatePicker1.Date := FInitialDate; FIsDatePickerCanceled := False; end;
- 绑定
OnCancel事件,标记取消状态:
procedure TForm1.DatePicker1Cancel(Sender: TObject); begin FIsDatePickerCanceled := True; end;
- 修改
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;
- 打开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
相关产品推荐
相关产品推荐

