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

解決


ツネオ  2004-05-15 01:29:25  No: 8954  IP: [192.*.*.*]

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

編集    削除
るるとん@K  2004-05-15 02:48:35  No: 8955  IP: [192.*.*.*]

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

編集    削除
るるとん@K  2004-05-15 02:56:15  No: 8956  IP: [192.*.*.*]

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

編集    削除
ツネオ  2004-05-15 05:41:01  No: 8957  IP: [192.*.*.*]

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

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

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

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

編集    削除
るるとん@K  2004-05-15 05:57:46  No: 8958  IP: [192.*.*.*]

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

編集    削除
るるとん@K  2004-05-15 05:59:34  No: 8959  IP: [192.*.*.*]

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

編集    削除
ツネオ  2004-05-17 22:15:58  No: 8960  IP: [192.*.*.*]

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

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

編集    削除
jok  2004-05-19 21:54:34  No: 8961  IP: [192.*.*.*]

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

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

編集    削除
jok  2004-05-19 22:05:20  No: 8962  IP: [192.*.*.*]

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

    { 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  IP: [192.*.*.*]

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

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

編集    削除