[AccessD] Inter-form communication

jwcolby jwcolby at colbyconsulting.com
Thu Jan 22 08:26:45 CST 2009


There is some discussion going as to how to communicate 
between forms.  Using Withevents in classes (c'mon guys, it 
is EASY!!!) you can send messages between forms, passing 
parameters, or even causing code to run.

To see a demo of this, go to my web site, log in then click 
example code / withevents demos on the menu.  Unzip and open 
the demo database.

www.colbyconsulting.com.

The code is VERY simple!

You can think of the message class as email, where the 
sender transmits a message with a From, To, Subject and 
Message.  This allows the sender to identify itself, as well 
as the target of the message, what the message is about and 
a generic "message".  Whether all that is necessary is up to 
your code, but allows you to use it if you wish.

The receiving code can then set filters to only accept 
messages sent to itself, and can then use the subject to 
(for example) place text in a text box, execute a function, 
run a query, etc.

Because the clsMessage is a class, you can create one or a 
hundred message channels, making private channels or public 
channels.

Because the message class uses variants, you can even pass 
in pointers, which means that your subject or msg fields can 
contain pointers to controls, forms, recordsets etc.  IOW 
the calling code can open a form (for example) and tell the 
form "return a value in this control".  Or it could open a 
form and tell the form "move to this PK".

The OpenArgs method of communicating between forms is 
limited to the opening form, and is rather clumsy as well. 
Having an "email" system where code can send email to other 
code opens up interform communication and makes it dead simple.

Create a class called clsMsg and insert the following code 
(watch for line wraps):


Option Compare Database
Option Explicit

Public Event Message(varFrom As Variant, varTo As Variant, _
                         varSubj As Variant, varMsg As Variant)
Public Event MessageSimple(varMsg As Variant)

Function Send(varFrom As Variant, varTo As Variant, _
                 varSubj As Variant, varMsg As Variant)
     RaiseEvent Message(varFrom, varTo, varSubj, varMsg)
End Function
Function SendSimple(varMsg As Variant)
     RaiseEvent MessageSimple(varMsg)
End Function

'*************************

Create a module called basInitMsg and insert the following code:

Option Compare Database
Option Explicit

Public gclsMsg As clsMsg

Function InitClsMsg()
Static blnInitialized As Boolean
     If blnInitialized = False Then
         Set gclsMsg = New clsMsg
         blnInitialized = True
     End If
End Function

'**************************

Insert the following code in the header of any form to use 
the message channel:

Option Compare Database
Option Explicit
Private WithEvents fclsMsg As clsMsg

Private Sub Form_Open(Cancel As Integer)
     InitClsMsg	'Initializes the channel
     Set fclsMsg = gclsMsg 'Gets a pointer to the class
End Sub

'**************************

To receive a message from any code using the message channel:

Private Sub fclsMsg_Message(varFrom As Variant, varTo As 
Variant, _
                 varSubj As Variant, varMsg As Variant)
     If varTo = "frm1" Then
         txtReceive = varMsg
     End If
End Sub

'***************************

To send a message on the message channel:

Private Sub txtSend_AfterUpdate()
     fclsMsg.Send "frm1", "frm2", "Just a test", txtSend.Value
End Sub

-- 
John W. Colby
www.ColbyConsulting.com



More information about the AccessD mailing list