[AccessD] Multi-Instance Forms re-visited

Charlotte Foust cfoust at infostatsystems.com
Wed Dec 15 17:47:02 CST 2004


As far as I know, you've never been able to change it in Access.  Export
the module to text, edit the text and then bring the file back in.

Charlotte Foust


-----Original Message-----
From: Francisco Tapia [mailto:fhtapia at gmail.com] 
Sent: Wednesday, December 15, 2004 3:34 PM
To: Access Developers discussion and problem solving
Subject: Re: [AccessD] Multi-Instance Forms re-visited


can't change the VB_Creatable setting in Access... the 2 choices given
is Private and PublicNotCreatable... :(



On Wed, 15 Dec 2004 15:02:42 -0800, Charlotte Foust
<cfoust at infostatsystems.com> wrote:
> You could try setting Attribute VB_Creatable = True.
> 
> Charlotte Foust
> 
> 
> -----Original Message-----
> From: Francisco Tapia [mailto:fhtapia at gmail.com]
> Sent: Wednesday, December 15, 2004 2:47 PM
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Multi-Instance Forms re-visited
> 
> 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!
> --
> AccessD mailing list
> AccessD at databaseadvisors.com 
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
> --
> AccessD mailing list
> AccessD at databaseadvisors.com 
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
> 


-- 
-Francisco
http://pcthis.blogspot.com | PC news with out the jargon!
-- 
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com



More information about the AccessD mailing list