[AccessD] CREATE CLASSES AND EVENTS DEMO DATABASE

jwcolby jwcolby at colbyconsulting.com
Mon Feb 9 15:50:19 CST 2009


Did you create a CLASS MODULE?

Back where you clicked Insert on the tool bar, you have a choice of things to insert.  If you click 
"Module" then a plain old module is created.  Plain old modules cannot dim an object WithEvents.

John W. Colby
www.ColbyConsulting.com


Hewson, Jim wrote:
> John,
> I'm using 2007 and it doesn't like the WithEvents in the clsFrm module.
> It states it's "Only valid in object module.
> Do I have it in the correct place?
> 
> Jim
> 
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
> Sent: Monday, February 09, 2009 12:06 PM
> To: Access Developers discussion and problem solving
> Subject: [AccessD] CREATE CLASSES AND EVENTS DEMO DATABASE
> 
> 
> * Create a blank database
> * Create a new form.  Drag and drop one of each of the controls onto the
> form.  Save the form.
> * On the menu click insert / Class module.
> * If you haven't already done so, turn on "require variable
> declaration".  Inside the editor, click 
> Tools / Options / Editor (tab) and check the "require variables
> declaration" box.
> * Immediately save the module, and name it clsFrm.
> 
> * Type the following into the module (or cut and paste):
> 
> Private WithEvents mfrm As Form
> Private Const cstrEvProc As String = "[Event Procedure]"
> 
> The first line declares a private variable called mfrm and tells VBA
> that this class will SINK 
> EVENTS for the form inside of this class.
> 
> The second line declares a private constant cstrEvProc and places the
> text "[Event Procedure]" in 
> the constant.
> 
> * Next type the following into the module:
> 
> Function mInit(lfrm As Form)
>      Set mfrm = lfrm
>          mfrm.BeforeUpdate = cstrEvProc
> End Function
> 
> This creates a method of the class called mInit and passes in a form
> variable called lfrm.
> 
> The set statements then saves the lfrm variable passed in into the mfrm
> variable that we created 
> above.
> 
> The next statement places the string "[Event Procedure]" into the
> BeforeUpdate  property of the form 
> mfrm.  This requires an explanation.  It turns out that if you have the
> actual text string "[Event 
> Procedure]" (without the quotes) in any event property of any form or
> control, then that event will 
> fire in the class.  You can prove that to yourself by deleting this text
> in some property of some 
> form or control in an existing project, cause that event to fire, and
> notice that the code no longer 
> runs in your code behind form.  Put that text string back and notice
> that the event code now runs in 
> your code behind form.
> 
> Pretty easy so far yes?  To reiterate, we have declared a variable and a
> constant that are PRIVATE 
> to the class, meaning that they can only be accessed from inside of the
> class.  We created a method 
> that we can use to pass in a reference or pointer to some form, we have
> saved that pointer to some 
> form passed into this class instance to a variable in the top of our
> class, and we have placed the 
> text "[Event Procedure]" into the BeforeUpdate event property of mfrm.
> 
> At this point we have a form, with one of each control on the form.  We
> also have a class which can 
> be instantiated, and passed in a pointer to some form.  The class can
> save the pointer to the form 
> passed in and can activate the form to raise one specific event
> (BeforeUpdate).
> 
> Do this much before we continue.  This should take you just a few
> minutes to complete.
> 



More information about the AccessD mailing list