我想为一个按钮定制一个日期对话框,即用户点击按钮就弹出一个日期对话框,该如何实现呢?
首先,引用单元FMX.Pickers, FMX.Platform,然后声明一个日期对话框:
FDateTimePicker: TCustomDateTimePicker;
然后,在Create事件中建立这个对话框:
procedure TQueryCpzsDoc.AfterConstruction; var PickerService: IFMXPickerService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXPickerService, PickerService) then begin FDateTimePicker := PickerService.CreateDateTimePicker; FDateTimePicker.Parent := Self; FDateTimePicker.OnDateChanged := HandlerPickerDateTimeChanged; FDateTimePicker.OnHide:=Self.OnDateHide; end; end;
同时要接管用户输入日期点确定的事件,OnDateChanged:
procedure TQueryCpzsDoc.HandlerPickerDateTimeChanged(Sender: TObject; const ADate: TDateTime); begin DateButton.Text := FormatDateTime('yyyy-mm-dd', ADate); end;
最后,别忘记销毁这个对话框:
procedure TQueryCpzsDoc.BeforeDestruction; begin if Assigned(FDateTimePicker) then begin if FDateTimePicker.IsShown then FDateTimePicker.Hide; FreeAndNil(FDateTimePicker); end; inherited; end;
现在,点击DateButton时,显示这个对话框:
procedure TQueryCpzsDoc.DateButtonClick(Sender: TObject); var d: TDateTime; begin if TryStrToDate(DateButton.Text, d) then FDateTimePicker.Date := d else FDateTimePicker.Date := Date; FDateTimePicker.Show; end;
万事大吉,为一个按钮,定制了一个日期对话框。
遇到的问题:
在我的实际项目中,发现这个对话框会自动隐藏,经查,发现是TTabControl,用Timer定时显示一个TabItem时,将我的对话框给关了。查到原因就好解决了,当显示这个对话框时,Timer.Enabled:=False,解决!