編集可能な DBGrid を実装しました。フィールドが正しく入力されていない場合、例外がスローされ、次のようなメッセージが表示されます。
'08:00::00' is not a valid time
これらの例外をキャッチして、自動生成されたメッセージの代わりに自分が作成したメッセージを表示するにはどうすればよいですか? どんな助けにも感謝します。
@teran が彼のコメントで指摘したように、例外は、にTDataSet
バインドされている (またはそのコンポーネントの 1 つ) TDBGrid
、または DB エンジン自体によって発生します。
次の処理を試すことができます(およびTDataSet.OnPostError
も参照)。OnUpdateError
OnEditError
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
StrToDateTime
TDateTimeField.SetAsString
データに触れずに内部で例外をスローしているため、TDataSet.OnxxxError
イベント ハンドラはまったく起動されません。
したがって、あなたの選択は次のとおりです(リリースモードでアプリケーションをテストします):
EConvertError
1. を介してインターセプトおよび処理しApplication.OnException
ます。
2.TField.EditMask
ユーザー入力を有効な時間形式に制限するために使用します。たとえば、Grid 内で DateTimePicker エディターを!90:00;1;_
使用します。(そして、この例外をキャッチしないようにします)。
3.Override : 永続フィールドを使用して、次のようにインターポーザー クラスを作成 します。TDateTimeField
TDataSet
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;
例外が発生している場合は、デバッガーで実行すると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は、最新のシステムではるかによくサポートされています。