DBCtrlGridでAbortした時、任意のオブジェクトにフォーカスを移動するには?

解決


ふろんてぃあ  2011-02-10 06:10:29  No: 40007

いつもお世話になってます。
Delphi2010+XP SP3の環境で開発しています。

DBCtrlGridのBeforePostイベントで複数のオブジェクト(TDBEdit)に
入力されている値をチェックし、値に問題があったらAbortで処理を
キャンセルしています。
キャンセルした時に任意のオブジェクトにフォーカスを移動させたい
(値の再入力をさせたいオブジェクトに移動させたい)のですが、
どうやってもフォーカスが移動せず、最後にフォーカスがあった
オブジェクトにフォーカスが残っている状態になってしまいます。

今まで試したのは、
  ・DBEditに直接SetFocus
  ・データソースになっているTQueryのField.FocusControl
  ・DBEditのハンドルを取得して、Windows.SetFocus
の3方法です。
処理を行うタイミングとしてはAbortする直前でした。

どなたか、良い方法を知っている方がいらっしゃいましたら
ご教授頂けませんでしょうか。
宜しくお願い致します。


ふろんてぃあ  2011-02-10 06:13:16  No: 40008

申し訳ないです。
誤記がありました。。。

> DBCtrlGridのBeforePostイベント

はDBCtrlGridのデータソースになっているQueryオブジェクトの
イベントです。


Kenny  2011-02-10 19:41:40  No: 40009

D7+WinXP Proですが、

procedure TForm1.Query1BeforePost(DataSet: TDataSet);
begin
  if DBEdit1.Field.Value=0 then begin
    DBEdit1.SetFocus;
    Abort
  end else
    DBEdit2.SetFocus;
end;

DBEdit1に入力後Postをトライし、入力された数字が0ならやり直し、そうでないなら
PostしてDBEdit2に進む、という感じですよね。(実際にはまとめてチェックでしょうけど。)
こちらではこれで普通に動作しますけどねぇ。

どういう方法でPostをトライしていますか?「決定」ボタンを押すとか、最後のDBEditでEnterキーを押すとか。
そこで回避できる方法があるかも知れません。


ふろんてぃあ  2011-02-10 20:27:11  No: 40010

Kennyさん

回答ありがとうございます。
Postのトライについてですが、特にコーディングはしておらず
DBCtrlGridの行が移動した時に実行されています。
ですので、最後のDBEditから次のコントロールへ移動(Tab移動等)しようとして
次の行の最初のDBEditに移る前がPostのトライされるタイミングだと思います。
(デバックした結果、この様な動きではないかという認識ですので間違っていたらごめんなさい。。。)

また補足になりますが、そのタイミングでエラーチェックを行っている理由としてましては
入力値Aは入力値Bより小さいとエラー等の相関チェックを行いたかったので、
行が移動する時にエラーチェックを行っています。

入力値の相関チェックは別の方法で考えるとして、フォーカス制御としては
やはり、入力項目単位でフォーカスを戻す(移動させない)しか方法はないですかね。。。


Kenny  2011-02-10 21:42:47  No: 40011

私が書いたサンプルでも、何かボタンなどでPostするとちゃんと動きますけど、DBCtrlGrid内のDBEditを
TABキーで移動して自動Postするとうまくフォーカス移動しないですね。
そこで

procedure TForm1.DBCtrlGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (DBEdit3.Focused=true) and (Query1.State=dsEdit) and (Key=VK_TAB) then
    Query1.Post;
end;

こんな感じで
・最後のDBEditにフォーカスがあって、
・データセットが編集モードで
・TABキーが押されたとき
明示的にPostしてやるととりあえず動きますね。特に二重Postになるようなメッセージも表示
されないですし、一度試されてはいかがでしょうか。


ふろんてぃあ  2011-02-10 23:41:31  No: 40012

Kennyさん

代替案ありがとうございます。
とりあえず、Kennyさんの案を試してみましたら期待通りの動きになりました。
KeyDown時の処理なので少し考慮しなければいけないかもしれませんが、
とりあえず上手くいきそうです。

本当に助かりました。
ありがとうございました。


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

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






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