[AccessD] Ambiguous Name

Kenneth Ismert kismert at gmail.com
Wed Sep 21 13:25:07 CDT 2011


All,

Ken Ismert:
> ...
> The question remains: is there any way to enforce safe global value
> modification in VBA, except by employing Gustav's discipline?
>

Thinking about this further, I have come up with two approaches that could
work:

1. Use messaging. In this scenario, no global parameters are kept at all.
All objects communicate by sending messages to one another in a standardized
way. The sender is always identified. Receivers can then decide who to
ignore, and who to listen to.

2. Use a listener 'static class'. Some object requests to be the 'speaker',
first-come, first-served. Once accepted, only the speaker can set parameters
for the rest. Sample code:

Option Explicit

' module MTestListener
Private Const ML_ERR_SPEAKER As Long = -2147213504 ' 8000 + vbObjectError
Private mlPtr As Long     ' ObjPtr(Nothing) = 0

Public Sub ListenToMe(ByVal rSpeaker As Object)
    If mlPtr = 0 Then
        ' setting mlPtr does not increment the object's
        ' reference count, so the object can close normally
        mlPtr = ObjPtr(rSpeaker)
    Else
        Err.Raise ML_ERR_SPEAKER, "MTestListener.ListenToMe", _
            "Sorry, listening to Object at " & mlPtr
    End If
End Sub

Public Sub IgnoreMe(ByVal rSpeaker As Object)
    If ObjPtr(rSpeaker) = mlPtr Then
        mlPtr = 0
    End If
End Sub

Public Sub SetParameter(ByVal rSpeaker As Object, sName As String, vValue As
Variant)
    ' must match speaker, and not be nothing
    If (ObjPtr(rSpeaker) = mlPtr) And (mlPtr <> 0) Then
        ' set global parameter sName = vValue
    Else
        Err.Raise ML_ERR_SPEAKER, "MTestListener.SetParameter", _
            "Sorry, listening to Object at " & mlPtr
    End If
End Sub

Public Function GetParameter(sName As String) As Variant
    ' anybody can get a parameter
End Function



More information about the AccessD mailing list