- - PR -
直前のコントロールの取得について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-17 15:09
こんにちは。いつもお世話になっております。
開発環境 VB.NET OS=WindowsXP Buttonを12個並べたカスタムコントロールを作成中です。 動作はF1〜F12キーをClickされた時に、別の入力検証用カスタムコントロールの持つ オブジェクトプロパティのHandleにSendMessageしてイベントを発生させ、 そのカスタムコントロールにWM_SETFOCUSを送っています。 ところが、Windows標準のTextBoxなどのコントロールにフォーカスを設定したいのですが、直前のコントロールのハンドルが取得できずに困っています・・ FindForm.ActiveControlとすると、当然ですが、このButtonコントロールが Activeとなっています。 その「直前」のコントロールのハンドルを取得する方法はないでしょうか? 尚、このコントロールはフォーカスを持たない仕様のため、Button_Enterは 使用せずに、Clickイベントのみで行っています。 尚、様々なフォームに実装するため、TabIndexを参照する GetNextControlは使用できないです・・ どなたかご教授のほど、よろしくお願いします。
| ||||||||||||||||
|
投稿日時: 2007-04-17 16:54
たとえば、以下はイベントを起こしてしまっていますが、
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2007-04-17 17:02
ざっと読ませていただくとファンクションメニューなコントロールの様子ですね。
個人的には「直前」をわかるのはフォームなどの親側でなければわからないと思っています。 #または各種コントロールで「必ず」利用されるクラスでもあれば・・・ 今回実装しようとしているカスタムコントロールのみでは厳しい気がします。 ふと疑問に思ったのですが、「直前のコントロールにフォーカスを戻す」というのは どういったケースで利用しようとしているのでしょう? 検証の結果により、というなら直前ではない箇所に戻したくなる ケースが多い気がしたもので。 | ||||||||||||||||
|
投稿日時: 2007-04-17 17:27
ごめんなさい。この文章の意味するところがどうもよくわかりません。
りんごさん自身は理解されているのだと思いますので、もう少しかみ砕い て説明していただけませんか。
ここを読むと「Buttonを12個並べたカスタムコントロール」にフォーカスが 来てはいけないように思えますが、上の文章を読むと自ら WM_SETFOCUS を送っているとも読めますね。また混乱してきました。 フォーカスを持たない仕様なのであれば、ちょっと乱暴ですが WM_SETFOCUS を MyBase に渡さずに捨てることでなんとかなりそう な気がしますが、それではいけないのでしょうか。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||||||
|
投稿日時: 2007-04-17 17:49
ああっと、質問文を全部読んでいませんでした。 確かに、検証時に必要という意味であれば、Validating イベントで、 現在のコントロールと遷移しようとしているコントロールが取得できますね。 "直前のコントロールにフォーカスを戻す" というのも、Validating イベントで可能ですし。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2007-04-18 09:17
じゃんぬねっと様、ぽぴ王子様、Ahf様、ご返答ありがとうございます。
URL拝見したのですが、フォーム上で使用するようなので、 カスタムコントロール内部で実現できますでしょうか? 検討してみます。
ごめんなさい。「直前の」という言い方に誤解があるのかも知れませんが、 ファンクションキーとして使用するのですが、このカスタムコントロール(FuncKeyとします) には、フォーカスがこないのです。フォームに入力検証するコントロール類(TrueTextとします)を 実装して、FuncKeyを必ず配置するのですが、動作はF1〜F12のキーを押下するか、 もしくはFuncKeyのF1〜F12までのボタンをClickするかのどちらかです。 押されたキーを教えるイベントを発生させます。 TrueTextにフォーカスがある状態で、FuncKeyをClickされようと、ボタンを押されようと TrueTextにフォーカスがないといけない仕様です。 TrueTextというのは入力検証用に作成してあるカスタムコントロールなので、 検証はこのコントロール内部で行うため、FuncKeyでは必ず「元々フォーカスのあった コントロール」に戻さないといけません。
・「キーを Click 」とはFuncKeyのボタンをClickです ・「別の入力検証用カスタムコントロールの持つオブジェクトプロパティ」とは TrueTextに「Obj」というプロパティを持たせており、そこに自分自身を設定させています。 ・そのカスタムコントロールとはTrueTextのことです。 TrueTextに対して、WM_SETFOCUSを送っているのです。 「検証」はTrueText内部で行っています。エラーがある場合には、次のフォーカスへ移動 できません。 作成する画面数が100を越えるシステム構築のため、なるべくフォームには コードを増やすな という上司のもと、普通のTextBoxを使用した場合には、 LeaveやValidatingを使用しなければ、フォーム上でも検証しなければいけませんが、 検証なしのTextBoxとしてWindows標準のTextBoxを配置した場合に、 TextBox(直前のコントロール)にフォーカスがないといけないのです・・・ それでどうすればHandleが取得できるのか?と。。 見た目には一瞬でもFuncKeyにフォーカスが移って構わないのですが、 WndProc内でWM_SETFOCUSを使用するとしたら、FuncKey_Enterイベントを使わないと いけないのでしょうか?それとも、他に何か方法はあるでしょうか? | ||||||||||||||||
|
投稿日時: 2007-04-18 09:47
Form の参照さえ持っていれば、可能でしょうね。
微妙な言い回しですが、 仮想ファンクション キーから押下された場合はフォーカスは設定されない。 ただし、マウス ポインタでクリックした場合はフォーカスが移るので、これを元に戻したい。 という解釈で宜しいでしょうか?
"なるべく" どころか、コードで依存していたら無意味なので、書いてはいけません。 確かに、カスタム コントロール側で Form を扱うのは OOP には反しているでしょう。 しかし、今回のような AOP を目指す場合に限っては、トレードオフ関係にあると思います。
未だに、WM_SETFOCUS などに拘るのかがわかりません。 FuncKey_Enter イベントは、カスタム コントロールの Enter イベント (OnEnter) であり、 何ら問題ないと思いますが...? (2 年くらい前に似たようなものを作ったことがあります) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2007-04-18 10:54
その通りです。 実際の動作は、仮想ファンクションキーが押された場合には、 PFKeyPressというイベントを発生させています。 標準のTextBoxの場合には、TextBox1_PFKeyPressとなって欲しいのですが、、、
mm_Obj にTextBoxのHandleがとれさえすれば上手くいきそうなのですが・・
以前はVB6でWin32APIを使用したPGがあり、それを流用しています。 もちろんAPIなぞあんまり使いたくないので、それに代わるもので上手くいくのであれば 変更します。 ClickイベントとEnterイベントと両方作成していました・・ Enterイベントのみで行ってみます。 そうすると
これでm_Conに入ってくるか実験後、報告します。 |