WithEvents

30 maart 2000

Om alle besturingselementen op een formulier een extra gedrag aan te leren, kun je ze opnemen in een speciale collectie van objecten van een zelf gedefinieerde klasse. Dat klinkt pas geleerd!

Het idee is niet zo moeilijk als de zin hierboven. De stappen kunnen er zo uit zien:

De volgende code schrijf je in het formulier (alleen voor tekstvakken):

Private col As New Collection
Private NTB As gTextBox

Private Sub Form_Close()
   Set col = Nothing
   Set NTB = Nothing
End Sub

Private Sub Form_Load()
   Dim ctl As Control
   For Each ctl In Me.Controls
      If ctl.controlType = acTextBox Then
         Set NTB = New gTextBox
         Set NTB.TextBox = ctl
         col.Add NTB, ctl.Name
      End If
   Next ctl
End Sub

Het formulier houdt een collectie van exemplaren uit je klasse bij. Er gebeurt niets met die collectie, maar omdat de objecten uit de klasse een variabele WithEvents hebben, gaan de gebeurtenissen naar de objecten. Pas als het object de gebeurtenis niet behandelt, komt-ie terecht in het formulier.

Als het formulier wordt geladen, worden alle tekstvakken "ingeschreven" in de collectie. De variabele NTB wordt 'misbruikt' voor ieder nieuw tekstvak - ik heb deze code overgenomen (van wie ook alweer?) en vermoed dat declaratie in Form_Load ook goed is. Huiswerk!

Het hele gedrag van een tekstvak wordt nu anders.

De klasse gTextBox ziet er bij ons zo uit:

Option Compare Database
Option Explicit

Private WithEvents m_TextBox As TextBox

Private lngOldColor As Long

Public Property Set TextBox(ctl As TextBox)
    Set m_TextBox = ctl
    m_TextBox.OnGotFocus = "[Event Procedure]"
    m_TextBox.OnLostFocus = "[Event Procedure]"
End Property

Private Sub Class_Terminate()
    Set m_TextBox = Nothing
End Sub

Private Sub m_TextBox_GotFocus()
  lngOldColor = m_TextBox.BackColor
  m_TextBox.BackColor = vbGreen
End Sub

Private Sub m_TextBox_LostFocus()
  m_TextBox.BackColor = lngOldColor
End Sub

Je ziet dat de gebeurtenissen GotFocus en LostFocus worden gevangen. De achtergrondkleur van het tekstvak wordt groen zolang het element de focus heeft.
Let op de Class_Terminate. Altijd netjes de zooi opruimen!

Succes ermee!