Entre para seguir isso  
Seguidores 0

Verificar Form Aberto

20 posts neste tópico

Postado · Denunciar post

E aí galera beleza!

Eu tenho um projeto com um MDIPAi e 2 form filhos.

No MDIPai tem uma opção no menu que eu quero que verifique, quando eu clicar nessa opção qual form esta aberto se é o fomr1 ou form2 ou se os dois estão fechados ou se os dois estão abertos, quero que ele exiba isso em um MsgBox.

Como eu faço isso? É possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

A propriedade MdiChildren do MDIPai é justamente a coleção de filhas do mesmo.

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

E aí Graymalkin beleza

Então cara já fiz várias tentivas usando essa opção MdiChildren para a opção no meu MDIPai indentificar qual form esta aberto mas nenhuma deu certo. Já tentei vários modos tipo esse:

If Form1.MdiChildren.Open Then

MsgBox("O Form1 esta verto",.....

else

MsgBox("O Form2 esta verto",.....

End If

Tentei outras formas mas todas deram erradas!

Porque? O que estou fazendo errado?

Preciso que quando eu clicar na opção do menu do meu MDIPai ele exiba em um MsgBox o nome do form que esta aberto no momento.

Mas acho que não entendi a forma que a opção MdiChildren funciona. Você poderia me explicar?

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

MdiChildren é uma coleção, portanto seus elementos podem ser acessados via índice (MdiChilren(0), MdiChildren(1), etc.) ou através de um For Each:

        For Each janela As Form In Me.MdiChildren
            MessageBox.Show(janela.Name)
        Next janela

Certo? ;)

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

E aí cara beleza!

Estou ralizando uns testes aqui e estou tendo o seguinte o problema. Usei o esquema que você me ensinou mas esta dando problema na hora de capturar a variável. Por exemplo.

Quando era um único form bastava eu fazer assim:

     Dim f As Nota = Me.ActiveMdiChild


        Dim g As Graphics = e.Graphics
        Dim mensagem As String
        Dim mensagem2 As String
        mensagem = f.operacao.Text
        mensagem2 = f.cfop.Text
....
Porém o meu valor agora pode vir de outro form então eu fiz assim:
 For Each janela As Form In Me.MdiChildren

            If janela.Name = "Nota" Then
                Dim f As Nota = Me.ActiveMdiChild
            Else
                Dim f As ConsultaNota = Me.ActiveMdiChild
            End If

        Next janela


        Dim g As Graphics = e.Graphics
        Dim mensagem As String
        Dim mensagem2 As String
        mensagem = f.operacao.Text
        mensagem2 = f.cfop.Text
....

Mas esta dando erro na seguinte linha:

mensagem = f.operacao.Text

mensagem2 = f.cfop.Text

esta dando a seguinte MSN:

Name 'f' is not declared

Já fiz outros teste mas também deu errado. Onde estou errando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Você está errando em declarar "f" dentro de um If. Em VB.NET, as instruções (If, For, While, Select Case e Try) também tem escopos próprios assim como as funções, rotinas, classes e módulos. Declare "f" fora da instrução (e com um tipo que possa acomodar qualquer um dos objetos) e você não terá problemas.

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

E aí Graymalkin beleza!

Como assim? Não entendi. Se eu tenho que usar um código que tome uma decisão de qual objeto ele vai usar eu deveria usar uma intrução de contro if????? Nesse caso o que eu posso fazer? Você podria me ajudar?

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Acho que com o código você vai entender melhor (observe onde declarei o "f" e onde usei ele):

        Dim f As Form

        For Each janela As Form In Me.MdiChildren

            If janela.Name = "Nota" Then
                f = Me.ActiveMdiChild
            Else
                f = Me.ActiveMdiChild
            End If

        Next janela


        Dim g As Graphics = e.Graphics
        Dim mensagem As String
        Dim mensagem2 As String
        mensagem = f.operacao.Text
        mensagem2 = f.cfop.Text
....

Sendo que não entendi muito bem qual é a desse If já que tanto nele quanto no Else o valor atribuído a "f" é o mesmo. Só o tipo que é diferente, porém em VB.NET isso não tem problema (devido ao recurso de late-binding).

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

hahaha

Cara o sono é algo triste mesmo. Olha como eu estava declarando

        For Each janela As Form In Me.MdiChildren

            If janela.Name = "Nota" Then
                f = Me.ActiveMdiChild
            Else
                f = Me.ActiveMdiChild
            End If

        Next janela

        Dim f As Form

        Dim g As Graphics = e.Graphics
        Dim mensagem As String
        Dim mensagem2 As String
        mensagem = f.operacao.Text
        mensagem2 = f.cfop.Text
Eu estava declarando o Dim f As Form depois das condições. E agora que você comentou esse if é totalmente inútil mesmo. A idéia era pegar o valor do form mas ele jpa esta no Me.ActiveMdiChild. Mas valeu a idéia, pelo menos entendi, se eu tivesse menos sono veria que estav declarando depois da estrutura. Cara valeu mesmo pela explocação, na verdade agora que você abriu meus olhos cheios de café deixei o código assim:
         For Each janela As Form In Me.MdiChildren

           
        Next janela

        Dim f As Form
         f = Me.ActiveMdiChild

        Dim g As Graphics = e.Graphics
        Dim mensagem As String
        Dim mensagem2 As String
        mensagem = f.operacao.Text
        mensagem2 = f.cfop.Text

Valeu Graymalkin!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Beleza, mas... pra quê aquele For Each no começo do código? Se você não faz nada dentro dele, não há necessidade dele estar ali, concorda?

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Entendi e já tirei, realmente é sem propósito o for!

Graymalkin Valeu mais uma vez cara

at+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado) · Denunciar post

E aí pessoal beleza!

Velhos problemas na cabeça, estava sem tempo de mexer no vb agora voltei a estudar e me deparei com um problema antigo o de validar o form que estiver aberto. Confome o Graymalkin me explicou acima bastava eu fazer isso:

Dim f As Form
f = Me.ActiveMdiChild

Dim g As Graphics = e.Graphics

Dim mensagem As String
Dim mensagem2 As String

mensagem = f.operacao.Text
mensagem2 = f.cfop.Text

Porém dessa forma ele não da erro nas 2 primeiras linhas que são:

Dim f As Form

f = Me.ActiveMdiChild

Mas da erro nessa operação f.operacao.Text e da a seguinte MSN de erro:

'operacao' is not a member of 'System.Windows.Forms.Form'

Aí quando eu mando executar o programa ele pergunta:

There were build errors. Would you like to continue and run the last successesful build? Se eu responder "no" ele volta ao código se eu responder "yes" ele executa o´a compilação antiga.

Pelo que entendi ele não esta encontrando o campo operacao.Text eu acho que esta envolvido com Me.ActiveMdiChild mas ainda não consegui resolver, já estou tentando achar o problemas mas se alguém poder me ajudar eu agradeço.

Valeu

Editado por alexandremanowar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Tem algum Option Strict On lá no topo do código? Se tiver, retire ele.

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

E aí Graymalkin beleza

Cara procurei e não tem esse opção no código cara! Estou tentando arrumar mas não funciona. O que você acha qie pode ser. Será que tenho que fazer dois blocos de código para funcionar ou seja um para cada form?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Então experimente fazer assim:

Dim f As NOMEDOSEUFORM
f = Me.ActiveMdiChild

Assim tem que dar certo. Outro jeito seria declarar f como Object.

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado) · Denunciar post

Já tentei dessa form colocando o nome do form porém ele da esse erro:

Não é possível converter um objeto do tipo 'projeto.meuform' no tipo 'projeto.meuform2'.

O código ficou exatemente assim:

Dim f As meuform
f = Me.ActiveMdiChild

Dim g As Graphics = e.Graphics

Dim mensagem As String
Dim mensagem2 As String

mensagem = f.operacao.Text
mensagem2 = f.cfop.Text
E já fiz declarando como objeto e deu essa MSN de erro: Membro público 'operacao' no tipo 'ConsultaNota' não encontrado. O código é esse:
Dim f As Object
f = Me.ActiveMdiChild

Dim g As Graphics = e.Graphics

Dim mensagem As String
Dim mensagem2 As String

mensagem = f.operacao.Text
mensagem2 = f.cfop.Text

E se eu comentar o mensagem = f.operacao.Text, ele passa o erro para a próxima linha.

Vou continuar tentando achar uma solução, se você achar me ajude por favor

Obrigado pela ajuda

Editado por alexandremanowar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Qual é realmente a sua janela filha? Ela é "meuform" ou "meuform2"? Se for a segunda, realmente você tem que colocar este segundo tipo.

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

E aí Graymalkin beleza

Então na verdade pode ser a janela filha "meuform" ou "meuform2. Porque é o seguinte a meuform é o form de preenchimento onde o cara preenche e armazena e pode também imprimir. O form 2 possui os mesmos campos porém para consulta o usuário pode consultar e também imprimir, então pensei já qie os dois forms tem os mesmo campos .Text vou usar um único código de impressão. Mas acho que tenho que fazer um código de impressão para cada.

O que você acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

Bom, se ambos os forms possuem as mesmas caixas de textos com *exatamente* os mesmos nomes, sim, você pode usar apenas um código. No caso, declare f como Object e as propriedades serão resolvidas em tempo de execução. Seria algo assim:

Dim f As Object
f = Me.ActiveMdiChild

Dim g As Graphics = e.Graphics

Dim mensagem As String
Dim mensagem2 As String

mensagem = f.operacao.Text
mensagem2 = f.cfop.Text

Veja aí se dá certo.

Abraços,

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado · Denunciar post

E aí Graymalkin beleza

Agora deu certo cara, declarei como objeto e funcionou, porpem tive que declarar os campos dos forms como publico porque estava tudo friend aí não rolava.

Cara valeu mais uma vez pela explicação.

Um abraço e at+

Compartilhar este post


Link para o post
Compartilhar em outros sites
Você está comentando como visitante. Se você tem uma conta, por favor, entre.
Responder
Entre para seguir isso  
Seguidores 0