Ir para o conteúdo
User LoL

[Resolvido] duvidas com forms mdi filho

Mensagens Recomendadas

User LoL

É o seguinte, eu tenho um form mdi pai, ele tem um controle, que cria um form mdi filho,com um textbox, e no mdi pai existe um botao para mandar o texto da area de transferencia para o textbox do form mdi filho que estiver ativo,mas nao estou conseguindo fazer isso,alguem pode me ajudar,a identificar o mdi filho ativo e colar o texto no textbox dele?

E outra coisa, o mdi filho pode ser movido pra todos os lados,entao as vezes ele some,quando é movido para as bordas,nao tem como bloquear as bordas do mdi pai para delimitar ate onde o mdi filho pode ser arrastado?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NunoDinis

É o seguinte, eu tenho um form mdi pai, ele tem um controle, que cria um form mdi filho,com um textbox, e no mdi pai existe um botao para mandar o texto da area de transferencia para o textbox do form mdi filho que estiver ativo,mas nao estou conseguindo fazer isso,alguem pode me ajudar,a identificar o mdi filho ativo e colar o texto no textbox dele?

Para transportares valores entre formulários tens que usar classes.


Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro.

ndsotware.org

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

poderia me dar um exemplo simples, de como incluir o texto "Teste" no textbox do mdi filho que estiver ativo? E sobre a questão de ''bloquear'' as bordas do mdi pai, como o faço?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NunoDinis

Tu queres, por exemplo, carregar no mdi pai e que os dados te apareçam no mdi filho ?

Isso das bordas já não faço ideia, mas certamente virão-te ajudar..


Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro.

ndsotware.org

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

Vou explicar melhor. Para mandar adicionar um texto em uma textbox, o código é assim

textbox.text = "Teste"

Acontece,que, o botão está no mdi pai, e o textbox no mdi filho, e pode ser aberto varios mdi filho ao mesmo tempo, por isso queria que o codigo identificasse qual mdi filho esta em foco,ativo, e mandasse o texto para o textbox desse mdi filho que estiver ativo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

Acontece,que, o botão está no mdi pai, e o textbox no mdi filho, e pode ser aberto varios mdi filho ao mesmo tempo, por isso queria que o codigo identificasse qual mdi filho esta em foco,ativo, e mandasse o texto para o textbox desse mdi filho que estiver ativo

boas

veja se é isto que você necessita:

no modulo crie uma variável publica, que será carregada com o valor que pretende obter na textbox, carregamento que terá que ser feito antes de criar os n forms, ao criar os form no evento «MouseEnter» coloque «me.textbox?.text = Variável».

para obter o nome do form que tem o foco nesse evento coloque o seguinte cod:

«msgbox"me.text"»

espero ter ajudado

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FasterProgm

É o seguinte, eu tenho um form mdi pai, ele tem um controle, que cria um form mdi filho,com um textbox, e no mdi pai existe um botao para mandar o texto da area de transferencia para o textbox do form mdi filho que estiver ativo,mas nao estou conseguindo fazer isso,alguem pode me ajudar,a identificar o mdi filho ativo e colar o texto no textbox dele?

E outra coisa, o mdi filho pode ser movido pra todos os lados,entao as vezes ele some,quando é movido para as bordas,nao tem como bloquear as bordas do mdi pai para delimitar ate onde o mdi filho pode ser arrastado?

Tenta com uma variável publica, deve chegar para isso

"Sintax é a seguinte:

Public nome_da_variável As tipo_de_dados_da_variável

exemplo

Public var as string"


“Algo só é impossível até que alguém duvide e resolva provar ao contrário.” Albert Einstein

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

Não funcionou de nenhuma forma, porque, como eu já havia explicado, podem ser abertos diversos forms2 identicos,usando esse codigo

Dim frm = New Form2
	frm = frm
	frm.Show()
	frm.MdiParent = Me

tentei assim e também nao funcionou, o texto não passa para o form2

My.Forms.Form2.RichTextBox1.Text = ("teste")

Editado por User LoL

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

Procurando pela internet,encontrei esse código que faz quase aquilo que eu queria.Esse código verifica qual mdi filho está ativo, independente de quantos sejam, e copia o texto do richtextbox selecionado,gostaria de adaptar para ao inves de copiar, ele colar um texto nessa richtextbox

'Verifica o mdi ativo.
    Dim activeChild As Form = Me.ActiveMdiChild
    ' If there is an active child form, find the active control, which
    ' in this example should be a RichTextBox.
    If (Not activeChild Is Nothing) Then
	    Dim theBox As RichTextBox = _
		  TryCast(activeChild.ActiveControl, RichTextBox)
	    If (Not theBox Is Nothing) Then
		    'Copia texto selecionado.
		    Clipboard.SetDataObject(theBox.SelectedText)
	    Else
		    MessageBox.Show("Nenhum texto em richtextbox foi selecionado")
	    End If
    End If

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

Não funcionou de nenhuma forma, porque, como eu já havia explicado, podem ser abertos diversos forms2 identicos,usando esse codigo

Dim frm = New Form2
	frm = frm
	frm.Show()
	frm.MdiParent = Me

tentei assim e também nao funcionou, o texto não passa para o form2

My.Forms.Form2.RichTextBox1.Text = ("teste")

no exemplo que te dei se passares o rato emcima do form ele carrega a textbox.

aqui se sabes que é o form2 e so teres a variável publica e depois no evento load do form2 carregar a texto box.

me.txtbox.text = VariavelPublica.

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

Resolvi que vou deixar os comandos nos proprios mdi filhos.

Agora, alguém pode me dizer como eu faço pra "bloquear" as bordas do mdi pai para que os mdi filho não ultrapasse determinada area,e consequentemente,fazendo uma scrollbar aparecer,oque se torna chato.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

faz mais uma tentativa com o teu cod, mas altera ("Teste") para variável publica, eu aqui não posso testar mas acredito que dê:

My.Forms.Form2.RichTextBox1.Text = VariaveloPublica

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

Eu decidi por deixar os controles no mdi filho,pois estava dando problema com os controles no mdi pai,tem que dar o foco para o mdi filho,e depois para a richtextbox,para ir o texto,é mais conveniente deixar no mdi filho. Agora so queria saber como e´que faço para "bloquear" as bordas do mdi pai

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

nenhuma sugestão? não teria alguma propriedade para atribuir ao mdi pai,para que os mdi filho não sumissem da tela,e ficassem sempre dentro do mdi pai?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Bem, há muitas formas de fazer isto.

A mais simples é quando se trata de algo rígido, que é o caso.

O que tu queres (ou querias, mas ficas a saber) é causar determinado efeito na janela activa.

Logo aqui, é certinho que tens de trabalhar com a propriedade ActiveMdiChild, que te vai dar acesso directo à Form que estiver activa, se alguma.

Pois bem, quando desenhas a form2 e estás a adicionar uma caixa de texto, ou lá o que seja, estás na verdade a oferecer mais membros ao tipo Form2. Se os membros forem públicos, sempre que faças referência à Form2, terás acesso a eles.

O primeiro passo é criar uma forma controlada de afectar o que pretendes no Form2.

Com o mais básico, enviar uma string para uma caixa de texto, basta definir o seguinte membro na form2:

    Public Sub InjectarTexto(Texto As String)
       TextBox1.Text = Texto
   End Sub

Na MDI parent, a única coisa que tens de fazer é indicar que a referência à ActiveMdiForm é na verdade do tipo Form2.

Ao fazê-lo, passas a ter acesso ao método que acabaste de definir. Algo tão simples como:

    If ActiveMdiChild IsNot Nothing Then
       Dim Alvo As Form2 = ActiveMdiChild
       Alvo.InjectarTexto("yey")
   End If

Já fazia o que tu querias. Fosse lá enviar "yey", despoletar uma acção ou lá o que queiras.

A segunda parte que referes também não é complicada, e passa um bocadinho por o que a lógica anterior obriga a passar, mas ao contrário.

A MDIParent não quer saber dos filhos. Melhor, não se preocupa com os eventos que são disparados nem tem consciência de onde andam nem o que fazem. Logo aqui, só há duas coisas que podes fazer: ou iteras activamente a coleção MDIChildren e verificas se andam para além dos limites do pai, ou fazes com que os próprios filhos verifiquem isso, deixando o pai sossegadinho.

Vou-te mostrar a opção não-activa, que compreende passar a lógica de verificação para os filhos.

No teu Form2 colocas o seguinte:

    Private Sub Form2_DragLeave(sender As Object, e As EventArgs) Handles Me.DragLeave
       Adaptar()
   End Sub

   Private Sub Form2_Locationchanged(sender As Object, e As EventArgs) Handles Me.Locationchanged
       'Adaptar() 'Podes activar este, mas a verificação básica abaixo fica um pouco "choppy"
   End Sub

   Private Sub Form2_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
       Adaptar()
   End Sub

   Private Sub Adaptar()
       Dim MDI As Form = Me.MdiParent
       If Me.Left > MDI.Width - Me.Width - 5 Then
           Me.Left = MDI.Width - Me.Width - 5
       End If
       If Me.Top > MDI.Height - Me.Height - 5 Then
           Me.Top = MDI.Height - Me.Height - 5
       End If
       If Me.Top < 5 Then Me.Top = 5
       If Me.Left < 5 Then Me.Left = 5
   End Sub

Resumidamente, cada filho verifica se está fora dos limites do pai sempre que termina um resize, um drag e até se quiseres, activamente com a troca de localização (fica um pouco choppy com essas verificações)

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

Funcionou certinho o código de manter os Mdi filhos dentro do Mdi pai, oque ocorreu é que, quando eu pressiono o botão de abrir um novo form2,cujo botão tem esse código:

Dim frm = New Form2
		    frm = frm
		    frm.Show()
		    frm.MdiParent = Me

Ocorre tal erro:

Referência de objeto não definida para uma instância de um objeto.

Na seguinte linha:

If Me.Left > MDI.Width - Me.Width - 5 Then

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

É provável que o Show esteja a disparar algum dos eventos.

Das duas uma:

Ou colocas :

If MDI Is Nothing Then Exit Sub

logo a seguir ao Dim MDI As Form = Me.MdiParent, ou chamas o Show só depois de defenires a parent:

Dim frm = New Form2
frm.MdiParent = Me
frm.Show()

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nelson Sousa

Se esse código é para posicionar o MDI em determinado local da tela eu sugiro utilizar forms centralizados. Assim você evitará problemas com as MSGBox que porventura vier a utilizar.


Um Abraço,

Nelson Sousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Não é sequer para colocar as childs em determinados lugares, quanto mais a container. Lê o código. Serve para garantir que as childs não provocam scroll na container.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
User LoL

Ainda está ocorrendo problemas, a parte de baixo do mdi filho ainda sai de dentro do form pai, e o form pai ainda esta criando Scrollbar :/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
metapandora

Ola Boolean User espero poder te ajudar com este codigo, o metodo mais pratico para controlar o form "filho", e recorrer a Module.

Não só server para form "filho" mas para muitos forms "filhos".

0 Module se chamara (controlposicaoforms).

Module controlposicaoforms


'controla as posicoes dos formularios no estado mdi
Function controposicao(ByVal formulario As Form, ByRef MdiParent As MDI) As Form
Try
With formulario
.MdiParent = MdiParent
.StartPosition = FormStartPosition.CenterScreen
.Show()
End With
Catch ex As Exception
End Try
Return formulario
End Function

End Module

Logo para chamar o Module, para realizar o evento

controlposicaoforms.controposicao(Form2, Me)

onde Form2 seria o form "filho"

em caso de erro ao chamar este evento pode colocar assim

controlposicaoforms.controposicao(Form2, MDI)

onde MDI seria o form "pai"

Dentro do ciclo with podes agregar mais funções desde onde sera a sua posicao em este caso coloquei, .StartPosition = FormStartPosition.CenterScreen mas pode ser alterado

recorda que o form pai tem que estar habitado para MDI espero ter ajudado. Se necessita de mais alguma coisa para resolver o seu problema pode contar comigo.

Abracos.

Editado por ribeiro55

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.