Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: .:Weeds:. en 20 Enero 2014, 02:19 am



Título: Pasar variable al abrir form.
Publicado por: .:Weeds:. en 20 Enero 2014, 02:19 am
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
  1. Dim asm As System.Reflection.Assembly = _
  2. System.Reflection.Assembly.GetExecutingAssembly()
  3. Dim frm As Form = _
  4. CType(asm.CreateInstance("Proyecto.Chat"), Form)
  5. frm.Text = contacto 'Aqui asigno el contacto y despues lo recibo desde el evento load
  6. frm.Show()

No hay alguna manera mejor de llevar a cabo esto?

Saludos y gracias.


Título: Re: Pasar variable al abrir form.
Publicado por: Eleкtro en 20 Enero 2014, 03:58 am
No 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
  1. Chat.Text = contacto
  2. Chat.Show()

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

Código
  1. Public Class ChatForm
  2.  
  3.    Public Sub New(ByVal Contact As String)
  4.  
  5.        InitializeComponent()
  6.        MyBase.Text = Contact
  7.  
  8.    End Sub
  9.  
  10.    Private Shadows Sub Load(sender As Object, e As EventArgs) Handles MyBase.Load
  11.  
  12.        MsgBox(MyBase.Text)
  13.  
  14.    End Sub
  15.  
  16. End Class

Código
  1. Public Class Form1
  2.  
  3.    Private WithEvents ChatForm As Form = Nothing
  4.  
  5.    Private Sub ShowForm()
  6.  
  7.        ChatForm = New ChatForm("Mi contacto")
  8.        ChatForm.Show()
  9.  
  10.    End Sub
  11.  
  12. End Class

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

Saludos


Título: Re: Pasar variable al abrir form.
Publicado por: .:Weeds:. en 20 Enero 2014, 05:13 am
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.


Título: Re: Pasar variable al abrir form.
Publicado por: Eleкtro en 20 Enero 2014, 13:34 pm
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.

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
  1. Public Class Form1
  2.  
  3.    Public Shared PreloadForms As New Stack(Of Form)
  4.  
  5.    Private Shadows Sub Shown() Handles MyBase.Shown
  6.        ShowForm()
  7.    End Sub
  8.  
  9.    Private Sub ShowForm()
  10.        ' Muestro el Formulario y lo elimino del stack.
  11.        PreloadForms.Pop.Show()
  12.    End Sub
  13.  
  14. End Class

Código
  1. Imports WindowsApplication... .Form1
  2.  
  3. Namespace My
  4.  
  5.    Friend Class MyApplication
  6.  
  7.        Private Shadows Sub Startup() Handles MyBase.Startup
  8.  
  9.            ' Añado el form al stack, es decir, lo precargo.
  10.            PreloadForms.Push(My.Forms.Form2)
  11.  
  12.            ' Información adicional.
  13.            Debug.WriteLine(String.Format("{0} is preloaded", Form1.PreloadForms.Peek.Name))
  14.  
  15.        End Sub
  16.  
  17.    End Class
  18.  
  19. End Namespace

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

Saludos