ショートカットで発生するイベントよりOnExitのイベントを優先させるには?

解決


ツネオ  2004-05-15 01:29:25  No: 8954

質問させて頂きます。
入力項目(TFlatEdit)のOnExitで入力チェックを行っています。
入力にエラーがある場合はその項目に留まるようにしています。
(SetFocusしています。)
ボタン(TFlatButton)にショートカットを指定している場合
ショートカットをキーボードで押下するとOnClickイベントが
発生します。
その際入力項目にフォーカスがあってもOnExitのイベントが発生しません。
ボタンのOnClickイベントにボタンにSetFocusすればOnExitイベントが
発生する事はするのですが、OnClickのイベントもそのまま動作し続けます。
入力項目でエラーになった場合はOnClickのイベントを止める方法は無いでしょうか。


るるとん@K  2004-05-15 02:48:35  No: 8955

決定ボタンか何かのOnClick時にも入力チェックをするか、
入力欄のonEnterでボタンのEnabledをFalseにする
というのではどうでしょうか?


るるとん@K  2004-05-15 02:56:15  No: 8956

TButtonとTEditなら、
>その際入力項目にフォーカスがあってもOnExitのイベントが発生しません。
>ボタンのOnClickイベントにボタンにSetFocusすればOnExitイベントが
>発生する事はするのですが、OnClickのイベントもそのまま動作し続けます。
ということはありませんでした
TFlatButtonにActiveプロパティはありますか?
クリックしてもアクティブにならなければ、Editからフォーカスは移動しないので、onExit発生しません


ツネオ  2004-05-15 05:41:01  No: 8957

回答ありがとうございます。

>決定ボタンか何かのOnClick時にも入力チェックをするか、

やはりその方法になってしまうとはおもっているのですが
一度のチェックで済むものなら、それで済ませたいと思いました。

<TFlatButtonにActiveプロパティはありますか?
Activeのプロパティはないです。


るるとん@K  2004-05-15 05:57:46  No: 8958

>一度のチェックで済むものなら、それで済ませたいと思いました。
onExitでチェックする必要はありますか?


るるとん@K  2004-05-15 05:59:34  No: 8959

>ショートカットをキーボードで押下すると
クリックでも同じだとおもいますが


ツネオ  2004-05-17 22:15:58  No: 8960

>onExitでチェックする必要はありますか?
はい。
入力によって他の項目に影響が出ないように、誤った入力を許さないようにしています。

>クリックでも同じだとおもいますが
クリックの場合は、OnExitのみ発生します。
メッセージが表示されるとOnClickのイベントは発生しないです。
(メッセージが出ることによりフォーカスが異動しただけになります)


jok  2004-05-19 21:54:34  No: 8961

> 入力項目でエラーになった場合はOnClickのイベントを止める方法は無いでしょうか。

エラーチェックは OnExit でやってるんですよね。その中で、エラーになったら
たとえば private な  ErrorFlag:Boolean を  true にするコードを書き、
そして、FlatButton の  OnClick イベントハンドラの中から OnExit イベント
ハンドラを呼び出し、その直後に ErrorFlag が true だったら以下を実行しない
というふうにするといいと思います。


jok  2004-05-19 22:05:20  No: 8962

エラーチェック用の関数をつくって、こんな感じです

    { 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  が二度
実行されますが実害はないでしょう。


ツネオ  2004-05-21 00:30:02  No: 8963

jokさんありがとうございます。

Edit1ErrorCheckが2度実行されるのは問題ありませんので、この方法で
対応してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加