2017-03-14 8 views
1

Ich habe KeyDonw Event-Handler auf meinem Formular in MS Access 2007, ich benutze es stattdessen Masken, weil sie nicht so funktionieren, wie ich brauche.MS Access bekomme Absender Textfeld auf KeyDown-Ereignis in VBA

Hier mein Code:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer) 
    If ([Forms]![aForm].Form.date_rogd_s_d.SelLength = 2) Then 
     [Forms]![aForm].Form.date_rogd_s_d.Text = "" 
    End If 

    If (val([Forms]![aForm].Form.date_rogd_s_d.Text) > 31) Then 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
       X = Y 
       Exit Sub 
     Case Else 
      KeyCode = 0 
      Exit Sub 
     End Select 
    End If 


    If (Len([Forms]![aForm].Form.date_rogd_s_d.Text) < 2) Then 
     Select Case KeyCode 
      Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 
      Case 96, 97, 98, 99, 100, 101, 102, 103, 104, 105 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
      X = Y 
     Case Else 
      KeyCode = 0 
     End Select 
    Else 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
       X = Y 
       Exit Sub 
     End Select 
     [Forms]![aForm].Form.date_rogd_s_m.SetFocus 
    End If 
End Sub 

dieser Code funktioniert gut, aber ich habe mehr 5 gleiche Felder ich brauche, um zwischen.

Jeder Weg, Absender des Ereignisses zu erhalten, ich meine Textbox-Objekt innerhalb der Taste gedrückt, ich möchte universelle Funktion für alle Textfelder erstellen, und ich Punkt wird nicht diesen Code kopieren.

Antwort

0

ich dieses Problem mit dieser Funktion lösen:

Private Sub onKeyDownForDateFields(KeyCode As Integer, Shift As Integer, Sender As Object, NextObject As Object, count As Integer, maxValue As Integer, Is_submit As Boolean) 
    If (Sender.SelLength = count) Then 
     Sender.Text = "" 
    End If 

    If (val(Sender.Text) > maxValue) Then 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack 
       X = Y 
       Exit Sub 
     Case Else 
      KeyCode = 0 
      Exit Sub 
     End Select 
    End If 


    If (Len(Sender.Text) < count) Then 
     Select Case KeyCode 
      Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 
      Case 96, 97, 98, 99, 100, 101, 102, 103, 104, 105 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
      X = Y 
     Case Else 
      KeyCode = 0 
     End Select 
    Else 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack 
       X = Y 
       Exit Sub 
      Case vbKeyReturn 
       Êíîïêà48_Click 
       Exit Sub 
     End Select 
     If (Is_submit = True) Then 
      Êíîïêà48_Click 
     Else 
      NextObject.SetFocus 
     End If 
    End If 
End Sub 

Wo Sender ist aktuelle TextBox und NextObject Objekt muss ich als nächstes konzentrieren.

Es wird auch getestet, ob die max. Anzahl der Symbole in das Textfeld eingegeben wurde und ob sie beispielsweise die maximal zulässige Anzahl nicht erreicht hat, zB 31 Tage.

Nun, wenn ich Ereignis behandeln muss ich tun es wie folgt aus:

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

    onKeyDownForDateFields KeyCode, Shift, [Forms]![aForm].Form.date_rogd_s_d, [Forms]![aForm].Form.date_rogd_s_M, 2, 31, False 

End Sub 
-1

Benennen Sie Ihre Prozedur dazu, halten den Rest des Codes:

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

dann in allen Kontrollen/Textfelder, übergeben Sie die Parameter dieser Prozedur: zum Beispiel das Ereignis, das Sie oben haben würde einfach passieren den Schlüsselcode, verschieben sich als Hinweis auf die gleiche sub:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer) 
Call On_KeyDown(KeyCode, Shift) 
End Sub