alexandremanowar
18/09/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?
Graymalkin
18/09/2006 - 20:50
A propriedade MdiChildren do MDIPai é justamente a coleção de filhas do mesmo.
Abraços,
Graymalkin
alexandremanowar
06/11/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
Graymalkin
07/11/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?

Graymalkin
alexandremanowar
04/12/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 declaredJá fiz outros teste mas também deu errado. Onde estou errando?
Graymalkin
04/12/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
alexandremanowar
05/12/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
Graymalkin
05/12/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
alexandremanowar
06/12/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!
Graymalkin
09/12/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
alexandremanowar
19/12/2006 - 09:48
Entendi e já tirei, realmente é sem propósito o for!
Graymalkin Valeu mais uma vez cara
at+
alexandremanowar
07/02/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
Graymalkin
07/02/2007 - 23:34
Tem algum Option Strict On lá no topo do código? Se tiver, retire ele.
Abraços,
Graymalkin
alexandremanowar
08/02/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?
Graymalkin
08/02/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
alexandremanowar
09/02/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
Graymalkin
10/02/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
alexandremanowar
10/02/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?
Graymalkin
10/02/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
alexandremanowar
12/02/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+
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor
clique aqui.