Ir para conteúdo


Foto

Verificar Form Aberto


19 respostas neste tópico

#1 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 18 setembro 2006 - 16:13

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?




Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#2 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 18 setembro 2006 - 20:50

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

Abraços,

Graymalkin

#3 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 06 novembro 2006 - 21:29

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

Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#4 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 07 novembro 2006 - 09:48

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

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


Certo? wink.gif

Graymalkin

#5 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 04 dezembro 2006 - 21:46

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:

CODE

     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:

CODE

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?



Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#6 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 04 dezembro 2006 - 22:20

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

#7 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 05 dezembro 2006 - 09:38

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
Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#8 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 05 dezembro 2006 - 23:05

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

CODE
        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

#9 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 06 dezembro 2006 - 08:25

hahaha

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

CODE

        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:

CODE

         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!
Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#10 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 09 dezembro 2006 - 14:50

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

#11 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 19 dezembro 2006 - 09:48

Entendi e já tirei, realmente é sem propósito o for!
Graymalkin Valeu mais uma vez cara

at+

Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#12 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 07 fevereiro 2007 - 12:30

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:
CODE

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, 07 fevereiro 2007 - 12:46 .

Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#13 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 07 fevereiro 2007 - 23:34

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

Abraços,

Graymalkin

#14 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 08 fevereiro 2007 - 13:16

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?
Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#15 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 08 fevereiro 2007 - 22:14

Então experimente fazer assim:

CODE
Dim f As NOMEDOSEUFORM
f = Me.ActiveMdiChild


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

Abraços,

Graymalkin

#16 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 09 fevereiro 2007 - 08:06

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:
CODE

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:
CODE

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, 09 fevereiro 2007 - 08:07 .

Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#17 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 10 fevereiro 2007 - 09:32

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

#18 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 10 fevereiro 2007 - 13:09

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?
Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com

#19 Graymalkin

Graymalkin

    www.gsxbr.net

  • Veteranos
  • 8.167 posts
  • Gender:Male
  • Location:Belford Roxo - RJ

Postado 10 fevereiro 2007 - 13:41

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:

CODE
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

#20 alexandremanowar

alexandremanowar
  • Membros
  • 655 posts
  • Gender:Male
  • Location:São Paulo
  • Interests:Aprimorar meus conhecimentos em desenvolvimento e estar atualizado constantemente.

Postado 12 fevereiro 2007 - 16:35

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+
Programar é arte. E arte é apenas para cultos
www.alexandreccarmo.com



Responder



  


0 usuário(s) está(ão) lendo este tópico

0 membros, 0 visitantes, 0 membros anônimos