[AccessD] Multi-Instance Forms re-visited

Francisco Tapia fhtapia at gmail.com
Wed Dec 15 16:47:12 CST 2004


This code works for displaying "one" form... but it does not give me a
tolorance to opening a 2nd Form... :(, the original code worked fine
for many forms... Ideas?


it could be the way that I'm calling it,  (such as

Dim MultiForms As clsMultiInstance

    If MultiForms Is Nothing Then
        Set MultiForms = New clsMultiInstance
    End If
    MultiForms.Add frm, frm.hWnd, OpenArgs


------------------------------
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "clsMultiInstance"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Compare Database
'Multi Instance Multiple Forms

Dim mForms As Collection
Private colForm As Access.Form
Private colhWnd As String
Private colOpenArgs As String
Public Property Let Form(frm As Access.Form)
    Set colForm = frm
End Property
Public Property Get Form() As Access.Form
    Set Form = colForm
End Property
Public Property Let hWnd(hWnd As String)
    colhWnd = hWnd
End Property
Public Property Get strhWnd() As String
    hWnd = colhWnd
End Property
Public Property Let OpenArgs(Args As String)
    colOpenArgs = Args
End Property
Public Property Get OpenArgs() As String
    OpenArgs = colOpenArgs
End Property

Sub Add(frm As Access.Form, hWnd As String, OpenArgs As String,
Optional Key As Variant)
Dim x As clsMultiInstance
       Set x = New clsMultiInstance
       x.Form = frm
       x.hWnd = hWnd
       x.OpenArgs = OpenArgs
       x.Form.Visible = True



'On a 2nd call it errors out from here...        
----> mForms.Add Item:=x, Key:=CStr(hWnd)

End Sub
Sub Remove(hWnd As String)
    'Purpose: Remove this instance from the collection.
    Dim obj As Object           'Object in Collection
    Dim blnRemove As Boolean    'Flag to remove it.
    
    'Check if this instance is in the collection.
    '   (It won't be if form was opened directly, or code was reset.)
    For Each obj In mForms
        If obj.hWnd = hWnd Then
            blnRemove = True
            Exit For
        End If
    Next
    'Deassign the object before removing from collection.
    Set obj = Nothing
    If blnRemove Then
        mForms.Remove CStr(hWnd)
    End If
End Sub
Function Count() As Integer
    mForms.Count
End Function
Function Item(index As Variant) As clsMultiInstance
   Set Item = mForms.Item(index)
End Function
Public Function Term()
    'Purpose: Close all instances in the collection.
    'Note: Leaves the copy opened directly from database window.
    Dim lngKt As Long
    Dim lngI As Long

    lngKt = mForms.Count
    For lngI = 1 To lngKt
        mForms.Remove 1 
    Next
    Set mForms = Nothing
End Function

Private Sub Class_Initialize()
Set mForms = New Collection
End Sub

---------------END CLASS----------



On Wed, 15 Dec 2004 16:09:15 -0500, Jim DeMarco
<Jdemarco at hudsonhealthplan.org> wrote:
> Makes sense.  I was typing from (lack of) memory!!
> 
> Hope it works out.
> 
> Jim
> 
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Francisco
> Tapia
> Sent: Wednesday, December 15, 2004 4:03 PM
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Multi-Instance Forms re-visited
> 
> Jim that sounds great (re: more code :D),
> 
> I was wondering on this line:
> 
> m_col.add(x,hWnd)
> 
> access complains about an '='
> so I re-wrote it as m_col.add x, hWnd
> 
> On Wed, 15 Dec 2004 15:40:05 -0500, Jim DeMarco
> <Jdemarco at hudsonhealthplan.org> wrote:
> > Francisco,
> >
> > What about writing the value you want to use as openargs to an xml file and reading it in after the form is open?
> >
> > Or instead of a standard collection use a custom collection class that is similar to the one you have here but it would hold the form refernce, the form's hwind, and the openarg value.
> >
> > First a class to hold the data you're trying to use:
> >
> > 'MyClass
> > <classStub>
> > Public Property Let Form(frm as Access.Form)...
> > Public Property Let hWnd(hWnd as String)...
> > Public Property Let OpenArgs(Args As String)...
> > </classStub>
> >
> > <collectionclassmodule>
> > dim m_col as Collection
> >
> > 'MyCollectionClass
> > Sub Add(frm As Access.Form, hWnd as String, OpenArgs as String, Optional Key As Variant)
> > dim x as MyClass
> > Sex x = new MyClass
> >         x.Form = frm
> >         x.hWnd = hWnd
> >         x.OpenArgs = OpenArgs
> >         m_col.add(x,hWnd)
> > End Sub
> >
> > Function Item(index As Variant) As MyClass
> >     Set Item = m_col.Item(index)
> > End Function
> > </collectionclassmodule>
> >
> > Now you've got access in your collection to all the info you need for your form.
> > To store the values
> > <snip>
> > Dim MyCol as MyCollectionClass
> >
> >         MyCol.Add(frm, frm.Hwnd, "value1;value2))
> > </snip>
> >
> > To retrieve them:
> > <snip>
> > Dim MyStringArg As String
> >         MyStringArg = MyCol.Item(frm.hwnd).OpenArgs
> >         'do something with MyStringArg
> >
> > </snip>
> >
> > It's really not as complicated as it might look. If you need more info or my complete custom collection class stub (VB) let me know.
> >
> > HTH,
> >
> > Jim DeMarco
> >
> > -----Original Message-----
> > From: accessd-bounces at databaseadvisors.com
> > [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Francisco
> > Tapia
> > Sent: Wednesday, December 15, 2004 1:40 PM
> > To: Access Developers discussion and problem solving
> > Subject: [AccessD] Multi-Instance Forms re-visited
> >
> > So I have the following code in a public module..
> >
> > the purpose is to have more than one instance of the form where end
> > users can start "multiple calls" and then keep starting newer calls.
> >
> > the following code works really well and in fact I can do what I need
> > with it, except passing openargs... I figure I can use a workaround
> > unless someone here knows of a better way?
> >
> > thanks,
> >
> > ---CODE SNIP------------
> > Option Compare Database
> > Option Explicit
> > 'Author:    Allen J Browne, January 2000
> > 'Email:     abrowne at odyssey.apana.org.au
> >
> > Public clnClient As New Collection  'Instances of frmClient.
> >
> > Function OpenAClient()
> >     'Purpose:   Open an independent instance of form frmClient.
> >     Dim frm As Form
> >
> >     'Open a new instance, show it, and set a caption.
> >     Set frm = New Form_frmClient
> >     frm.Visible = True
> >     frm.Caption = frm.Hwnd & ", opened " & Now()
> >
> >     'Append it to our collection.
> >     clnClient.Add Item:=frm, Key:=CStr(frm.Hwnd)
> >     Set frm = Nothing
> > End Function
> >
> > Function CloseAllClients()
> >     'Purpose: Close all instances in the clnClient collection.
> >     'Note: Leaves the copy opened directly from database window.
> >     Dim lngKt As Long
> >     Dim lngI As Long
> >
> >     lngKt = clnClient.Count
> >     For lngI = 1 To lngKt
> >         clnClient.Remove 1
> >     Next
> > End Function
> > ---END CODE SNIP-----------------
> --
-- 
-Francisco
http://pcthis.blogspot.com | PC news with out the jargon!



More information about the AccessD mailing list