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.
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.
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:
Chat.Text = contacto
Chat.Show()
Aparte, como alternativa (aunque innecesaria dado el caso), quizás podrías valerte del constructor del form:
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
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
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.
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.
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
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