我猜您正在使用TDBDateTimePicker
fromthis page
但很难说,此时您的问题中缺少它。
但是,您可以使用在OnValidate
值更改时触发的字段事件,但这是将数据写入数据库的阶段,因此恕我直言,这是不必要的浪费时间。
您可以在它们尝试更新记录之前验证值,
当您尝试退出控件时(几乎?)每个 DB 感知控件的情况是什么,因此您可以很容易地添加一些验证事件,例如OnCanUpdate
您的日期时间选择器。
由于缺少指向您从哪里获得组件的源的链接,我假设您正在使用 this TDBDateTimePicker
。如果您将以下行添加到DBDateTimePicker.pas
文件中并在安装位置重建您的包,则新OnCanUpdate
事件将出现在组件的对象检查器中。如果您使用此事件,它有一个重要参数Allowed
,如果您将其设置为 True,您将允许组件更新记录,如果您将其设置为 False(默认值),则不会更新数据集中的数据。所以这是您可以进行验证并决定是否要更新记录的地方。
type
TDBDateTimePicker = class;
TOnCanUpdate = procedure(Sender: TDBDateTimePicker;
var Allowed: Boolean) of object;
TDBDateTimePicker = class(TDateTimePicker)
private
FOnCanUpdate: TOnCanUpdate;
procedure CMExit(var Message: TCMExit); message CM_EXIT;
published
property OnCanUpdate: TOnCanUpdate read FOnCanUpdate write FOnCanUpdate;
end;
procedure TDBDateTimePicker.CMExit(var Message: TCMExit);
var
Allowed: Boolean;
begin
if Assigned(FOnCanUpdate) then
begin
Allowed := False;
FOnCanUpdate(Self, Allowed);
if not Allowed then
begin
SetFocused(True);
Exit;
end;
end;
try
FDataLink.UpdateRecord;
except
SetFocus;
raise;
end;
SetFocused(False);
inherited;
end;
所以OnCanUpdate
事件中的代码可能看起来像这样(请注意,您可以将此事件用作两个日期时间选择器的通用事件)。
procedure TForm1.DTPAddStartDateCanUpdate(Sender: TDBDateTimePicker;
var Allowed: Boolean);
begin
if (DTPAddStartDate.Date) > (DTPAddCompletionDate.Date) then
begin
// the Allowed parameter is in current code initialized to False
// when it comes into this event, so the following line has no
// sense here
Allowed := False;
// here you can display the error message or raise exception or just
// whatever you want, the record won't be modified in any way
Application.MessageBox('The completion date of a job cannot be before a ' +
'start date. The record won''t be modified ;-)', 'Date Input Error...',
MB_YESNO + MB_ICONSTOP + MB_TOPMOST);
end
else
// only setting the Allowed to True will actually allows the record to be
// updated, so if your validation passes, set the Allowed to True
Allowed := True;
end;