3

我下载了一个 DBDateTimePicker,我用它来编辑表格中的日期、开始日期和完成日期。在普通编辑框中附加到表格时,我在附加和发布之前使用以下代码,以防止在开始日期之前设置完成日期。

if  (DTPAddStartDate.Date) > (DTPAddCompletionDate.Date) then
begin

      raise Exception.Create ('The Completion date of a Job can not be before a Start Date');
      abort;
end;

问题是我希望能够在通过 DBDateTimePickers 编辑日期时实现相同的目的,如果我在 BeforePost 事件或其他东西上有类似的代码,那么我会收到过早的错误消息,因为用户可能没有机会编辑其他相关的 DBDateTimePicker。我不知道如何将这两个字段联系起来,以便我可以以某种方式验证它们或提出另一个解决问题的方法,有什么建议吗?(我使用一个连接到访问的 adotable,该组件是从以下链接下载的,http: //apollosoft.net/jms/ )。

4

2 回答 2

4

我猜您正在使用TDBDateTimePickerfromthis 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;
于 2012-04-16T04:52:35.143 回答
0

Caviate:这里在黑暗中拍摄,因为组件不熟悉。如果表单中有组件,那么对象就是表单的成员变量。假设它们是在初始化表单时创建的(您正在使用它们),当它们失去焦点时简单地检查一个事件。

//Pseudo Code--I'm sure it is using a standard event model
myForm.DTPAddCompletionDate.OnChange(...)
begin
  //do your check if it is successful something like... 
  if not (DTPAddStartDate.Date > DTPAddCompletionDate.Date) then
    return;
  else
    someSubmitButton.enabled = true;
end;

我面前没有 Delphi,而且已经有好几年了,所以代码可能不会完美匹配。但是,这个想法应该可行。只需检查参考。

于 2012-04-16T04:05:00.970 回答