none
Impedir abertura de 2 formulários com o mesmo nome. RRS feed

  • Pergunta

  • Boa tarde caros Mestres.

    Estou com uma duvida e não achei nada semelhante na internet e nem no fórum.

    Eu gostaria de impedir a abertura de 2 formulário com o mesmo, eu passo o título do formulário através de uma variável, existe alguma forma de impedir que seja aberto 2x o mesmo formulário? No caso, o titulo do formulário seria o numero da pasta mais o nome do cliente. (Ex. 1000 - NOME DO CLIENTE).

    Há alguma forma de verificar todos os formulários abertos e caso esteja ele de foco ao formulário em questão?

    Eu não posso usar ShowDialog() porque eles abrem varias pastas para consulta ao mesmo tempo.

    Eu uso o seguinte código para abrir o formulário e aplicar o critério.

     Dim OBJ As New frmProcesso
            OBJ.StringPass = txtpasta.Text
            Me.Dispose()
            OBJ.Show()

    Agradeço desde já mestres.

    segunda-feira, 18 de março de 2019 18:49

Respostas

  • Olá, tenta o código...

    altera a linha abaixo do método AbrirPasta...

    Dim F As frmProcesso = DirectCast(OpenFormTitulo(PastaDigitada), frmProcesso)
    cria novo método...
    Private Function OpenFormTitulo(ByVal titulo As String) As Form
        For Each item As Form In Application.OpenForms
            If item.Text.StartsWith(titulo) Then Return item
        Next
    
        Return Nothing
    End Function


    Se ajudou, marque como resposta! Obrigado.


    segunda-feira, 8 de abril de 2019 21:12
  • Olá, tenta o código...

    Private Function OpenFormTitulo(ByVal titulo As String) As Form
        For Each item As Form In Application.OpenForms
            If item.Text.StartsWith(titulo) Then
               item.Focus()
               Return item
            End If
        Next
    
        Return Nothing
    End Function


    Se ajudou, marque como resposta! Obrigado.

    terça-feira, 9 de abril de 2019 15:57

Todas as Respostas

  • Olá, Gilberto! O título do formulário é passado através de uma variável, certo? Isso ocorre antes da abertura do formulário? Se sim, basta que uma outra variável armazene o nome do formulário aberto e sempre que um formulário for solicitado, essa variável deve ser checada para saber se a ação é permitida ou não.

    Fico no aguardo para saber se resolveu!


    “First do it, then do it right, then do it better.” - Addy Osmani

    terça-feira, 19 de março de 2019 13:15
  • Na verdade eu passo o nome do form no load do frmProcesso. Mas como eu faço pra "ler" o titulo do form?

    quarta-feira, 20 de março de 2019 14:48
  • Olá, se seu form principal for IsMdiContainer ou pode ajustar para verificar os formulários abertos...

    private void meuMenuItem_Click(object sender, EventArgs e)
    {
        MeuForm f = new MeuForm();
        show(f);
    }
    
    
    private void show(Form f)
    {
    	foreach (var fChild in this.MdiChildren)
    	{
    		if (fChild.Name == f.Name && fChild.Text == f.Text)
    		{
    			f.Close();
    			f.Dispose();
    			fChild.Show();
    			fChild.Focus();
    			return;
    		}
    	}
    	f.MdiParent = this;
    	f.Show();
    }
    

    Se ajudou, vote como útil! Obrigado.

    quarta-feira, 20 de março de 2019 18:16
  • o titulo do formulário não seria o nome do form?

    “First do it, then do it right, then do it better.” - Addy Osmani

    quarta-feira, 20 de março de 2019 18:36
  • Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim F As New Form2 F.Name = "Form2" F.Show() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim F As Form2 = DirectCast(Application.OpenForms("Form2"), Form2) If F IsNot Nothing Then MsgBox("Aberto") 'pode ser usado para fechar o aberto assim ho = F.close() Else MsgBox("Fechado") End If End Sub End Class

    sexta-feira, 22 de março de 2019 15:31
  • Deu certinho João Paulo porém no meu caso eu uso a pasta do cliente + o nome do cliente no titulo do formulário que eu preencho os dados no load do formulário atraves de algumas consultas, existe um jeito de pegar somente com o numero da pasta? Porque o unico valor que eu consigo pegar "fixo" antes da abertura do formulario é o numero da pasta (que é o critério para a consulta).


    Ex do título do form: 9999 - NOME DO CLIENTE

    Ps: Desculpem a demora, tive outros serviços para fazer


    sexta-feira, 5 de abril de 2019 12:17
  • Desculpe, não entendi o que vc procura.
    sábado, 6 de abril de 2019 20:20
  • Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim F As New Form2
            F.Name = "Form2"
            F.Show()
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim F As Form2 = DirectCast(Application.OpenForms("Form2"), Form2)
            If F IsNot Nothing Then
                MsgBox("Aberto")
                'pode ser usado para fechar o aberto assim ho = F.close()
            Else
                MsgBox("Fechado")
            End If
        End Sub
    End Class

    Altere o "Form2" e so uma referencia, coloque o nome da pasta. 

    f.name = "nome desejado "

       Dim F As Form2 = DirectCast(Application.OpenForms("nome desejado "), Form2)



    sábado, 6 de abril de 2019 20:24
  • Me desculpem, sei que não to sabendo explicar direito o que eu quero, vou tentar de outra forma.

    Meu código ta assim.

     Public Sub AbrirPasta()
            Dim PastaDigitada As String
            PastaDigitada = txtpasta.Text
            Dim F As frmProcesso = DirectCast(Application.OpenForms(PastaDigitada), frmProcesso)
    
            If F IsNot Nothing Then
                MsgBox("Pasta ja está aberta no PC")
                Exit Sub
            Else
                Using con As OleDbConnection = getConnection()
                    Dim cmd As OleDbCommand = Nothing
                    Try
                        con.Open()
                        Dim i As Integer
                        cmd = New OleDbCommand("Select Count(Pasta) From Processos WHERE Pasta='" & PastaDigitada & "'", con)
                        i = cmd.ExecuteScalar
                        If i = 0 Then
    
                            MsgBox("Pasta não encontrada")
                            Exit Sub
                        Else
                            ProcedimentoAbrir()
                        End If
                    Catch ex As Exception
                        MsgBox(ex.Message & Err.Number)
                    Finally
                        con.Close()
                    End Try
                End Using
            End If
    
        End Sub

    Entretanto, quando da o LOAD do frmProcesso que eu insiro o título com o numero da pasta e o nome do cliente separados por um hífen (Ex de titulo 10000 - NOME E SOBRENOME.) Essa consulta que existe no código é só pra ver se a pasta realmente existe antes de abrir o formulário pra não abrir em branco.

    Se tiver como fazer algo em que se tiver somente o numero da pasta no titulo seja o critério e o resto ser indiferente acho que daria certo. Eu consegui fazer do jeito que você explicou perfeitamente mas como eu não posso fazer a consulta e trazer o nome antes de carregar o form pra não ficar muito lento a abertura do formulário.

    segunda-feira, 8 de abril de 2019 20:14
  • Olá, tenta o código...

    altera a linha abaixo do método AbrirPasta...

    Dim F As frmProcesso = DirectCast(OpenFormTitulo(PastaDigitada), frmProcesso)
    cria novo método...
    Private Function OpenFormTitulo(ByVal titulo As String) As Form
        For Each item As Form In Application.OpenForms
            If item.Text.StartsWith(titulo) Then Return item
        Next
    
        Return Nothing
    End Function


    Se ajudou, marque como resposta! Obrigado.


    segunda-feira, 8 de abril de 2019 21:12
  • Cara, perfeito. Deu certinho muito obrigado a vocês.

    Sem querer abusar tem alguma forma de jogar o foco pro form em questão? direto na pasta selecionada?
    terça-feira, 9 de abril de 2019 15:29
  • Olá, tenta o código...

    Private Function OpenFormTitulo(ByVal titulo As String) As Form
        For Each item As Form In Application.OpenForms
            If item.Text.StartsWith(titulo) Then
               item.Focus()
               Return item
            End If
        Next
    
        Return Nothing
    End Function


    Se ajudou, marque como resposta! Obrigado.

    terça-feira, 9 de abril de 2019 15:57
  • Cara, ajudou demais, muito obrigado mesmo. Eu tenho varias formas de abrir esse formulário posso colocar ele como public function normalmente né?
    terça-feira, 9 de abril de 2019 16:44
  • Olá, ao meu ver sim... mas qq coisa posta aqui a dúvida...

    Se ajudou, marque como resposta! Obrigado.

    terça-feira, 9 de abril de 2019 19:02