jwcolby
jwcolby at colbyconsulting.com
Sun Feb 22 23:35:00 CST 2009
Class systems have to be initialized somewhere. Often this is a form, or another class, but often we will be creating a module to hold a pointer to the base class of the system, as well as code to initialize and tear down the class system and a function to get a pointer to the base class. This pattern will become routine as we build systems of classes that perform a function for the application. You will see it over and over, an initialization module, a base class, and other classes called by the base class, perhaps even instances stored in collections in the base class. This lecture builds the initialization module for the translation system. Because the system caches the data to perform form translations, the base class clsXlateSupervisor is “global” to the system. The clsXlateSupervisor is called by each form as it opens, and clsXlateSupervisor then causes the form to be translated into the language requested. • Open the demo database. • In the menu click Insert / Module (NOT a class). • Immediately save the module to basXlate. • In the header of the class insert the following code: '--------------------------------------------------------------------------------------- 'Functions to initialize, terminate and return a pointer to clsXlateSupervisor 'as well as a global variable for the translation string field name. '--------------------------------------------------------------------------------------- Const cstrModule As String = "basXlate" Option Compare Database Option Explicit Private mclsXlateSupervisor As clsXlateSupervisor ' 'Set this variable to the name of the field holding the translation language strings ' 'fldLanguageEnglish 'fldLanguageChineseComplex 'etc ' Public mstrLanguageFldName As String This code creates two variables. mclsXlateSupervisor is private, and holds a pointer to the single instance of clsXlateSupervisor. We cause this variable to be private so that it can only be created by a call to an initialization function, and can only be torn down by a call to a terminate function. In other words no “accidental” manipulation of the pointer. mstrLanguageFldName is public. This variable must be set to the name of a valid language field in the translation table before the class is initialized the first time. If that is not done, the results are undetermined, that is a correct translation will not be performed. Function mXlateSupervisorInit() If mclsXlateSupervisor Is Nothing Then Set mclsXlateSupervisor = New clsXlateSupervisor End If Set mXlateSupervisorInit = mclsXlateSupervisor End Function This function initializes the supervisor class. The pointer to the class is tested to see if it is already initialized. If not then a new instance to clsXlateSupervisor is created and saved in mclsXlateSupervisor. The pointer to the class is then returned from the function. Function mXlateSupervisorTerm() Set mclsXlateSupervisor = Nothing End Function This function simply destroys the supervisor class instance. Call it when you terminate your application. Function cXS() As clsXlateSupervisor Set cXS = mXlateSupervisorInit() End Function cXS() is a function which calls the initialization code every time to make sure it is initialized, and returns a pointer to the now initialized supervisor class. This lecture discusses the initialization module for the translation system. The initialization module for any class system is usually exactly as you see here. It consists of a private pointer to the base class, code to initialize and terminate the class, and a function to call the Init and return a pointer to the initialized base class. If the bass class already exists, the init simply grabs a pointer to the base class instance; otherwise it initializes the base class and returns the pointer. There is not much in this module, and what is here will be seen over and over as we add class systems to perform tasks for the application. The last piece to discuss is the form to be translated. In the class behind the form simply add the following code: Private Sub Form_Open(Cancel As Integer) ' 'Call the mTranslateFrm method of the translation supervisor and 'pass in a reference to this form, and a language field name ' cXS.mTranslateFrm Me, mstrLanguageFldName End Sub This code calls the function that returns a pointer to the clsXlateSupervisor. It passes in a pointer to the form itself (me) and the string that contains the name of the desired language field in the translation table. By the time this cXS call returns the form is translated and the translation data is cached for the next time this form opens. To watch the system perform a translation of a form, place a break point in cXS and then step the code. By now you should be able to step through the code and follow along as classes are instantiated, methods called and so forth. In this lecture we discovered how simple the initialization code for class systems is. In most cases there is a private pointer to the base class, an init and term function and a function that returns a pointer to the base class. There isn’t much to see but we discussed the first time through the initialization function where the base class is initialized. We then discussed the single line of code that is called from the form’s Open event that causes the form to be translated. Class are often used in systems. You have seen such systems in Access, for example recordsets have records, which have fields, which have properties. All of these things are classes, and all of these things exist in collections of a class above them. We are now creating class systems of our own. This is a simple two class system, consisting of a translation supervisor class and a form translation class. You will see more and more class systems as I write more of these lectures. Eventually I will create a framework base class which will hold instances of the base classes for application systems such as form translations. At that point we will have only a single initialization module, which will initialize the framework. The framework base class will initialize all other classes. When we create the framework class, you too will be a framework developer. -- John W. Colby www.ColbyConsulting.com