jwcolby
jwcolby at colbyconsulting.com
Sun Feb 22 22:42:37 CST 2009
clsXlateSupervisor: This class will be the supervisor for the translation process. The supervisor really just holds a collection that can hold instances of clsXlateFrm so that the data is cached, and a method to call to perform the translation of a form. If the cache is not desired then clsXlateFrm would be instantiated directly in the form’s class in the Open event and the instance of the class is discarded after performing the translation. If caching is desired then this class will perform the caching of the form classes for us. • Open the demo database. • In the menu click Insert / Class • Immediately save the class as clsXlateSupervisor. • In the header of the class add the following code: Option Compare Database Option Explicit Private mcolClsXlateFrm As Collection Private mlngCacheSize As Long Private mstrLanguageFld As String This code creates a collection to hold the clsXlateFrm instances, keyed on the form name. It also creates a cache size variable for the total cache size for all translation phrases for all forms loaded so far, and a place to save the language field name. Private Sub Class_Initialize() Set mcolClsXlateFrm = New Collection End Sub Private Sub Class_Terminate() Set mcolClsXlateFrm = Nothing End Sub The Initialize and terminate events are used to set up and tear down a pointer to the collection. ' 'Get the cache size for all forms cached so far ' Property Get pCacheSize() As Long pCacheSize = mlngCacheSize End Property ' 'Return a pointer to colClsXlateFrm ' Property Get colClsXlateFrm() As Collection Set colClsXlateFrm = mcolClsXlateFrm End Property The class properties return the private variables in the header of the class. '--------------------------------------------------------------------------------------- ' Procedure : mTranslateFrm ' Author : jwcolby ' Date : 2/21/2009 ' Purpose : Performs the translation for one form passed in. '--------------------------------------------------------------------------------------- ' Function mTranslateFrm(lfrm As Form, lstrLanguageFldName As String) Dim lclsXlateFrm As clsXlateFrm On Error GoTo Err_mTranslateFrm ' 'If the language changes then purge the collection of clsXlateFrm instances ' If lstrLanguageFldName <> mstrLanguageFld Then mstrLanguageFld = lstrLanguageFldName 'Save the new language field name ' 'Setting a collection to nothing causes the contents of the collection to be deleted. Set mcolClsXlateFrm = New Collection 'Empty the collection and get a new collection End If On Error Resume Next ' 'Try to get an instance of the clsXlateFrm from the collection for this form ' Set lclsXlateFrm = mcolClsXlateFrm(lfrm.Name) If Err Then ' 'If that fails then this is the first time so perform the initialize ' Set lclsXlateFrm = New clsXlateFrm ' 'Now that we have an instance for this form perform the load and translation ' lclsXlateFrm.mInit lfrm, lstrLanguageFldName ' ' ' mlngCacheSize = mlngCacheSize + lclsXlateFrm.pCacheSize Debug.Print lclsXlateFrm.pName & ":" & lclsXlateFrm.pCacheSize ' 'And save the instance to the collection for the next time ' mcolClsXlateFrm.Add lclsXlateFrm, lfrm.Name Else ' 'We have already loaded this form once so perform the translation ' lclsXlateFrm.mXlateFrm lfrm ' ' ' Debug.Print lclsXlateFrm.pName & ":" & lclsXlateFrm.pCacheSize End If Exit_mTranslateFrm: On Error Resume Next Exit Function Err_mTranslateFrm: Select Case Err Case 0 '.insert Errors you wish to ignore here Resume Next Case Else '.All other errors will trap Beep MsgBox Err.Number & ":" & Err.Description Resume Exit_mTranslateFrm End Select Resume 0 '.FOR TROUBLESHOOTING End Function So far, there is only a single method in this class. mTranslate form accepts a pointer to a form and the name of a language field in language table. The first thing that the code does is test whether the language field is the same as the last time the method was called. If not then it creates a new instance of the collection. Doing this to a collection pointer causes any contents of the collection to be gathered by the VBA garbage collection, in other words, it empties the collection, closes it, and then creates a brand new collection object. Doing this is not a good idea of the collection contains any pointers to Access objects such as recordsets, controls or forms, or contains classes which contain pointers to these objects. Access’ garbage collector is infamously flakely about correctly cleaning up such objects. In our case however the collection contains classes which only store simple types such as strings, and as far as I can tell the garbage collector cleans up objects like that just fine. So for our purposes, simply dimensioning the collection as a new instance is perfectly safe. Once we test for a new language, we attempt to get a clsXlateFrm instance from the collection for the current form. If none exists, we create a new instance for this form, and initialize the instance by calling mInit(). mInit() completely translates the form and caches the translation phrases for this form in a collection in clsXlateFrm. We then simply call a property of clsXlateFrm to get the cache size and add it to a variable in our header. Finally we add the new clsXlateFrm to our collection so that it is saved for the next time the form opens. If this is the second or subsequent time the form was opened, the collection already contains an instance of clsXlateFrm for this form. In this case we just call the mXlateFrm () method of that instance in order to perform the translation for this form using the already loaded and cached translation phrases. In this lecture we have discussed the operation of the supervisor class for the translation system. This class is extremely simple, with three properties and a single mTranslateFrm function. As we shall see in the next lecture, this class is used just by calling the single function, passing in a pointer to the form to translate and the field name that holds the translation language phrases. -- John W. Colby www.ColbyConsulting.com