¿Como abrir desde el código un formulario del que sólo conozco el nom

albertoblanco
22 de Diciembre del 2005
¿Hay alguna manera de, sabiendo el nombre de un formulario, poderlo invocar desde el código sin usar el metodo show o load del propio objeto del formulario?

Es decir, si tengo un formulario que se llama Form1, se puede mostrar o cargar en memoria con su metodo, Form1.show, o Form1.load ... pero, ¿se puede hacer esto, por ejemplo, desde una funcion "generica", para abrir cualquier formulario de la aplicación?... es decir

sub AbreFormulario(Nombre as string)

... abrirlo

end sub

Por supuesto, no puedo tener previamente todos los formularios cargados en memoria para buescarlo con el objeto forms.

Gracias por adelantado

en?
22 de Diciembre del 2005
no se si lo he comprendido bien, lo que puedes hacer es que el parámetro de Sub AbreFormulario se tipo Form

Sub AbreFormulario(Nombre As Form)
Nombre.Show
End Sub

A ver si es esto lo que quieres. Un saludo.

albertoblanco
22 de Diciembre del 2005
Gracias por tu ayuda Enco. No puedo pasarle el formulario como objeto, pues lo único que tengo del formulario es el nombre. Se que ese formulario existe en la aplicación, pero quisiera referenciarlo por el nombre. Todo esto viene motivado por tener una lista de formularios en una bbdd con sus privilegios para los distintos usuarios, y no tener que hacer un select case con el nombre del formulario... algo asi:

select case NombreFormulario

albertoblanco
22 de Diciembre del 2005
joer, que lo dejo a medias...decia:

Select case NombreFormulario
Case "Form1"
Form1.show
Case "Form2"
Form2.show

etc..

Ya que son un monton de formularios, y ademas, el engorro de tener que modificar la funcion cada vez que se añada o quite alguno....

No se si me he explicado

Gracias por adelantado

sdemingo
22 de Diciembre del 2005
Hola,

Es esto lo que necesitas???

Dim nombreFormulario As String
Dim f As Form

nombreFormulario = "Form3"

Select Case nombreFormulario
Case "Form2"
Set f = Form2
Case "Form3"
Set f = Form3
Case "Form4"
Set f = Form4
End Select
f.Show

Salu2
sdemingo
http://boards.melodysoft.com/sdemingo

albertoblanco
22 de Diciembre del 2005
gracias por tu interés sdemingo :)

No es exactamente eso, ya que lo que precisamente quiero evitar es el select... por cierto, investigando he descubierto una cosa que a mi me parece muy interesante. Se trata del objeto VBA, que aún no conozco bien, pero parece que tiene las colecciones de los proyectos, de las ventanas, de los forms... de todo. Pero para poder usarlo, que es lo que a mi me faltaba, y en la documentacion del MSDN no he visto, es activar la referencia "Microsoft Visual Basic For Aplications Extensibility"... cuando sepa algo más del tema, os lo escribo. De todas formas, si alguien sabe algo sobre este tema, agradecere indicaciones.

Muchas gracias a todos

en?
22 de Diciembre del 2005
si he leido tu llamado en la respuesta a Laura, y de hecho lo seguí buscando.
Lo único que he encontrado que podría haber sido relevante fué la función CallByName del objeto VBA, que hace exactamente lo que necesitabas, acceder a las propiedades y métodos usando Strings, PERO, sólo usando el String para las propiedades y los métodos, no para hacer referencia al objeto en sí.

O sea, se puede hacer

Dim Instruccion As String
Instruccion = "show"

VBA.CallByName Form3, Instruccion, VbMethod 'para mostrar el fomulario
MsgBox VBA.CallByName(Form3, "visible", VbGet) 'para saber si está visible

Pero continua necesitando el parámetro de tipo Object, del que no existe una función de conversión.

Creo que no te quedará más remedio que usar el Select Case : (

en?
22 de Diciembre del 2005
si, lo comprendo, pero el problema es no poder acceder por la colección Forms
Lo ideal sería que hubiera una función de conversión, como CStr(), CDbl(), que conviertiera el string en objecto Form, pero desgraciadamente creo que VB no contempló esa posibilidad : (

A mi sólo se me ocurre usar el Select Case, aunque tenga el inconveniente que te presenta.
De todas formas cabe esperar a que alguien sepa algún "truquillo".

Lamento no poder ayudar. Un saludo.

albertoblanco
22 de Diciembre del 2005
Muchas gracias de nuevo por tu interés Enço. Buscando en la ayuda del MSDN, me he encontrado que hace referencia al objeto VBE, que se supone tiene colecciones para acceder a los proyectos del VB, sus ventanas y no se cuantas cosas más. De hecho, me sale en la ayuda de los temas del VB6, pero chico, no se si me falta alguna referencia en el proyecto o algo asi, por que el visual basic no me reconoce ese objeto.... si eso te da una pista sobre algo más que sepas

Gracias

Klos
22 de Diciembre del 2005
Hellow..como estan...este codigo lo vi en la pagina del guille
www.guille.info.net
okas
sub loadform(byval NameForm as string)
Dim f As Form
'valida si ya ta cargao px
For Each f In Forms
If f.Name = NameForm Then
Exit Function
End If
Next
Set f = Forms.add(NameForm)
f.Show
end sub
me funciona okas en VB6.0