2016-06-14 4 views
2

verwenden mag ich den gleichen Code verwenden, das ist: -den gleichen Ereigniscode in mehreren Kontrollen in MS Access

Private Sub Text_KeyDown(KeyCode As Integer, Shift As Integer) 
If KeyCode >= 48 And KeyCode <= 57 Then 
    'allow 
Else 
     If KeyCode >= 96 And KeyCode <= 105 Then 
      'allow 
     Else 
      If KeyCode = 8 Or KeyCode = 9 Or KeyCode = 13 Or KeyCode = 27 Or KeyCode = 46 Then 
       'allow 
      Else: KeyCode = 0 
      End If 
     End If 
End If 
End Sub 

in mehreren Textfeldern, die in verschiedenen Formen angeordnet sind, und ich will nicht wiederholen der gleiche code über ein over, wie kann ich das erreichen? Vielen Dank im Voraus

+0

Hallo zusammen. Warum nicht eine Funktion machen? –

+0

Setzen Sie die Funktion in ein Modul und machen Sie es zu einem 'Public Sub' und Sie können es von überall in den Formularen einfach aufrufen. – Dave

+0

versuchte das, funktionierte nicht, ich fügte eine Funktion am Ende des Formulars hinzu und nannte es nurNum und fügte den Code darin ein, und für den Fall, dass ich den Funktionsnamen eintippte, tat ich etwas falsch? –

Antwort

3

Wie @Ryan vorgeschlagen - verwenden Sie eine Funktion.

diese Funktion zu einem normalen Modul hinzufügen:

Public Function AllowKeyCode(KeyCode As Integer, Shift As Integer) As Integer 
    Select Case KeyCode 
     Case 48 To 57, 96 To 105, 8, 9, 13, 27, 46 
      AllowKeyCode = KeyCode 
     Case Else 
      AllowKeyCode = 0 
    End Select 
End Function 

Verwenden Sie diesen Code für Ihre keydown Veranstaltung:

Private Sub Text0_KeyDown(KeyCode As Integer, Shift As Integer) 
    KeyCode = AllowKeyCode(KeyCode, Shift) 
End Sub 

Edit: Sie möchten die Funktion zu berücksichtigen, ändern die Umschalttaste (zum Stoppen!, ", £ usw.):

Public Function AllowKeyCode(KeyCode As Integer, Shift As Integer) As Long 

    If Shift = 0 Then 
     Select Case KeyCode 
      Case 48 To 57, 96 To 105, 8, 9, 13, 27, 46 
       AllowKeyCode = KeyCode 
      Case Else 
       AllowKeyCode = 0 
     End Select 
    Else 
     AllowKeyCode = 0 
    End If 

End Function 
+0

danke, es hat funktioniert –

+2

Hinweis, setzen die Funktion in einem Standard-Modul macht die Funktion mehr sichtbar als es sein muss. Wenn Sie es als Mitglied eines ** Klassenmoduls ** einkapseln, wird es nur für Code sichtbar, der explizit eine Instanz dieser Klasse erstellt, so dass Sie ein privates Feld Private Validator als neuer KeyCodeValidator in allen Formen haben könnten, die es benötigen, und dann tue 'KeyCode = validator.AllowKeyCode (KeyCode, Shift)' anstatt eine globale Scoped-Funktion aufzurufen. –

+0

Ich würde auch die Funktion übergeben die Parameter nach Wert ("ByVal"), um die Absicht besser zu kommunizieren. –

2

zu Darren Antwort Hinzufügen könnte man sogar eine Unterfunktion Ihnen weitere Eingabe machen Speicher:

Public Sub AllowKeyCode(KeyCode As Integer, Shift As Integer) 

    Select Case KeyCode 
     Case 48 To 57, 96 To 105, 8, 9, 13, 27, 46 
      ' Allow KeyCode. 
     Case Else 
      KeyCode = 0 
    End Select 

End Sub 

und dann kann es nicht einfacher sein:

Private Sub Text0_KeyDown(KeyCode As Integer, Shift As Integer) 

    AllowKeyCode KeyCode, Shift 

End Sub 
+0

Außer es ist viel klarer, dass eine 'Funktion' ** ** einen Wert zurückgibt, im Gegensatz zu einem' Sub', das einen 'ByRef'-Parameter zuweist. Das Lesen von 'KeyCode = AllowKeyCode (KeyCode, Shift)' macht es viel klarer, was passiert *, ohne die eigentliche Implementierung durchlesen zu müssen, um zu sehen, welcher ByRef-Parameter mutiert wird *. –

+1

Sie müssen möglicherweise auch den Parameter _Shift_ berühren, der mit dem Subsystem einfach ausgeführt werden kann. – Gustav

+0

Fair genug, habe ein upvote =) –