none
Problema nas chamadas de formulário com VB.Net RRS feed

  • Pergunta

  • Boa noite pessoal. Estou com o seguinte problema no VB.Net : tenho um formulário inicial, por exemplo, de login que chama um MDI que por sua vez chama um form2, que por sua vez chama um form3, que por sua vez chama um form4. Quando o formulário inicial é o MDI, as chamadas ocorrem normalmente, mas que a chamada inicial é o frmInicial, por exemplo, o form de login, o form2 não consegue chamar o form3. O que posso fazer para que funcione normalmente começando pelo form de login?

    Public Class frmInicial
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Me.Hide()
            Dim formInicial As New mdiPrincipal
            formInicial.Show()
        End Sub
    End Class
    
    'frm mdiPrincipal (é um MDI)
    Public Class mdiPrincipal
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim form As New Form2
            form.MdiParent = Me
            form.Show()
        End Sub
    End Class
    
    
    Public Class Form2
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim form1 As New Form3
            form1.MdiParent = mdiPrincipal
            form1.Show()
        End Sub
    End Class
    
    
    Public Class Form3
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim form1 As New Form4
            form1.MdiParent = mdiPrincipal
            form1.Show()
        End Sub
    End Class
    
    
    Public Class Form4
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        End Sub
    End Class

    terça-feira, 27 de setembro de 2016 06:52

Respostas

Todas as Respostas

  • Bom dia CarlosFeju,

    Obrigado pela participação no Fórum MSDN.

    Por gentileza, poderia esclarecer um pouco mais o que precisa?

    Como abrir um form de outro

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 27 de setembro de 2016 14:06
    Moderador
  • Oi amigo, bom o seu MdiParent esta erado remova ele.
    terça-feira, 27 de setembro de 2016 15:01
  • Olá Robson. O meu problema é que tenho inicialmente um form de login do sistema.

        Private Sub btnProsseguir_Click(sender As Object, e As EventArgs) Handles btnProsseguir.Click
    
            Dim form = New frmPrincipal
            Me.Hide()
            form.Show()
    
        End Sub
    

    Quando passo por ele tenho um form MDI com os menus do sistema onde seleciono um form de cadastro,

        Private Sub CadastroDeProcessoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CadastroDeProcessoToolStripMenuItem.Click
            Dim form = New frmListaProcessos
            form.MdiParent = Me
            form.Show()
        End Sub
    

     Neste eu mostro todos os registros em um DataGridView.

    Private Sub preencherGrid()
    
            'Variáveis para medir tempo
            Dim tInicio As DateTime
            Dim tFim As DateTime
            Dim tDiferenca As TimeSpan
    
            tInicio = Now
    
            With dgvListaProcessos
    
                'Carregar os dados
                .DataSource = Nothing
                .Rows.Clear()
                .Columns.Clear()
                carregaDadosLINQ()
    
                'Formatando o DataGridView
    
                'Coluna do código do Processo
                .Columns(0).HeaderText = "Código"
                .Columns(0).Width = 50
                .Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.BottomCenter
                .Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                .Columns(0).Name = "Codigo"
    
                'Assunto do Processo
                .Columns(1).HeaderText = "Assunto"
                .Columns(1).Width = 585
                .Columns(1).Name = "Assunto"
    
                'Botão de manutenção
                Dim btn As New DataGridViewButtonColumn()
                .Columns.Add(btn)
                btn.HeaderText = "Manutenção"
                btn.Text = "Click aqui"
                btn.Name = "btn"
                btn.UseColumnTextForButtonValue = True
                'btn.Width = 30
    
            End With
    
            tFim = Now
            tDiferenca = tFim.Subtract(tInicio)
            lblTempoGasto.Text = "Tempo: " & tDiferenca.TotalSeconds.ToString("0.0") & " segundos"
    
        End Sub
    

    Quando o usuário clica em um dos registros, deveria abrir um outro form com todos os dados do registro selecionado, que são muitos, para fazer a manutenção, conforme rotina abaixo:

        Private Sub dgvListaProcessos_CellContentDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvListaProcessos.CellContentDoubleClick
    
            Dim linha As Integer
            Dim nIdProcesso As Integer
    
            linha = dgvListaProcessos.CurrentRow.Index
            nIdProcesso = dgvListaProcessos.Rows(linha).Cells("Codigo").Value
    
            Dim form As New frmDadosProcesso(nIdProcesso)
            form.MdiParent = frmPrincipal
            form.Show()
    
        End Sub
    

    Mas o form não aparece. Pelo debug verifico que o form frmDadosProcesso é iniciado, mas não sei porque não aparece. Mas quando eu retiro o form de login, ou seja, início é pelo MDI eu consigo abrir o form frmDadosProcesso.

    Public Sub New(nIdProc As Integer)
    
            ' Esta chamada é requerida pelo designer.
            InitializeComponent()
    
            ' Adicione qualquer inicialização após a chamada InitializeComponent().
            nIdProcesso = nIdProc
            mostrarDados()
    
        End Sub
    

    O que eu posso fazer para resolver este problema?




    • Editado CarlosFeju terça-feira, 27 de setembro de 2016 18:24
    terça-feira, 27 de setembro de 2016 18:20
  • Bom dia CarlosFeju,

    Penso que você precisa utilizar multithreading para fazer com que o primeiro form fique em segundo plano quando é clicado em um registro e um novo form é aberto. Pesquise sobre o assunto, é um pouco complicado mas tem potencial de ser muito eficiente.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 28 de setembro de 2016 13:51
    Moderador
  • Olá Robson pesquisei sobre multithreading nos artigos https://msdn.microsoft.com/pt-br/library/cc580613.aspx e https://msdn.microsoft.com/en-us/library/aa289496%28v=vs.71%29.aspx?f=255&MSPPError=-2147217396 e fiz uma pequena aplicação de teste com as mesmas rotinas, mas nem chama a principal. Ele mostra um MsgBox que coloquei, mas não abre o MDI.

    Imports System.Threading
    
    Public Class frmInicial
    
        Public chamaFrm As Thread
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Me.Hide()
    
            chamaFrm = New Thread(AddressOf ChamaMdiPrincipal)
    
            chamaFrm.Start()
    
        End Sub
    
        Public Sub ChamaMdiPrincipal()
    
            MsgBox("Estou aqui")
    
            Dim formInicial As New mdiPrincipal
            formInicial.Show()
        End Sub
    
    End Class

    O que posso fazer para resolver?

    Obrigado

    quinta-feira, 29 de setembro de 2016 20:50
  • sexta-feira, 30 de setembro de 2016 20:26