Pasar variable al abrir form.

Iniciado por .:Weeds:., 20 Enero 2014, 02:19 AM

0 Miembros y 1 Visitante están viendo este tema.

.:Weeds:.

Hola. Estoy creando un chat con el cual desde el formulario CONTACTOS llamo al form CHAT, al form chat le tengo que pasar una variable que determina el contacto con el que se efectuará la conversacion. Lo estoy haciendo de manera 'chapuzas', os pongo ejemplo.

Código (vbnet) [Seleccionar]
Dim asm As System.Reflection.Assembly = _
System.Reflection.Assembly.GetExecutingAssembly()
Dim frm As Form = _
CType(asm.CreateInstance("Proyecto.Chat"), Form)
frm.Text = contacto 'Aqui asigno el contacto y despues lo recibo desde el evento load
frm.Show()


No hay alguna manera mejor de llevar a cabo esto?

Saludos y gracias.


Eleкtro

#1
Cita de: .:Weeds:. en 20 Enero 2014, 02:19 AMNo hay alguna manera mejor de llevar a cabo esto?

¿Porque utilizas reflection para instanciar un form que ya es accesible desde el propio ensamblado para modificar una propiedad?.

...a menos que existan otros aspectos del problema que no hayas detallado o que yo no haya entedido y te obliguen a usar Reflection, no es necesario más que esto:

Código (VBNET) [Seleccionar]
Chat.Text = contacto
Chat.Show()


Aparte, como alternativa (aunque innecesaria dado el caso), quizás podrías valerte del constructor del form:

Código (vbnet) [Seleccionar]
Public Class ChatForm

   Public Sub New(ByVal Contact As String)

       InitializeComponent()
       MyBase.Text = Contact

   End Sub

   Private Shadows Sub Load(sender As Object, e As EventArgs) Handles MyBase.Load

       MsgBox(MyBase.Text)

   End Sub

End Class


Código (vbnet) [Seleccionar]
Public Class Form1

   Private WithEvents ChatForm As Form = Nothing

   Private Sub ShowForm()

       ChatForm = New ChatForm("Mi contacto")
       ChatForm.Show()

   End Sub

End Class


PD: No se si es eso lo que andas buscando.

Saludos








.:Weeds:.

Eso es, lo del constructor del form es lo que andaba buscando. Pasar la variable utilizando .Text es como lo hago pero demasiado chapuzas.

Otra cuestión, puedo cargar el form en memoria para que sea mas fluido abrirlo por primera vez? Me explico, cuando llamo a abrir el form por primera vez tarda en abrirse, pero todas las demas se abre rapido como me gustaria que fuera la primera. Se me ha ocurrido otro metodo chapuzas que es iniciar el form 'Invisible' al cargar el programa forzando a cargarse pero me gustaria hacer las cosas bien.

Pd: Cotilleando tu perfil veo que somos valencianos los dos. No tiene que ver con la cuestion pero me ha llamado la atención.

Saludos y gracias.


Eleкtro

#3
Cita de: .:Weeds:. en 20 Enero 2014, 05:13 AMSe me ha ocurrido otro metodo chapuzas que es iniciar el form 'Invisible' al cargar el programa forzando a cargarse pero me gustaria hacer las cosas bien.

Vaya, pues eso es lo que te iba a decir yo xD.

Teniendo en cuenta que en cada inicio la aplicación debes instanciar ese form una primera vez para que todos los controles se dibujen y tal ...yo creo que lo que llamas método chapuzas en realidad es la única manera de aumentar la velocidad de carga. aunque, bueno, mi especialidad no es el rendimiento de memoria, sólamente hablo por lógica ya que lo innecesario no se carga en memoria a menos que sea bajo demanda.

Esto es una de esas cosas que deberían hacerse al cargar la aplicación, es decir en el evento Startup.

Y si tienes varios forms que deseas mantener "cargados" entonces podrías valerte de un Stack de forms para ir precargándolos cuando sea necesario.

Código (vbnet) [Seleccionar]
Public Class Form1

   Public Shared PreloadForms As New Stack(Of Form)

    Private Shadows Sub Shown() Handles MyBase.Shown
        ShowForm()
    End Sub

    Private Sub ShowForm()
        ' Muestro el Formulario y lo elimino del stack.
        PreloadForms.Pop.Show()
    End Sub

End Class


Código (vbnet) [Seleccionar]

Imports WindowsApplication... .Form1

Namespace My

   Friend Class MyApplication

       Private Shadows Sub Startup() Handles MyBase.Startup

           ' Añado el form al stack, es decir, lo precargo.
           PreloadForms.Push(My.Forms.Form2)

           ' Información adicional.
           Debug.WriteLine(String.Format("{0} is preloaded", Form1.PreloadForms.Peek.Name))

       End Sub

   End Class

End Namespace


Y aparte de eso puedes precompilar tu aplicación usando NGEN.

Saludos