none
Como puedo cerrar el formulario de Login y dejar el MDI? RRS feed

  • Pregunta

  • Hola,

    Agradecería que me puedan ayudar con el manejo de las interfaz gráfica y variables; tengo un proyecto en VB.Net en el cual necesito pasar desde el LoginForm la variable nombre usuario hacia el MDI, pero no logro hacer una forma para cerrar el login, porque cuando pongo Me.Close() después del mdi.show se cierra toda la aplicación, estoy ocupando 3 componentes gráficos: SplashScreen, LoginForm y MDIParent. Dejo una imagen y el proyecto que llevo

    link proyecto:

    https://skydrive.live.com/?sc=documents&cid=5ccc0e47df9f089f#cid=5CCC0E47DF9F089F&id=5CCC0E47DF9F089F%21349&sc=documents

    como se ve en la imagen puedo mandar la variable desde el login al mdi, pero no consigo cerrar el loginForm.

    a la espera de algún comentario o sugerencia 

    Saludos

    Mauricio Hernández



    Mauricio Hernández


    • Editado mauriciohz viernes, 16 de marzo de 2012 19:12 falta info
    viernes, 16 de marzo de 2012 19:11

Respuestas

  • en el subMain no ncesitas estos

        Public _usuarioNombre As String
        Public Property UsuarioNombre() As String
            Get
                Return _usuarioNombre
            End Get
            Set(ByVal value As String)
                _usuarioNombre = value
            End Set
        End Property

    puedes quitarlo

    y lo unico que te falta es usar

    <STAThread()> _ Shared Sub Main() Application.EnableVisualStyles() Application.SetCompatibleTextRenderingDefault(False)

    Dim login As New LoginForm1 login.ShowDialog() If (login.DialogResult = DialogResult.OK) Then Application.Run(New frmMdi(login.Usuario)) End If End Sub

    por eso te decia que el frmMdi requiere un constructor para recibir esta info

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 19 de marzo de 2012 13:07

Todas las respuestas

  • es que el loginseguramente lo estas ubicando en el lugar incorrecto

    es en el Main() de la aplciacion que debe desarrollarlo

    analiza este ejemplo donde aplcio esto que comento

    Login – Usando Password con Hash

    vb.net oculta esta parter del codigo

    Winforms, realizar tareas antes de inicializar

    pero sigue lo comentado en el titulo "VB.NET – Sub Main"

    de esta forma es como realzias un login de forma correcta

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 16 de marzo de 2012 19:17
  • Hola Leandro,

    Había revisado el ejemplo "Winforms, realizar tareas antes de inicializar" antes pero no doy con la forma de como pasar la variable "usuario" desde el loginForm hacia el MDI, lo que entiendo es que el SubMain hace como puente para iniciar un form(logingForm) y luego arrancar con el MDI, pero por medio de constructores no he logrado crear algo para pasar por ese puente 'SubMain' hacia el contructor del MDI.

    Gracias

    Saludos

    Mauricio H.


    Mauricio Hernández

    viernes, 16 de marzo de 2012 19:37
  • antes pero no doy con la forma de como pasar la variable "usuario" desde el loginForm hacia el MDI

    eso lo ahce mediente el constructor

    [WinForms] – Pasaje de información formulario hijo

    o se en el Main() cuando sales del formlogin este proporciona uan proiedad que retorna el usuario

    este dato se lo pasasa en el constructor al frmMDI para que lo use

    todo esto lo haces en el Main()

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 16 de marzo de 2012 19:45
  • Leandro, estoy haciendo el código de esa forma por constructor, pero no consigo pasar la varieble del submain hacia el MDI:

    LOGINFORM

        Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
            Dim nombreUsuario As String = UsernameTextBox.Text
            Dim objeto As New SubMain(nombreUsuario)
            Me.DialogResult = Windows.Forms.DialogResult.Cancel
            Me.DialogResult = Windows.Forms.DialogResult.OK
            Me.Close()
        End Sub

    SUBMAIN

    Friend Class SubMain
        Private _nombreUsuario As String
        Public Sub New(ByVal nombreUsuario As String)
            Me._nombreUsuario = nombreUsuario
        End Sub
        <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.SetCompatibleTextRenderingDefault(False)
            Dim login As frmLogin = New frmLogin
            login.ShowDialog()
            If (login.DialogResult = DialogResult.OK) Then
                Application.Run(New frmPrincipal()) --> Application.Run(New frmPrincipal(_nombreUsuario)) --> aquí me da error.
            End If
        End Sub
    End Class

    Tengo este mensaje de error: No se puede hacer referencia a un miembro de instancia de una clase desde un método compartido o un inicializador de método compartido sin una instancia explícita de la clase.

    Saludos

    M. Hernández


    Mauricio Hernández

    viernes, 16 de marzo de 2012 21:17
  • porque defines esto

       Public Sub New(ByVal nombreUsuario As String)
            Me._nombreUsuario = nombreUsuario
        End Sub

    no veo que este correcto alli donde lo pones

    porque se supone que el Main deberia estare en un modulo de vb.net, no dentro de un form

    esto que escribes deberia estar dentro del for frmPrincipal para que tenga ese constructor

    lo que no veo es como tomas el usuario desde el frmLogin

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 16 de marzo de 2012 21:28
  • Hola Leandro,

    La definición de ese constructor la hago en la clase ClassSubMain para recibir el nombre de usuario desde el loginForn, para luego desde el submain enviar la variable al constructor del MDI, estuve tratando de enviar desde el loginForm hacia el MDI el nombre de usuario pero cuando el metodo application.run(new frmPrincipal() ) abre el MDI borra la variable que había pasado hacia el constructor.

    "lo que no veo es como tomas el usuario desde el frmLogin"

    de esta forma: Dim nombreUsuario As String = UsernameTextBox.Text, no he podido pasarselo directamente hacia el cosntructor del MDI por que como el submain actua despues del formLogin me elimina la variable porque reinicia la instancia new.

    Saludos

    Mauricio H.


    Mauricio Hernández

    viernes, 16 de marzo de 2012 22:02
  • "lo que no veo es como tomas el usuario desde el frmLogin"

    lo haces por medio de una propiedad  en el frmLogin

    va en el buen camino, pero  en el formLogin lo que deberias definir es

    Public Class frmLogin
    
      Public Property Usiario As String
    
      Private Sub btnAceptar_Click(..)
    
          'aqui realizas la autenticacion
    
           Me.Usuario = UsernameTextBox.Text
    
           Me.dialogResult = DislogResult.Ok
    
      End Sub
    
    end Class

    con esa propiedad es que podras tomarla desde el Sub Main y enviarla en el contructor del form principal


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 17 de marzo de 2012 0:36
  • Hola Leandro

    Implemente el codigo tal como me indicas en el anterior mensaje, pero todavía tengo dudas de como enviar el dato de esa propiedad al subMain y despues hacia el MDI, este es el codigo que estoy ocupando

    Public Class LoginForm1
    
        Private _usuario As String
        Public Property Usuario() As String
            Get
                Return _usuario
            End Get
            Set(ByVal value As String)
                _usuario = value
            End Set
        End Property
    
    
        Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
            Me.Usuario = UsernameTextBox.Text
            Me.DialogResult = Windows.Forms.DialogResult.OK
            Me.Close()
        End Sub
    
        Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
            Me.Close()
        End Sub
    
    End Class

    y en el submain tengo el siguiente mensaje de error

    Public Class SubMain
        Public _usuarioNombre As String
        Public Property UsuarioNombre() As String
            Get
                Return _usuarioNombre
            End Get
            Set(ByVal value As String)
                _usuarioNombre = value
            End Set
        End Property
    
    
    
        <STAThread()> _
        Shared Sub Main()
    
            Application.EnableVisualStyles()
            Application.SetCompatibleTextRenderingDefault(False)
    
            Me._usuarioNombre = LoginForm1.Usuario --------> 'me'. Solo es validad en un metodo de instancia
    
    
            Dim login As LoginForm1 = New LoginForm1
            login.ShowDialog()
    
            If (login.DialogResult = DialogResult.OK) Then
    
    
                Application.Run(New frmMdi())
    
            End If
    
        End Sub
    End Class

    espero que me puedas entender la problematica

    dejo de todas formas el link con el proyecto

    https://skydrive.live.com/?cid=5CCC0E47DF9F089F&id=5CCC0E47DF9F089F%21349&sc=documents

    Gracias, Saludos

    M. Hernández


    Mauricio Hernández

    lunes, 19 de marzo de 2012 12:58
  • en el subMain no ncesitas estos

        Public _usuarioNombre As String
        Public Property UsuarioNombre() As String
            Get
                Return _usuarioNombre
            End Get
            Set(ByVal value As String)
                _usuarioNombre = value
            End Set
        End Property

    puedes quitarlo

    y lo unico que te falta es usar

    <STAThread()> _ Shared Sub Main() Application.EnableVisualStyles() Application.SetCompatibleTextRenderingDefault(False)

    Dim login As New LoginForm1 login.ShowDialog() If (login.DialogResult = DialogResult.OK) Then Application.Run(New frmMdi(login.Usuario)) End If End Sub

    por eso te decia que el frmMdi requiere un constructor para recibir esta info

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 19 de marzo de 2012 13:07
  • Hola para pasar la variable tienes que hacer lo siguiente

    Dim login As LoginForm1 = New LoginForm1 login.ShowDialog()

    Me._usuarioNombre = Login.Usuario

    login=nothing

    Y en el formulario de login haces un me.hide, en vez del close, de esta forma la ejecución sigue y tu descargas a mano el

    formulario de login una vez que ya no te hace falta.

    lunes, 19 de marzo de 2012 13:16
  • Gracias Leandro, ejecute el código que me faltaba en el submain y todo funciona bien.

    Saludos

    Mauricio Hernández


    Mauricio Hernández

    lunes, 19 de marzo de 2012 13:29