• 締切済み

Tabindexを使ったカーソル制御について(GotFocusとLostFocus)

Tabindex を使ったカーソル制御で困っています。 Tabindexで各コントロールに順位を付け、Enterkeyやマウスで、あるコントロール以降に移動するときは(LostFocus内で)入力チェックをしてひっかかれば自コントロールに戻り、以前のコントロールに移動するときはExitSubでチェックせずに抜けるようにしています。 各コントロールにGotFocusしたときに、共通の変数でTabindex番号を取得して、LostFocus内で比較しているのですが… 通常、移動先コントロールのGotFocusイベントの後に移動元コントロールのLostFocusが起きていて、実際に同じForm内の他のコントロールではうまく動作しています。 しかし、ある部分では全く同じ記述をしているにもかかわらず、LostFocusイベントが先に起こり、うまく動作しません。(しかも、うまく動作しているのと同じプロパティと記述の方法で、コントロールの名前しか違いはありません)。 何か気をつける点はあるでしょうか。 …少し調べたところ、「GotFocusが最初に起こる」というのと「どちらが先に起こるのかは不安定」という記述があってどう考えたら良いのか迷ってしまいます。

みんなの回答

回答No.5

#4さんへ >CausesValidationプロパティ 知りませんでしたー VB6...奥が深い... 知っていたら、当時却下されなかったかも? 勉強になりましたm(_ _)m

kistune
質問者

お礼

皆様ありがとうございます。似たようなことを実現するのにも、いろいろな考え方があるものですね。 無事解決いたしました。

noname#187541
noname#187541
回答No.4

No.3さんの >※入力途中で「入力をやっぱやめた」という時 >キャンセルボタンへのフォーカスを持たせられない というのはキャンセルボタンをクリックした時に入力途中のコントロールでValidateイベントが発生するからということでしょうか? であれば、キャンセルボタンの「CausesValidationプロパティ」をFalseにしておけば、入力中のコントロールでValidateイベントは発生しません。 こうすれば、Validateイイベントを使っても問題ないのでは?

回答No.3

>ある部分では全く同じ記述をしているにもかかわらず、LostFocusイベントが先に起こり、うまく動作しません。 似たような経験があるのですが、、、もしかしてトグル(ラジオ)ボタンやチェックボックスでしょうか? それであれば私と一緒です。 どこかのHPにも、「VBのバグ」として紹介されていたのを覚えております。 私も当時、初心者プログラマでしたので、そこのHPに書いてあることを鵜呑みにして深く調査はしておりませんので、もし違っていたらすいません。 私の場合、それをどうしても回避でき無かったので、全てTabStopを殺し、全てKeyCodeがタブキーの時に制御を加えました。 Validateを利用して、フォーカスを移動させない手もあったのですが、、、 ※入力途中で「入力をやっぱやめた」という時 キャンセルボタンへのフォーカスを持たせられないという状態のため、却下されました。 キャンセルボタンにフォーカスが行く為には、入力途中の場合、ESCキーを押し、テキストをクリアしなければならないなどの制限が必要になります。 もしそちらのプロジェクト管理者が却下しなければ、それが一番工数がかからない方法だとは思いますが、そうでなければ、コントロール間のフォーカス移動は、全て制御を入れないときついかも知れません。

noname#187541
noname#187541
回答No.2

LostFocusイベントを使わないようにする。 VB6だったら入力チェックはValidateイベントで行います。 このイベントにはCancelという引数があり、Cancel = True とすればフォーカスの移動をキャンセルできます。

noname#187541
noname#187541
回答No.1

こんばんは。 お使いのVBのバージョンは? それによって会とが違うと思います。

kistune
質問者

補足

あ、VB6.0です。申し述べ忘れました。

関連するQ&A

  • TabIndex順にタブ移動しない・・

    VB.NETです。 TextBoxなどのTabIndexに0~35までのTabIndex番号を付けていますが、タブ移動させたときに何故かTabIndex番号順に進んでくれません。 実行させた際に、最初にカーソルのある位置が、TabIndex=15のTextBoxになってしまっています。 そこからタブ移動させると、15, 16, 17, 18, ・・・・・・35まで進み、次は頭から(TabIndex=0)から進んで、TabIndex=14で止まります。 タブ止めは、以下の質問で解決し、実現しています。 http://okweb.jp/kotaeru.php3?q=1377546 最初は、正常にタブ移動(0~35)していたのですが、TextBoxを移動させたり作り直したり再編集しているうちに、気づくとおかしな動きになっていました。 ちなみに、TabIndex0~14までのタブは、Container1上に貼り付けて、TabIndex15~35までのタブは、Container2上に貼り付けています。 Containerも、TextBoxも、Form1上にあります。 原因がわかる方いらっしゃいましたら、アドバイスいただけると助かります。 ※Containerとは、InputManのカスタムコントロールで、標準のPanelコントロールの高機能版みたいなものです。

  • タブ移動で最後のTabIndexまで行くと頭から繰り返さないようにしたい

    環境は、VB.NETです。 タブ移動で、最後のTabIndexまでカーソルが行くと、その次は、また頭から(最初のTabIndexから)繰り返しますが、それを止めたいです。 つまり、最後のTabIndexまでカーソルが行くと、いくらTabキーを押しても、そのコントロールにカーソルをとどめておきたいのです。 しかし、逆タブ(Shift+Tab)を押すと、TabIndexをさかのぼって、最初のTabIndexのコントロールまでバックさせたいです。 で、頭のコントロールにカーソルをたどり着くと、またそこでとどまるといった動きを実現したいと思っています。 何か、良い方法がございましたら、ご教授下さいませ。 ちなみに、以下のコードで、Enterキーを使ってタブ移動させています。 Select Case e.KeyCode  Case Keys.Enter   Dim bThrough As Boolean = False   If TypeOf Me.ActiveControl Is Edit Then    If (CType(Me.ActiveControl, Edit)).Multiline = True Then     bThrough = True    End If   End If   If bThrough = False Then    Dim forward As Boolean = e.Modifiers <> Keys.Shift    'this.ProcessTabKey(forward);    Me.SelectNextControl(Me.ActiveControl, forward, True, True, True)   End If   ・   ・   ・ End Select

  • TabIndexを使わないで、フォーカスの移動

    ご多忙中大変申し訳ありません。 VBの初心者です。 TabIndexを使わないで、コントロールの名前の番号でフォーカスの移動をしたいのですが、私のレベルでは全くできません。 TextBox1、TextBox2、TextBox3、TextBox3、~TextBox15 のようにTextBoxの後ろに付いている、数字を利用してフォーカスの移動をしたいと思っております。 実装前に下記のようなコードを書いてテストしていますが、どこを調べても、また試行錯誤を繰り返してもできません。 Public Class Form1 'テスト Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.KeyPreview = True '1列目TextBoxの生成 Dim i As Integer For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(50, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 txtbx.Text = "TabIndexは" & CStr(i * 3) txtbx.Name = "TextBox" & CStr(i + 1) Me.Controls.Add(txtbx) Next '2列目TextBoxの生成 For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(160, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 + 1 txtbx.Text = "TabIndexは" & CStr(i * 3 + 1) txtbx.Name = "TextBox" & CStr(i + 6) Me.Controls.Add(txtbx) Next '3列目TextBoxの生成 For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(270, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 + 2 txtbx.Text = "TabIndexは" & CStr(i * 3 + 2) txtbx.Name = "TextBox" & CStr(i + 11) Me.Controls.Add(txtbx) Next End Sub Private Sub Form1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Keys.Right Then '→キーによるフォーカスの移動 Me.SelectNextControl(ActiveControl, True, True, True, False) e.Handled = True ElseIf e.KeyCode = Keys.Left Then '←キーによるフォーカスの移動 Me.SelectNextControl(ActiveControl, False, True, True, False) e.Handled = True End If '↓(Down)キーによるフォーカスの移動  ここができません。 If e.KeyCode = Keys.Down Then Dim txtboxname As String txtboxname = Me.ActiveControl.Name 'TextBoxの名前の名前の取得 Dim txtbxnum As String txtbxnum = txtboxname.Remove(0, 7) 'TextBox~の名前から、~(数字)だけにする。 Dim controlName As String controlName = "TextBox" & CStr((CInt(txtbxnum) + 1)) 'TextBox~の名前の~に1を足す。 Me.Controls(controlName).Select() 'TextBox~+1のTextBoxをフォーカス 'Select() Focus()も結果は同じです。 End If '↑(Down)キーによるフォーカスの移動 'この部分は、↓(Down)キーによるフォーカスの移動が出来るようになりましたら、追加します End Sub ' Enterキーによるフォーカスの移動 Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress If e.KeyChar = Chr(Keys.Enter) Then Me.SelectNextControl(ActiveControl, True, True, True, True) e.Handled = True End If End Sub End Class 最終的な目的の動作は、EnterキーではTabIndexの順番にフォーカスの移動。 ←キーでは、左にフォーカスの移動。 →キーでは、右にフォーカスの移動。 ↑キーでは、上にフォーカスの移動。 ↓キーでは、下にフォーカスの移動。 コントロールの名前の番号でフォーカスの移動をしたい理由は、 Enterキーと←、→キーによるフォーカスの移動でTabIndexの順番を使い、上下方向、↑キー、↓キー移動には、TabIndexの順番が画像のように少々複雑になってしまい、TabIndexを使用してのフォーカスの移動は断念しました。 もし、TabIndexでフォーカスの移動が出来るようなら、そちらのほうでもかまいません。 使用バージョンは、VB2010 Express Edition です。 ご迷惑を、おかけしますが、どうかご助力をお願いいたします。

  • VB.NET ボタン押下で一つ前のコントロールへ

    お世話になります。 VisualStudio2010 InputMan6.0 上記を使用して、VB.NETで開発をしております。 いくつかテキスト・コンボコントロールが並んでいるFormで、ボタンを押下することで それまでカーソルがあったコントロールの一つ前のTabIndexがあるコントロールへ カーソルを遷移させたいのですが、うまく動きません。 SelectNextControlを使ってみても、ボタン押下の段階でボタンがActiveなコントロールと なってしまうため、ボタンの一つ前のコントロールにカーソルが移動してしまいます。 うまい方法はないでしょうか?

  • Firefoxのマウスカーソル

    Firefoxを使用してて何かダウンロードした時に OK にカーソルが自動的に行ってくれる様にするにはどうしたらいいのでしょうか? コントロールパネル→マウス→ポインタオプション→ 動作にはチェックが付いています。

  • 自ウィンドウがアクティブなのか監視をしたい。

    プログラムを起動した時は自分のプロセスが アクティブ(タスクバーのタイトルが凹んでいる)ですが、 他のプロセスを任意にクリックすると非アクティブ (タスクバーのタイトルが出っ張る)になると思いますが、 その時にイベントを起こす事ができるのでしょうか? Form_LostFocusやForm_Deactivateを使用しても できませんでした。 自プロセスから他プロセスに移行したと認識したいと 思っております。 説明が下手で解りづらいと思いますが、 よろしくお願い致します。

  • 【Access】サブフォーム間のカーソル移動がわからなくて困っています。

    2つのサブフォームがあり、サブフォーム間のカーソル移動を実現したいのですが、 意図した動作にならず、困っております。 その為、下記の条件を満たす動作をご教示いただける方がいらっしゃいましたら、 ご教示の程、よろしくお願いします。 【条件】 1. Form1_SUBのfield2でEnterキー押下時、同じ行のForm2_SUBのIDに移動したいです (Form1_SUBの1行目のfield2でEnterキー押下時、 Form2_SUBの1行目のIDにカーソルを移動したいです。 下記のソースでは Form2_SUBの最後のカーソル位置があった行のIDに遷移してしまいます)。 2. Form2_SUBのfield2でEnterキー押下時、次の行のForm1_SUBのIDに移動したいです (Form2_SUBの1行目のfield2でEnterキー押下時、 Form1_SUBの2行目のIDにカーソルを移動したいです。 下記のソースでは Form1_SUBの最後のカーソル位置があった行のIDに遷移してしまいます)。 【フォーム名】 親:OYAFORM サブ:Form1_SUB(T1テーブルを連結した帳票フォームです。) サブ:Form2_SUB(T2テーブルを連結した帳票フォームです。) 【テーブル名】 T1(ID, field1, field2) T2(ID, field1, field2) 【F1_SUBのソース】 Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then Forms!OYAFORM!Form2_SUB.SetFocus Forms!OYAFORM!Form2_SUB.Form!ID.SetFocus End If End Sub 【F2_SUBのソース】 Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then Forms!OYAFORM!Form1_SUB.SetFocus Forms!OYAFORM!Form1_SUB.Form!ID.SetFocus End If End Sub 以上、よろしくお願いします。

  • テキストボックスの入力チェック(ACCESS VBA)

    テキストボックスに何かを入力し、フォーカスが他のものに移動したときに、LostFocusイベントで入力内容のチェックをかけています。(文字数チェック、ストアドをつかって入力内容と一致するものがDBにあるかなど) もし、入力が誤っている場合には他のものにフォーカスを移さず、そのテキストボックスにフォーカスを残したい(setfocusを使用)のですが、setfocusをしてもlostfocusされてしまうため、うまくいきません。 VBではValidateイベントというものがあるようですが、 VBAではみあたりません。 どなたかよい方法をご存知でしたら教えてください。

  • EXCEL TEXTBOXにカーソルを移動したい

    EXCEL2000にて、シートの上にTEXTBOX(コントロールボックス ツールにて作成)を貼り付けています。 エラーチェックを行い、エラーの場合、TEXTBOXへカーソルを移動させたいのでヒントをお願いします 試した事) (1)worksheets("sheet1").TEXTBOX1.select→TEXTBOXの定義がアクティブになり、カーソルが移動しない 試した事) (2)worksheets("sheet1").TEXTBOX1.Activatet→TEXTBOXフィールドが非表示になる よろしくお願いします

  • Enterキーでもコントロール間を移動するには?

    通常はデフォルトで、コントロール間を移動するにはTABキーとなっていますが、コントロールのプロパティのTabIndexで、その移動順序を数字で指定するようになっていると思うのですが、このコントロール間を移動をEnterキーでも行えるようにしたいと思っています。 どのような方法(プロパティ設定?コード記述?)が必要となりますか? よろしくお願い致します。

専門家に質問してみよう