Usuário com melhor resposta
Impedir abertura de 2 formulários com o mesmo nome.

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.
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.
- Editado LeonardoBastos segunda-feira, 8 de abril de 2019 21:15
- Marcado como Resposta Gilberto Andre Junior terça-feira, 9 de abril de 2019 15:28
-
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.
- Marcado como Resposta Gilberto Andre Junior quarta-feira, 10 de abril de 2019 13:33
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
-
-
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.
-
-
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
-
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
-
-
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)
- Editado João Paulo [] sábado, 6 de abril de 2019 20:26
-
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.
-
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.
- Editado LeonardoBastos segunda-feira, 8 de abril de 2019 21:15
- Marcado como Resposta Gilberto Andre Junior terça-feira, 9 de abril de 2019 15:28
-
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?- Editado Gilberto Andre Junior terça-feira, 9 de abril de 2019 15:34
-
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.
- Marcado como Resposta Gilberto Andre Junior quarta-feira, 10 de abril de 2019 13:33
-
-