[AccessD] Building a control class

A.D.Tejpal adtp at airtelmail.in
Mon Mar 2 23:26:29 CST 2009


John,

    If a single class covering all controls (complete with events) were to be devised, could there be any reason not to prefer it over a host of classes control-wise ?

    While assigning "[Event Procedure]" to various events, it seems desirable to make it conditional to the event not already having been assigned some function (e.g. =MyFunction()) as otherwise the latter stands suppressed.

Best wishes,
A.D. Tejpal
------------

  ----- Original Message ----- 
  From: jwcolby 
  To: Access Developers discussion and problem solving 
  Sent: Tuesday, February 10, 2009 07:03
  Subject: [AccessD] Building a control class


  In this lecture we will build a class to hold a control.  The problem is that while we can build a class for a generic control, we can’t sink events from generic controls because VBA has no idea what kinds of event any class might raise.  Thus the class has to be for a specific type of control, for example a combo box or a text box.

  • From the database window, click Insert / Class.
  • Immediately save the new class as clsCtlCbo
  • Place the following code in the header of the class

  Private WithEvents mctlCbo As ComboBox
  Private Const cstrEvProc As String = "[Event Procedure]"

  This should be starting to look familiar.  The first line dimensions a variable for a combo control, and dimensions it WithEvents, which means that this class will sink events for the control stored in that variable.  cstrEvProc is already familiar and is the text which when placed in an event property “hooks” that event and causes the control to Raise that event.

  • In the left combo box select the class.  The editor will insert an Initialize event stub.  We will not use the Initialize event at this time.
  • In the right combo box, select the Terminate event.  The editor will insert a Terminate event stub.
  • In the Terminate event stub insert the following code:

  Private Sub Class_Initialize()
       Set mctlCbo = Nothing
  End Sub

  • Again, this code should be looking familiar.  We are telling the class that when it terminates, to clean up the pointer to the combo box.
  • Create a mInit() function as follows:

  Function mInit(lctlCbo As ComboBox)
       Set mctlCbo = lctlCbo
       mctlCbo.BeforeUpdate = cstrEvProc
       mctlCbo.AfterUpdate = cstrEvProc
       mctlCbo.OnGotFocus = cstrEvProc
       mctlCbo.OnLostFocus = cstrEvProc
  End Function

  This mInit passes in a pointer to a control in lctlCbo.  It then saves that pointer to mctlCbo, dimensioned up in the class header.  Finally it “hooks” four events of the combo, the BeforeUpdate, AfterUpdate, GotFocus and LostFocus.

  • In the left combo box in the editor, select mctlCbo.  The editor will create the BeforeUpdate event stub.  In the right combo select the AfterUpdate event and the editor will create an event stub for that event.  Repeat for the GotFocus and LostFocus.
  • In these events place the following code:

  Private Sub mctlCbo_AfterUpdate()
       MsgBox "AfterUpdate: " & mctlCbo.Name
  End Sub

  Private Sub mctlCbo_BeforeUpdate(Cancel As Integer)
       MsgBox "BeforeUpdate: " & mctlCbo.Name
  End Sub

  Private Sub mctlCbo_GotFocus()
       MsgBox "GotFocus: " & mctlCbo.Name
  End Sub

  Private Sub mctlCbo_LostFocus()
       MsgBox "LostFocus: " & mctlCbo.Name
  End Sub

  • Save and close clsCtlCbo.

  This lecture has created a new clsCtlCbo.  We are starting to see a pattern emerge, where we have a private variable in the top of the class dimmed WithEvents to hold a pointer to an object, in this case a combo control.  We have a Terminate event of the class that cleans up the pointer when the class closes.  We have an mInit() event that passes in a pointer to the object, sets the local variable equal to the passed in pointer, and then “hooks” events of the object passed in by setting the properties to a specific string "[Event Procedure]" by using a constant declared in the class header.  We then have event sink subs which will execute when the given event fires.  

  At this time all that the event sinks will do is pop up a messagebox but that is sufficient to varify that the events are firing.
  -- 
  John W. Colby
  www.ColbyConsulting.com


More information about the AccessD mailing list