2
Public Function EnterToTab(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        SendKeys "{tab}"
        KeyAscii = 0
    End If
End Function

Private Sub txtUserCode_KeyPress(KeyAscii As Integer)
    Call EnterToTab(KeyAscii)
End Sub
  • このコードはログインフォームに属しています。
  • データベースに保存されている特定のユーザーのtxtUserCodeコードが含まれています。
  • このフォームの実行中に任意の数字を入力しtxtUserCodeて押すenterと、次のテキスト ボックスに移動せず、keyascii が 49 になり、13 と等しくありません。
  • を押しても同じことが起こっていtabます。
4

3 に答える 3

2

KB142816 How To Make ENTER Key Move Focus Like TAB Key for VB Controlsがあり、あなたと同様の参照実装があります。しかし。最も重要な部分である IMO は、免責事項です。

TAB キーと同じように、Enter キーを使用して、次に高い TabIndex プロパティ値を持つコントロールにフォーカスを移動させることができます。

ただし、ENTER キーを使用してフォーカスを移動することは、推奨される Microsoft Windows ベースのアプリケーション設計ガイドラインに従っていません。ENTER キーは、フォーカスを移動するためではなく、デフォルト コマンドを処理するため、または入力された情報を処理するために使用する必要があります。

とにかく、コードが機能しない理由は謎です。どちらTabもフィールドEnterからフォーカスを移動しないtxtUserCodeため、私の唯一の推測は、プロパティが に設定されてtxtUserCodeいる唯一のフィールドです。つまり、フォーカスを移動する他のコントロールはありません。TabStopTrue

于 2013-04-01T19:32:15.507 に答える
2

setFocusをシミュレートする代わりに メソッドを使用して次のテキスト フィールドに切り替えるのはTABどうですか?

Private Sub txtUserCode_KeyPress(KeyAscii As Integer)
    If (KeyAscii = vbKeyReturn) Then
        txtNextTextField.setFocus
    End If
End Sub

コントロール配列 (フォームに含まれるすべてのテキスト フィールドの配列) を使用して、インデックスをインクリメントすることもできます。したがって、冗長なコードを記述することなく、フォームのすべてのテキスト フィールドにこのコードを使用できます。

したがって、ユーザーがreturnテキスト フィールドのインデックス 0 を押した場合、フォーカスをインデックス +1 (=1) に設定します。コントロール配列を作成するには、最初のテキスト フィールドをコピーしてフォームに貼り付けます。VB6 は、コントロール配列を作成するかどうかを尋ねます。「はい」をクリックすると、自動的に実行されます。次に、次のコードを使用できます。

Private Sub txtField_KeyPress(Index As Integer, KeyAscii As Integer)
    If (KeyAscii = vbKeyReturn) Then
        If ((Index + 1) < txtField.Count) Then
            txtField(Index+1).setFocus
        Else
            MsgBox "Reached end of form!"
        End If
    End If
End Sub
于 2013-04-01T14:19:27.697 に答える
0

MrSnurb が提供する例は良いスタートですが、多くの問題があります。たとえば、コントロールが無効になったり、表示されなかったりする可能性があります (setfocus がクラッシュします)。タブを使用するとフォーカスが得られます(必要に応じてタブインデックスを設定できます)。フォーム上の次または前のコントロールに移動するために使用できる2つの「単純な」ルーチン(および追加の機能)を呼び出しました(コンテナ(フレームなど)のコントロールで動作するかどうかは実際には確認していません) 、そのため、追加のチェックが必要になる場合があります..

'##############################################################################
'##
'##     Function fnControlCanHaveFocus
'##
'##############################################################################
'A separate routine, because On Error goto doesn't work with this type of
'error in the IDE within a For Each loop, 
'even if you have set 'Only break on unhandled' errors
Private Function fnControlCanHaveFocus(ByRef ctrl As Control) As Boolean
On Error GoTo ErrorHandling
  '--------------------------------------------------------------
  'Check for properties which lets a control get a focus
  'For now also Check TabStop even though the control CAN have focus if this is off
  fnControlCanHaveFocus = (ctrl.TabStop And _
                           ctrl.Enabled And _
                           ctrl.Visible)
  Exit Function
ErrorHandling:
  fnControlCanHaveFocus = False
End Function

'##############################################################################
'##
'##     Sub pSetFocusToNextControl
'##
'##############################################################################
Private Sub pSetFocusToNextControl(ByRef frm As Form)
  Dim ctrl      As Control
  Dim ctrlFirst As Control
  Dim ctrlNext  As Control
  '--------------------------------------------------------------
  'Is there even an active control?
  If Not frm.ActiveControl Is Nothing Then
    '--------------------------------------------------------------
    'Try and find the First and next control which can receive focus
    Set ctrlFirst = Nothing
    Set ctrlNext = Nothing
    For Each ctrl In frm.Controls
      '--------------------------------------------------------------
      'Can this control have focus?
      If fnControlCanHaveFocus(ctrl) And _
         Not ctrl Is frm.ActiveControl Then
        '--------------------------------------------------------------
        'Check for Next control
        If ctrl.TabIndex > frm.ActiveControl.TabIndex Then
          If ctrlNext Is Nothing Then
            Set ctrlNext = ctrl
          ElseIf ctrlNext.TabIndex > ctrl.TabIndex Then
            Set ctrlNext = ctrl
          End If 'ElseIf ctrlNext.TabIndex>ctrl.TabIndex
        End If 'If ctrl.TabIndex>frm.ActiveControl.TabIndex
        '--------------------------------------------------------------
        'Check for first control
        If ctrlFirst Is Nothing Then
          Set ctrlFirst = ctrl
        ElseIf ctrlFirst.TabIndex < ctrl.TabIndex Then
          Set ctrlFirst = ctrl
        End If 'ElseIf ctrlFirst.TabIndex<ctrl.TabIndex
      End If 'If fnControlCanHaveFocus(ctrl) And...
    Next ctrl
    '--------------------------------------------------------------
    'Is there a next control to set focus to?
    If Not ctrlNext Is Nothing Then
      Call ctrlNext.SetFocus
    '--------------------------------------------------------------
    'No next control, but a first control to jump to?
    ElseIf Not ctrlFirst Is Nothing Then
      Call ctrlFirst.SetFocus
    End If 'ElseIf Not ctrlFirst Is Nothing
  End If 'If Not frm.ActiveControl Is Nothing
End Sub


'##############################################################################
'##
'##     Sub pSetFocusToPreviousControl
'##
'##############################################################################
Private Sub pSetFocusToPreviousControl(ByRef frm As Form)
  Dim ctrl          As Control
  Dim ctrlLast      As Control
  Dim ctrlPrevious  As Control
  '--------------------------------------------------------------
  'Is there even an active control?
  If Not frm.ActiveControl Is Nothing Then
    '--------------------------------------------------------------
    'Try and find the Last and previous control which can receive focus
    Set ctrlLast = Nothing
    Set ctrlPrevious = Nothing
    For Each ctrl In frm.Controls
      '--------------------------------------------------------------
      'Can this control have focus?
      If fnControlCanHaveFocus(ctrl) And _
         Not ctrl Is frm.ActiveControl Then
        '--------------------------------------------------------------
        'Check for Previous control
        If ctrl.TabIndex < frm.ActiveControl.TabIndex Then
          If ctrlPrevious Is Nothing Then
            Set ctrlPrevious = ctrl
          ElseIf ctrlPrevious.TabIndex < ctrl.TabIndex Then
            Set ctrlPrevious = ctrl
          End If 'ElseIf ctrlPrevious.TabIndex<ctrl.TabIndex
        End If 'If ctrl.TabIndex<frm.ActiveControl.TabIndex
        '--------------------------------------------------------------
        'Check for Last control
        If ctrlLast Is Nothing Then
          Set ctrlLast = ctrl
        ElseIf ctrlLast.TabIndex > ctrl.TabIndex Then
          Set ctrlLast = ctrl
        End If 'ElseIf ctrlLast.TabIndex>ctrl.TabIndex
      End If 'If fnControlCanHaveFocus(ctrl) And...
    Next ctrl
    '--------------------------------------------------------------
    'Is there a previous control to set focus to?
    If Not ctrlPrevious Is Nothing Then
      Call ctrlPrevious.SetFocus
    '--------------------------------------------------------------
    'No previous control but a Last control to jump to?
    ElseIf Not ctrlLast Is Nothing Then
      Call ctrlLast.SetFocus
    End If 'ElseIf Not ctrlLast Is Nothing
  End If 'If Not frm.ActiveControl Is Nothing
End Sub

たとえば、次のように使用します。

Private Sub txt_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)

  Select Case KeyCode 
    Case vbKeyDown, _
         vbKeyReturn
      Call pSetFocusToNextControl(Me)
      KeyCode = 0
    Case vbKeyUp
      Call pSetFocusToPreviousControl(Me)
      KeyCode = 0
  End Select
End Sub
于 2015-05-22T12:08:52.120 に答える