いつもお世話になってます。
Delphi2010+XP SP3の環境で開発しています。
DBCtrlGridのBeforePostイベントで複数のオブジェクト(TDBEdit)に
入力されている値をチェックし、値に問題があったらAbortで処理を
キャンセルしています。
キャンセルした時に任意のオブジェクトにフォーカスを移動させたい
(値の再入力をさせたいオブジェクトに移動させたい)のですが、
どうやってもフォーカスが移動せず、最後にフォーカスがあった
オブジェクトにフォーカスが残っている状態になってしまいます。
今まで試したのは、
・DBEditに直接SetFocus
・データソースになっているTQueryのField.FocusControl
・DBEditのハンドルを取得して、Windows.SetFocus
の3方法です。
処理を行うタイミングとしてはAbortする直前でした。
どなたか、良い方法を知っている方がいらっしゃいましたら
ご教授頂けませんでしょうか。
宜しくお願い致します。
申し訳ないです。
誤記がありました。。。
> DBCtrlGridのBeforePostイベント
はDBCtrlGridのデータソースになっているQueryオブジェクトの
イベントです。
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キーを押すとか。
そこで回避できる方法があるかも知れません。
Kennyさん
回答ありがとうございます。
Postのトライについてですが、特にコーディングはしておらず
DBCtrlGridの行が移動した時に実行されています。
ですので、最後のDBEditから次のコントロールへ移動(Tab移動等)しようとして
次の行の最初のDBEditに移る前がPostのトライされるタイミングだと思います。
(デバックした結果、この様な動きではないかという認識ですので間違っていたらごめんなさい。。。)
また補足になりますが、そのタイミングでエラーチェックを行っている理由としてましては
入力値Aは入力値Bより小さいとエラー等の相関チェックを行いたかったので、
行が移動する時にエラーチェックを行っています。
入力値の相関チェックは別の方法で考えるとして、フォーカス制御としては
やはり、入力項目単位でフォーカスを戻す(移動させない)しか方法はないですかね。。。
私が書いたサンプルでも、何かボタンなどで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になるようなメッセージも表示
されないですし、一度試されてはいかがでしょうか。
Kennyさん
代替案ありがとうございます。
とりあえず、Kennyさんの案を試してみましたら期待通りの動きになりました。
KeyDown時の処理なので少し考慮しなければいけないかもしれませんが、
とりあえず上手くいきそうです。
本当に助かりました。
ありがとうございました。
ツイート | ![]() |