2

編集可能な DBGrid を実装しました。フィールドが正しく入力されていない場合、例外がスローされ、次のようなメッセージが表示されます。

'08:00::00' is not a valid time

これらの例外をキャッチして、自動生成されたメッセージの代わりに自分が作成したメッセージを表示するにはどうすればよいですか? どんな助けにも感謝します。

4

2 に答える 2

4

@teran が彼のコメントで指摘したように、例外は、にTDataSetバインドされている (またはそのコンポーネントの 1 つ) TDBGrid、または DB エンジン自体によって発生します。

次の処理を試すことができます(およびTDataSet.OnPostErrorも参照)。OnUpdateErrorOnEditError

TDataSet.OnPostError:アプリケーションがレコードを変更または挿入しようとして例外が発生した場合に発生します。OnPostError イベント ハンドラーを記述して、レコードの投稿に失敗したときに発生する例外を処理します。

Application.OnExceptionアプリケーションで EDBxxx 例外をキャッチするために、いつでもグローバル イベント ハンドラーを使用できることに注意してください。


編集:EConvertError例外は、実際のデータ変更、またはフィールド による Post 操作の前に発生します。TDateTimeField

0045af91 +085 Project1.exe SysUtils       StrToDateTime <- EConvertError
004ab76a +042 Project1.exe Db             TDateTimeField.SetAsString
004a9827 +007 Project1.exe Db             TField.SetText
004a95d9 +029 Project1.exe Db             TField.SetEditText
004d6448 +014 Project1.exe DBGrids        TCustomDBGrid.UpdateData
004d087f +02b Project1.exe DBGrids        TGridDataLink.UpdateData
004d599a +01a Project1.exe DBGrids        TCustomDBGrid.MoveCol

StrToDateTimeTDateTimeField.SetAsStringデータに触れずに内部で例外をスローしているため、TDataSet.OnxxxErrorイベント ハンドラはまったく起動されません。

したがって、あなたの選択は次のとおりです(リリースモードでアプリケーションをテストします):

EConvertError1. を介してインターセプトおよび処理しApplication.OnExceptionます。
2.TField.EditMaskユーザー入力を有効な時間形式に制限するために使用します。たとえば、Grid 内で DateTimePicker エディターを!90:00;1;_ 使用します。(そして、この例外をキャッチしないようにします)。 3.Override : 永続フィールドを使用して、次のようにインターポーザー クラスを作成 します。
TDateTimeFieldTDataSet

type
  TDateTimeField = class(Db.TDateTimeField)
  protected
    procedure SetAsString(const Value: string); override;
  end;

  TForm1 = class(TForm)
  ...

procedure TDateTimeField.SetAsString(const Value: string);
begin
  try
    inherited SetAsString(Value);
  except
    on E: EConvertError do
    begin
      ShowMessage(E.Message);
      Abort;
    end;
  end;
end;
于 2012-10-11T14:39:31.320 に答える
1

例外が発生している場合は、デバッガーで実行すると2つのエラーメッセージが表示されます。これらの1つはデバッガーによってキャッチされ、2つ目はUIによって処理されます(ユーザーとしてプログラムを実行すると、2つ目のみが表示されます)。

例外エラーメッセージには、次のような文字列が含まれている必要があります

Appname.exeはメッセージXXXで例外EExceptionNameを発生させました

EExceptionNameに注意する必要があります。

例外を作成するコードのブロックの周りに書く必要があります

...
try
   code that can cause the exception here  
except 
  on e: EExceptionName do
  begin
    ShowMessage('Your apps nicer error message here');
  end;
end;

注-終了するための呼び出しを行わない場合。例外を処理した後、コードはtry..exceptブロックの後もすべてを実行し続けます。また、同じコードブロックに同じエラーメッセージを引き起こす可能性のあるものがたくさんある場合は、具体的すぎるものを書くことができない可能性があります。e.Messageは、未処理の例外に表示されるメッセージを保持する文字列であり、ユーザーに提示するのにも役立つ場合があります。

また、BDEから離れてみてください-ADOは、最新のシステムではるかによくサポートされています。

于 2012-10-11T13:37:04.760 に答える