質問させて頂きます。
入力項目(TFlatEdit)のOnExitで入力チェックを行っています。
入力にエラーがある場合はその項目に留まるようにしています。
(SetFocusしています。)
ボタン(TFlatButton)にショートカットを指定している場合
ショートカットをキーボードで押下するとOnClickイベントが
発生します。
その際入力項目にフォーカスがあってもOnExitのイベントが発生しません。
ボタンのOnClickイベントにボタンにSetFocusすればOnExitイベントが
発生する事はするのですが、OnClickのイベントもそのまま動作し続けます。
入力項目でエラーになった場合はOnClickのイベントを止める方法は無いでしょうか。
決定ボタンか何かのOnClick時にも入力チェックをするか、
入力欄のonEnterでボタンのEnabledをFalseにする
というのではどうでしょうか?
TButtonとTEditなら、
>その際入力項目にフォーカスがあってもOnExitのイベントが発生しません。
>ボタンのOnClickイベントにボタンにSetFocusすればOnExitイベントが
>発生する事はするのですが、OnClickのイベントもそのまま動作し続けます。
ということはありませんでした
TFlatButtonにActiveプロパティはありますか?
クリックしてもアクティブにならなければ、Editからフォーカスは移動しないので、onExit発生しません
回答ありがとうございます。
>決定ボタンか何かのOnClick時にも入力チェックをするか、
やはりその方法になってしまうとはおもっているのですが
一度のチェックで済むものなら、それで済ませたいと思いました。
<TFlatButtonにActiveプロパティはありますか?
Activeのプロパティはないです。
>一度のチェックで済むものなら、それで済ませたいと思いました。
onExitでチェックする必要はありますか?
>ショートカットをキーボードで押下すると
クリックでも同じだとおもいますが
>onExitでチェックする必要はありますか?
はい。
入力によって他の項目に影響が出ないように、誤った入力を許さないようにしています。
>クリックでも同じだとおもいますが
クリックの場合は、OnExitのみ発生します。
メッセージが表示されるとOnClickのイベントは発生しないです。
(メッセージが出ることによりフォーカスが異動しただけになります)
> 入力項目でエラーになった場合はOnClickのイベントを止める方法は無いでしょうか。
エラーチェックは OnExit でやってるんですよね。その中で、エラーになったら
たとえば private な ErrorFlag:Boolean を true にするコードを書き、
そして、FlatButton の OnClick イベントハンドラの中から OnExit イベント
ハンドラを呼び出し、その直後に ErrorFlag が true だったら以下を実行しない
というふうにするといいと思います。
エラーチェック用の関数をつくって、こんな感じです
{ Private 宣言 }
public
function Edit1ErrorCheck:Boolean;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.Edit1ErrorCheck: Boolean;
begin
// エラーチェックのコード
result := true; //エラーがあったら true なければ false
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
if Edit1ErrorCheck then
// エラーの時の処理
else
// エラーがないときの処理
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1ErrorCheck then exit;
// 本来の OnClick の処理
end;
これだと、マウスで Button1 をクリックしたときは Edit1ErrorCheck が二度
実行されますが実害はないでしょう。
jokさんありがとうございます。
Edit1ErrorCheckが2度実行されるのは問題ありませんので、この方法で
対応してみます。
ツイート | ![]() |