jwcolby
jwcolby at colbyconsulting.com
Fri Feb 13 08:37:12 CST 2009
In this lecture we will learn to create a class, build a module to initialize the class, and then test the class functionality. The class we will build will use clsDemoMsg to send communication events back and forth between the class instances. The purpose of the lecture is threefold, to practice building new classes, to practice setting up and tearing down classes outside of forms, and to demonstrate clsMsg. • In the demo database, click Insert / Class Module. • Immediately save a clsMsgDemo • In the header type in the following code: Private mstrName As String This creates a private name variable for the class instance. Remember that we can create as many instances of a class as we want, and for the purposes of this demo we will create three. Each instance will need a name so that it can identify itself to other class instances, and so that it can know when a message is sent to itself. Private WithEvents mclsMsg As clsMsg This dimensions WithEvents a private variable for a clsMsg, informing the class that we will be sinking events for clsMsg. • Drop down the left combo box and select class. This will create the Class_Initialize event stub. • Drop down the right combo box and select Terminate. That will create the terminate event • In the Initialize and terminate event stubs type the following code: Private Sub Class_Initialize() Set mclsMsg = cMsg() End Sub Private Sub Class_Terminate() Set mclsMsg = Nothing End Sub This code calls cMsg() which initializes the message class if it is not already initialized, then returns a pointer to the initialized clsMsg, which we then store into mclsMsg. We are now ready to send messages on the message channel we have set up. The terminate event stub cleans up out mclsMsg pointer. We need to make it a habit to clean up any objects that we use. • Create property statements to expose the mstrNname variable. Property Get pName() As String pName = mstrName End Property Property Let pName(lstrName As String) mstrName = lstrName End Property Classes expose their internal private variables through property statements. Property Get and Property Let statements return the internal variable and initialize the variable respectively. It is possible to simply expose the variables by using a Public in the place of Private, but I try hard never to do that. The Get and Let statements allow you to control access to the variables, perform processing if needed as you get and set the internal variables, and set up read only or write only variables by using only the Get or Let statements. You will run into programmers that will argue vehemently that get / let statements are a waste of time, but this is my lecture and I use them myself. I like to prefix all of my properties with a lower case p, just so that they group together. I also like to prefix my methods with a lower case m, just so that they group together. • Drop down the left combo and select mclsMsg. This will create the Message event sink stub. • In the event stub, type in the following code: Private Sub mclsMsg_Message(varFrom As Variant, varTo As Variant, varSubj As Variant, varMsg As Variant) If varTo = mstrName Then Dim strMsg As String strMsg = "Hello, the class instance " & mstrName & " is sinking this message." & vbCrLf strMsg = strMsg & "The entire message sent to me is:" & vbCrLf strMsg = strMsg & "From: " & varFrom & vbCrLf strMsg = strMsg & "To: " & varTo & vbCrLf strMsg = strMsg & "Subject: " & varSubj & vbCrLf strMsg = strMsg & "Msg: " & varMsg & vbCrLf MsgBox strMsg, vbOKOnly, "MESSAGE FROM" & varFrom End If End Sub This is the event sink for mclsMsg, and allows us to do something with messages that mclsMsg is sending out to whoever is listening. Since we opnly want to respond to messages sent to this specific instance of the class, we test varTo against mstrNname which is the name of this class instance. If the message is to us, then we do something with it. In this case we are just going to build up a message and pop it up in a message box. • Next we will create a method that allows this class to send a message on the message channel. Underneath the event stub we just created type in the following code: Public Function mSendMsg(varTo As Variant, varSubj As Variant, varMsg As Variant) mclsMsg.Send mstrName, varTo, varSubj, varMsg End Function This method is nothing more than a wrapper to the classes .Send method, and simply passes in the parameters to the mclsMsg. Notice that it sends mstrName as the From variable, in other words this class knows it’s name and uses that to automatically tell the message recipient who the message is from. In this lecture we have created a new class, told it to use a message class, created properties to allow getting and setting the class instance name, created an event sink for the message class and inside of that event sink used the event to do something. Finally we created a method of this class to allow us to use this class from the outside, cause the class to take an action, in this case just to send a message. In the next lecture we will actually use this class to demonstrate how to use classes that are free standing. -- John W. Colby www.ColbyConsulting.com