• 締切済み

FlexGridでSetFocusするとタブオーダーがおかしくなる

WindowsXP、VC++2005のMFCにて図のようなプログラムを作成しています。 ※※※添付図はListCtrlですが、FlexGridとして認識お願いします。※※※ SetFocusが原因と考えられる問題が生じてしまい、 期待動作をさせることが出来ない状況です。 なお、FlexGridでなくListCtrlで同じプログラムを作成し、 同手順で操作したところ、期待動作をさせることが出来ました。 よって、FlexGridのみ起こる問題と考えられます。 原因と解決策についてご存知の方おられましたら、 ご教示お願い致します。 下記に期待動作、問題動作、また問題が再現しない特別な場合の 手順について記載します。 【期待動作】 タブオーダー設定順(リスト→ボタン1→ボタン2→ボタン3) に遷移させたい 【問題動作】 ボタン2にフォーカスがある状態でタブキーを押すと、 ボタン3でなくボタン1にフォーカスが移る 【問題が再現する場合の手順】 (1)ボタン2を押して、(※処理1)を実行する。  その際に、リストにフォーカスが当った後に、  フォーカスがボタン2に移る。 (2)タブキーを押す。 (3)ボタン3にフォーカスが移るはずが、ボタン1に移ってしまう。 【問題が再現しない場合の手順】 (1)ボタン1もしくはボタン3をクリックしフォーカスを当てる。 ※この際ボタン2をクリックすると、問題が再現してしまう。 ※ボタン1及びボタン3を押した際の処理はないものとする。 (2)アクセラレータキー(&A)によってボタン2をクリックし、  (※処理1)を実行。 (3)タブキーを押す。 (4)タブオーダーの通り、ボタン3へとフォーカスが移る。 (※処理1)の内容 void CtestListDlg::OnBnClickedButton2() { m_List.SetFocus(); //グリッドにフォーカスをセット m_btn2.SetFocus(); //ボタン2にフォーカスをセット }

みんなの回答

  • chie65535
  • ベストアンサー率43% (8525/19380)
回答No.1

もし、FlexGridで「フォーカスを受け取った際、メッセージキューに何かメッセージを入れている」場合、そのメッセージが処理されるのは「btn2のクリックイベント関数を抜けた後」です。 そして、もし、その「何かのメッセージ」が「FlexGridにフォーカスを移す実処理に関わるメッセージ」だった場合、以下のような事が起きるでしょう。 ・btn2のクリックイベント内でFlexGridがSetFocusされる ・それに関わるメッセージがポストされる(まだ処理されない) ・btn2のクリックイベント内でbtn2がSetFocusされる ・btn2のクリックイベントを抜け、メッセージループに戻る ・FlexGridのSetFocusに関わるメッセージが処理され、そのメッセージにより内部的なタブストップ位置がFlexGridになる ・(見た目だけは)btn2にフォーカスがある(ように見える) ・Tabを押すと、内部的なタブストップ位置がFlexGridにあったので、FlexGridの次のタブストップであるbtn1にフォーカスが移る 以下の※の位置に、プロセスのメッセージを処理するProcessMessage()を入れ、メッセージキューに溜まったメッセージを処理してから、btn2にフォーカスをセットしてみましょう。 m_List.SetFocus(); //グリッドにフォーカスをセット ※ m_btn2.SetFocus(); //ボタン2にフォーカスをセット なお、原因が別の所にある(例えば、FlexGridのフォーカス消失時のイベント処理に、btn1にフォーカスをセットするような処理が書いてある、など)場合は、上記の追加では直りません。

zigen8513
質問者

お礼

ご回答ありがとうございます。 ご指摘の通り、ProcessMessage()を用いて試みましたが、 コンパイルエラーが発生して、使用することが出来ませんでした。 ※私の使い方が悪かったのかもしれませんが。。 ただ、理論は理解できたので、代わりに m_List.EnableWindow(false); にて無理やりフォーカスをはずしてやることで、 解決することが出来ました。 ありがとうございました。

関連するQ&A

  • VC++ のタブオーダーについて

    親ダイアログにタブコントロールを貼り付け、その中でエディットボックスや リストボックスで入力出来るようになっています。 タブコントロールの中でのタブ移動はタブオーダーの順に進むのですが、 親ダイアログにあるOKボタン、キャンセルボタンにタブキーで移動が 出来ません。(フォーカスが飛んでくれません) ダイアログのプロパティでコントロール、親ダイアログの管理など やってみたのですが、分かりません。組み合わせが悪いのでしょうか? よろしくお願いします。

  • Access2010 SetFocusが当たらない

    Access2010です。 VBAにて、あるフォームの、デザイン上、「詳細」の中に存在しているテキストボックスにSetFocusでフォーカスを当てようと思ってます。 1 フォームロード時、フォームの「詳細」は非表示(当然、テキストボックスも非表示) 2 ボタンクリック時、フォームの「詳細」を表示し、テキストボックスにフォーカスを当てる という動作をしているのですが、2でテキストボックスにフォーカスがフォーカスが当たりません。どうしたらフォーカスが当たるのでしょうか? 以下、コードです。 Private Sub Form_Open(Cancel As Integer) Me.詳細.Visible = False End Sub Private Sub cmdボタン_Click() Me.詳細.Visible = True 'テキストボックスにフォーカスを当てる Me.txtテキスト.SetFocus End Sub よろしくお願いいたします。

  • FlexGridの入力中に

    お世話になっております 開発環境:VB2010(Windowsフォーム)、Windows7 動作環境:WindowsXP、Windows7 ツール:GrapeCity社のFlexGrid for Windows Forms 5.0J です FlexGrid上で、エンターを押した場合(次の列へ移動)とタブキーを押した場合(次のコントロールへ移動)とで処理を分けています また、WindowsForm上でエンターを押すと次のコントロールへ行くように作っています ベースとなるフォームに、 Select Case e.KeyCode Case Forms.Keys.Return If TypeOf Me.ActiveControl Is HAL.InheritsControl.FlexGrid Then 'FlexGridで、値を変えてエンターを押す場合はここに入らない Else SendKeys.Send("{Tab}") End If End Select としているのですが、FlexGrid上でエンターを押した場合はアクティブコントロールが「FlexGrid」となるのですが、FlexGridで入力して、その後にエンターやタブを押した場合に、アクティブコントロールがFlexGridにならなくて困っています 内容を見ると、文字化けしていてとてもわかりません(┌や┐みたいな文字になっていました) 入力中のアクティブコントロールでも、FlexGridを編集しているとわかることができるでしょうか よろしくお願いします

  • コマンドボタンのEnterイベント後に、フォーカスを移動したい。

    コマンドボタンのEnterイベント後に、フォーカスを移動したい。 フォームに「TextBox1」(TabIndex=0)「TextBox2」(TabIndex=1)「CommandButton1」(TabIndex=2)の3つのコントロールがある場合。 CommandButton1がクリックされた場合も、TextBox2からCommandButton1に、タブキーまたはエンターキーで、フォーカスが移った場合にも、同じ処理を行い、処理結果によってTextBox1やTextBox2にフォーカスを移したいと考えています。 以下のようなサンプルを作成しました。 Private Sub CommandButton1_Enter() CommandButton1_Click End Sub Private Sub CommandButton1_Click() MsgBox ("OK") TextBox2.SetFocus End Sub この場合、CommandButton1_Enterのイベントが起こった場合、CommandButton1_Click()のTextBox2.SetFocusは効きません。 (正確には、CommandButton1_Enterイベントが終わった時点で無効でしょうか。) Enterイベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。 要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。 よろしくお願いいたします。

  • ExcelVBAマルチページのタブオーダーについて

    ExcelVBAでマルチページを使用したユーザーフォームを作りました。 ユーザーフォームを表示させたときにTabキーをクリックすると以下の動作をします。 マルチページのページは8ページです。 <現在の動作> (1)1ページ目の画面内を、タブオーダーで設定した順に動く  ↓ (2)1ページ目のタブで止まる  ↓ (3)Tabキー押下でも進まない マルチページに With Page1 Label1.SetFocus End With とか、勘で入れてみたのですが動きませんでした。 実現させたい動作は以下の通りです。 <こんな感じにしたいです> (1)1ページ目の画面内を、タブオーダーで設定した順に動く  ↓ (2)1ページ目のタブで止まる  ↓ (3)1ページ目の画面内を、タブオーダーで設定した順に動く((1)に戻る) こういうことは実現可能でしょうか? 今は、タブにタブオーダーが進と、そこから先はどこへも勧めない状況です。 どなたかご教授頂けますと幸いです。 よろしくお願い致します。

  • タブオーダーの設定方法について

    ユーザーフォーム上で右クリック「タブオーダー」以外にプロパティで設定する方法が有るらしく、調べて居りました。 ご確認したいのですが、該当するのは、TabIndex(数値は0,1,2,3...)で宜しいですか。 今、試して、意図しない動作はして居ません。 しかし一度意図しない動きをして居りましたので(再現不可)、間違っているのではと。 何かお気づきの点が有ればご指摘頂けると助かります。 宜しくお願いします。

  • EXCEL VBA SetFocus について教え

    ComboBox3 で郵便番号 住所 を選択して TextBox8 に表示 その後番地等を記入するため Private Sub ComboBox3_AfterUpdate() '郵便番号 住所 Workbooks("*****.xls").Activate Worksheets("**").Activate With UserForm7 No = .TextBox1.Value .TextBox7.Value = Mid(.ComboBox3.Text, 1, 8) Cells(No + 1, 7).Value = Mid(.ComboBox3.Text, 1, 8) '郵便番号 .TextBox8.Value = Mid(.ComboBox3.Text, 10) '住所 Cells(No + 1, 8).Value = .TextBox8.Value .ComboBox3.Visible = False .TextBox8.SetFocus .TextBox8.TabIndex = 4 .TextBox8.Text = Mid(.TextBox8.Text, 1) End With End Sub 上のコードで TextBox8 の テキストの最後にカーソルを移動したいのですが TextBox8 に カーソルは現れません。(UserForm7の最初のTextBox1にフォーカスが移る) UserForm8 にも 同様なコードが有りますがこちらは期待どうり動作します。 タブオーダーとかの違いは有りますが関係するのでしょうか  よろしくお願いします。

  • フォーカスを移動させない方法

    エクセル2003のユーザーフォームにリストボックス1、リストボックス2、テキストボックス1、コマンドボタン1(シート転送用)を作成しました。(タブオーダーはこの順になってます。) 転送用ボタンは最後にクリックしますが、前3個のコントロールの操作の順番はどれでも可能にしたいと思います。ただしテキストボックスは入力の都度クリックしなくてよいようにフォーカスを常駐させたいのです。どなたか簡単な方法を教えてください。

  • フォーカスを移動させない方法

    エクセル2003のユーザーフォームにリストボックス1、リストボックス2、テキストボックス1、コマンドボタン1(シート転送用)を作成しました。(タブオーダーはこの順になってます。) 転送用ボタンは最後にクリックしますが、前3個のコントロールの操作の順番はどれでも可能にしたいと思います。ただしテキストボックスは入力の都度クリックしなくてよいようにフォーカスを常駐させたいのです。どなたか簡単な方法を教えてください。

  • Vba UserForm SetFocus

    ExcelのVbaでUserForm上に英単語のタイピング練習のソフトを作ろうとしていますが、うまくいきません。コントロールのイベントについての理解が不足しているのが分かりました。 ユーザフォーム上の複数のテキストボックス間のフォーカスの移動について教えて下さい。 UserForm1にテキストボックスを3つ、コマンドボタンを1つ配置しました。それぞれTextBox1、TextBox2、TextBox3、CommandButton1とします。 Private Sub CommandButton1_Click() TextBox3.SetFocus ・・・(1) End Sub Private Sub TextBox3_Enter() MsgBox "In TextBox3" TextBox2.SetFocus ・・・(2) End Sub 各TextBoxのTabStopプロパティは「True」、「TabIndex」は番号順になっています。 コマンドボタンのTabStopプロパティは「False」にしています。 フォームを表示し、コマンドボタンをクリックするとエラーが発生します。 (2)の実行の後(?)、(1)がエラー表示されます。 各イベントの発生のタイミング、連鎖、終了等の理解が不足していて、その理由がよく分かりません。どなたか教えていただけないでしょうか。よろしくお願いします。