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。2 つのフィールドを関連付けて、何らかの方法でそれらを一緒に検証したり、問題に対する別の解決策を考え出す方法がわかりません。何か提案はありますか? (アクセスに接続されたadotableを使用しており、コンポーネントは次のリンクからダウンロードされましたhttp://apollosoft.net/jms/)。

4

2 に答える 2

4

TDBDateTimePickerfromを使用していると思いますが、this page言いにくいのですが、現時点では質問にありません。

ただし、値が変更されるたびに発生するフィールドのOnValidateイベントを使用できますが、それはデータがデータベースに書き込まれる段階であるため、不要な時間の無駄です。

レコードを更新しようとする前に値を検証できます。(ほぼ ?)
コントロールを終了しようとするすべての DB 対応コントロールの場合はどうなるのでOnCanUpdate、日付のような検証イベントを簡単に追加できます。タイムピッカー。

コンポーネントを入手したソースへのリンクが見つからないため、これを使用していると仮定しますTDBDateTimePicker。ファイルに次の行を追加し、DBDateTimePicker.pasがインストールされているパッケージを再構築OnCanUpdateすると、コンポーネントのオブジェクト インスペクタに新しいイベントが表示されます。このイベントを使用する場合Allowed、重要なパラメーターが 1 つあります。これを 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 に答える