chucka
asked on
Indirect reference a form name
I want to use a common routine to show and unload forms. The name of the next form to process is stored in a database. I save this name in a string variable. How can I later reference this name to show the form? The unload is easy - I simply walk the Forms collection until I find a matching name. But I can't figure out how to do something like "nextForm.show" (where nextForm contains the name of the form).
ASKER
No, that won't work. I had already tried it - gives a Type Mismatch. I did the following:
dim nextShow as form
set nextShow = rs("show") ' Contains the name of the next form
dim nextShow as form
set nextShow = rs("show") ' Contains the name of the next form
ASKER
There must be a collection of Forms in the project (not the loaded forms collection). Perhaps I could walk that list and locate the form that way maybe, if I knew where to find it?? There has to be a way to reference a form through a variable rather than explicitly by it's name in code.
The form instances are aded to the collection as they are created.
I am not aware of anyway you can typecast the string in such a way that your set statement will work.
The only thing I could suggest is this...
Add a type filed to your table (or use your name field)
Then in your nextShow put in a case statement eg...
Select Case rs("show")
Case "Form1"
set nextShow = Form1
I am not aware of anyway you can typecast the string in such a way that your set statement will work.
The only thing I could suggest is this...
Add a type filed to your table (or use your name field)
Then in your nextShow put in a case statement eg...
Select Case rs("show")
Case "Form1"
set nextShow = Form1
ASKER
That would work and there's an easier way to do it, but that's what we are trying to get away from - that's the way it's being done now....... There are about 160 forms in this project! There are several Select Case structures in various modules to deal with all these forms and we want to simplify things.
You said the name of the next form in the process was stored in the database? In a table? Could you set up a recordset based on that table and then do one of these each time?
rs.MoveNext
strName = rs(0)
Set nextForm = Forms(strName)
nextForm.Show
Would that work?
brewdog
rs.MoveNext
strName = rs(0)
Set nextForm = Forms(strName)
nextForm.Show
Would that work?
brewdog
ASKER
Nope - Type Mismatch - I tried something like that earlier. First, the form is not loaded so not in the Forms collection. Second, I think you ned to use an index, not a name to access the collection.
I'm not at a machine where I can test this but how about trying:
dim nextShow as form
set nextShow = CreateObject(rs("show"))
nextShow.Show
MD
dim nextShow as form
set nextShow = CreateObject(rs("show"))
nextShow.Show
MD
ASKER
Got "ActiveX component can't create object". I implemented your suggestion as :
Dim nextSh As Form
Set nextSh = CreateObject(nextShow)
nextSh.Show
Note: Nextshow was set previously to the name of the form.
Thanks for the help. I think this may not be possible (although it should). I'm out of town until Saturday from now. I'll check back on any other suggestions then. Thanks to all.
Dim nextSh As Form
Set nextSh = CreateObject(nextShow)
nextSh.Show
Note: Nextshow was set previously to the name of the form.
Thanks for the help. I think this may not be possible (although it should). I'm out of town until Saturday from now. I'll check back on any other suggestions then. Thanks to all.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Use this:
(I'm commenting because I believe that VBDesigns' answer is bascially the same as a previuously rejected answer...)
Note that the return value of GetForm must be declared as a variant (or object) if it is a public procedure - VB won't let you return a Form from a public procedure.
Now you can say:
GetForm(rs("show")).Show
You'll get an Err 91 if the forms hasn't been loaded.
Public Function GetForm(FormName as String) As Variant
Dim frm As Form
For Each frm In Forms
If frm.Name = FormName Then
Set GetForm = frm
Exit Function
End If
Next
End Function
(I'm commenting because I believe that VBDesigns' answer is bascially the same as a previuously rejected answer...)
Note that the return value of GetForm must be declared as a variant (or object) if it is a public procedure - VB won't let you return a Form from a public procedure.
Now you can say:
GetForm(rs("show")).Show
You'll get an Err 91 if the forms hasn't been loaded.
Public Function GetForm(FormName as String) As Variant
Dim frm As Form
For Each frm In Forms
If frm.Name = FormName Then
Set GetForm = frm
Exit Function
End If
Next
End Function
set nextform = nameoftheform
nextForm.show