テキストボックス等でのフォーカス移動 |
Enterキーの入力でフォーカスを次に移動 (045) (046) | |
1.SendKeys ステートメントを使ったやり方 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then 'SendKeys ステートメントを使ったやり方 KeyAscii = 0 SendKeys "{TAB}" End If End Sub 2.SetFocusを使ったやり方 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then 'SetFocusを使ったやり方 KeyAscii = 0 Text2.SetFocus End If End Sub 配列の場合 Private Sub Text5_KeyPress(Index As Integer, KeyAscii As Integer) '配列の場合 If KeyAscii = vbKeyReturn Then KeyAscii = 0 '音をならさない '配列の数でMaxを設定し一番最初に移動する If Index = 2 Then Index = -1 Text5(Index + 1).SetFocus End If End Sub 3.コントロールの配列変数を使ったやり方(MS技術情報より) '宣言セクションに 'コントロールの配列の場合の設定
Private Const logCtrNum = 5 Private ctrl(logCtrNum - 1) As Control Private SetCtr As Long Private Sub Form_Load() 'コントロールの配列の場合の設定 '移動させたい順に配列を確保 Set ctrl(0) = Text1 Set ctrl(1) = Text2 Set ctrl(2) = Text3 Set ctrl(3) = Text4 Set ctrl(4) = Command1 End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then 'コントロールの配列の場合の設定 KeyAscii = 0 SbSetFocus End If End Sub Private Sub SbSetFocus() 'コントロールの配列の場合の設定 SetCtr = SetCtr + 1 If SetCtr = logCtrNum Then SetCtr = 0 End If ctrl(SetCtr).SetFocus End Sub Private Sub Command1_Click() SbSetFocus End Sub 4.私の考えたやり方 (046) '宣言セクション等に Option Explicit 'SampleNo=046 WindowsXP VB6.0(SP5) 2002.05.10 Dim logActv As Long Private Sub sbActCtlTab() 'アクティブコントロールのタブインデックスを取得 '適時必要なコントロールを追加して下さい Select Case TypeOf Screen.ActiveControl Is Object 'テキストボックスがアクティブ Case TypeOf Screen.ActiveControl Is TextBox logActv = Screen.ActiveControl.TabIndex 'コマンドボタンがアクティブ Case TypeOf Screen.ActiveControl Is CommandButton logActv = Screen.ActiveControl.TabIndex Case Else 'その他のコントロールがアクティブ logActv = 0 End Select Select Case logActv Case 0 Text2.SetFocus Case 1 Text3.SetFocus Case 2 Command1.SetFocus Case 3 Text1.SetFocus End Select End Sub Private Sub List1_KeyPress(KeyAscii As Integer) sbActCtlTab End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then KeyAscii = 0 sbActCtlTab End If End Sub Private Sub Command1_Click() sbActCtlTab End Sub Private Sub Text2_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then KeyAscii = 0 sbActCtlTab End If End Sub Private Sub Text3_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then KeyAscii = 0 sbActCtlTab End If End Sub 5.最近(流行?)のやり方 ’テキストボックス等のコントロールに Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then 'Enabled = False を利用した方法 KeyAscii = 0 'イベントが認識しない為にフォーカスが移動(移らない) Text1.Enabled = False 'その後元に戻す Text1.Enabled = True End If End Sub おすすめ 別途 APIを使ってEnterキーや↓の入力でフォーカス移動 1番のやり方は、簡単だが応答速度が鈍く、使用しているOSやIMEの種類等によって正常に動作しないこともあるので注意が必要。(MS技術情報より)、又機種によりNum Lock が ON、OFFする 2番の方法は各コントロールに個別に記述しなければならず、又処理が多い分、キーに対する応答性が低下する(MS技術情報より) 3番のやり方は上記の問題点をクリアしているが、マウス等でコントロール間を移動すると、次の移動先が前のコントロールの次に移動する 4番のやり方は3番の問題点を解決しているが、その他については未確認です、又、移動順序をタブインデックスで設定しておいて下さい。 1〜2番のやり方はコントロールが少なく、動作に問題がない場合に使用するようにして下さい 3番のやり方はMSのサポート技術情報にでていたやり方です。いずれにしても、Enter キーによるフォーカスの移動は、Windows の統一された操作感を損ねるものです。使用する場合には、慎重な検討を行わなければなりません。といった技術情報がMSのHPの方に出ています。 http://support.microsoft.com/default.aspx?scid=kb;ja;407536 |
|
↑↓キーでフォーカスを移動する (045) | |
↓キーを押すことでフォーカスを次に移動し↑で戻る 使用例 Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyUp Text2.SetFocus '↑での処理 'SendKeys "+{TAB}" '又は Case vbKeyDown Text4.SetFocus '↓での処理 'SendKeys "{TAB}" '又は End Select End Sub |
2002/05/10