2017-04-04 6 views
2

ich VBA nicht aus langer Zeit .... Ich habe dieses Formular in Access 2016Access-2016 VBA TextBox ist Null

enter image description here

Wenn ich versuche, auf die verschiedene Textfelder durch die Me zuzugreifen .Controls Sammlung und wandeln es in einem Text-Objekt, erhalte ich eine Null Referenz aber einige seiner Eigenschaften gültig sind (zB. tb.Name)

Private Sub Form_Load() 
    Dim ctrl As Control 
    Dim tb As TextBox 
    Dim evTb As clsEventTextBox 

    Set m_TbColl = New Collection 

    For Each ctrl In Me.Controls 
    If Left$(ctrl.Name, 4) = "Txt_" Then 
     Set tb = ctrl 
     'Create the TextBox wrapper 
     Set evTb = New clsEventTextBox 
     Set evTb.EventsHandler = Me 

     Set evTb.InnerTextBox = tb <----- HERE tb Is NULL 

     m_TbColl.Add evTb, ctrl.Name 
    End If 
    Next 
End Sub 

ich etwas verpasst?
Außerdem gibt es eine Möglichkeit, die Art einer Kontrolle zu bekommen anstatt mit

Left$(ctrl.Name, 4) = "Txt_" 

Antwort

3

die Art zu erhalten, verwenden TypeName wie folgt aus:

If TypeName(ctrl) = "TextBox" Then 

Und tb, um sicherzustellen, hat die Form ein Textbox Objekt, verwenden Sie diese

Set tb = Controls(ctrl.Name) 
3

Sie haben die Klasse nicht angezeigt, die Sie verwenden, aber es unter der Annahme, lo so etwas wie dieses oks:

Private WithEvents f_EH As Access.Form 
Private WithEvents f_TB As Access.TextBox 

Public Property Set EventsHandler(frm As Access.Form) 
    Set f_EH = frm 
End Property 

Public Property Set InnerTextBox(ctl As Access.TextBox) 
    Set f_TB = ctl 
End Property 

Wenn ich eine Klasse mit dieser Struktur verwenden, wird der Code in Ihrem Beitrag funktioniert gut. Beachten Sie jedoch, dass ich den erwarteten Typ der Eigenschaft InnerTextBox explizit auf Access.TextBox festgelegt habe.

Aber Ihr Code macht unnötige Gießen verwendet ungarische Namensgebung (igitt!) Und stützt sich auf die ersten 4 Zeichen des Namens „Txt_“ zu sein und könnte wie folgt geschrieben werden:

Dim ctrl As Control 
    Dim evTb As clsEventTextBox 

    Set m_TbColl = New Collection 

    For Each ctrl In Me.Controls 
    If TypeOf ctrl Is Access.TextBox Then 
     'Create the TextBox wrapper 
     Set evTb = New clsEventTextBox 
     Set evTb.EventsHandler = Me 

     Set evTb.InnerTextBox = ctrl 'Just pass the ctrl reference without casting 

     m_TbColl.Add evTb, ctrl.Name 
    End If 
    Next 

Beachten Sie die Verwendung von TypeOf in If TypeOf ctrl Is Access.TextBox Then um festzustellen, ob das Steuerelement ein TextBox ist.

+0

danke, mein Fehler war das Set in InnerTextBox vergessen haben Set-Eigenschaft :( Little OT: Ich habe eine andere Frage [hier] (http://stackoverflow.com/questions/43219351/access-2016- Set-Control-Events-zur Laufzeit) können Sie wissen, warum das passiert? – Barzo

Verwandte Themen