• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

Herdar Controlos - TabControl

26 mensagens neste tópico

Boas,

É o seguinte, tenho uma TabControl com uma TAB, a TAB1, e queria por código poder criar outra tab a TAB2 mas com os mesmos controlos e layout que a TAB1, será uma "cópia" da TAB1 mas que irei inserir novos dados.

É possível não é? Mas como?

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo isto?

Dim tbCopy As System.Windows.Forms.TabPage
tbCopy = TabControl1.TabPages(1)
TabControl1.TabPages.Add(tbCopy)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não deve ser isso, porque realmente cria uma nova tabpage mas fica sem controlos nenhuns (e limpa a tabpage original, ficando esta também sem controlos nenhuns)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se os controlos são os mesmos, porque não fazes crias uma subrotina para criar os controlos para o primeiro tab e depois essa subrotina para criar os controlos para o segundo.

É que depois tens de adicionar eventos tambem dinâmicamente e acho que desta forma dá mais trabalho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É que caso contrário tens de fazer um ciclo em todos os controlos e criar novos ... dá mais trabalho (digo eu) e repetes código desnecessário.

Tens de fazer algo como:

        Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                page.Controls.Add(tb)
            ElseIf TypeOf c Is Button Then
                Dim btn As New Button
                btn.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                btn.Text = c.Text
                page.Controls.Add(btn)
            End If
        Next

        ' etc para outros tipos de controlos que utilizas

        Me.TabControl1.TabPages.Add(page)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como disses-te consigo duplicar a minha TAB, funciona muito bem, agora estou com uma dúvida, como posso por um evento para essa nova tab, tipo se tiver um ListBox como posso usar o SelectedValueChanged ou Se tiver um TextBox usar o Keypress.

Se desse para por um evento que captasse de todos os tabs abertos e eu pudesse verificar em que TAB se deu o evento já servia...

Não sei é como por o Handles para apanhar os eventos de todas as tabs.

Usando um exemplo pratico, tenho um textbox em cada tab, e quero o evento Keypress

Se fosse só para uma tabpage seria assim:

Private Sub txtSendText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendText.KeyPress
'Código aqui
End Sub

Agora não sei como fazer isto para tabs criadas por código, se desse como disse acima para por o evento para este textbox em todas as tabs bastava identificar em que tab se deu o evento que já servia  :bored:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

quando crias a textbox ex:

AddHandler NomeDaTextBox, AddressOf txtSendText_KeyPress

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei como aplicar esse código Hellblazer

Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.name = "txtTESTE"
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                page.Controls.Add(tb)
           
            End If
        Next


        Me.TabControl1.TabPages.Add(page)

Como aplico aqui o

AddHandler NomeDaTextBox, AddressOf txtSendText_KeyPress

?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.name = "txtTESTE"
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                AddHandler tb.Click, AddressOf txtSendText_KeyPress
                page.Controls.Add(tb)
           
            End If
        Next


        Me.TabControl1.TabPages.Add(page)

Presumo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas dá erro no txtSendText_KeyPress diz que não foi declarado.

No Tab "original" existe um TextBox com o nome txtSendText

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

txtSendText_KeyPress é o nome da função lol podes chamar o que quizeres lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ahhh, lol  :wallbash:

Como já tinha apagado a função do keypress isso estava a dizer que não estava declarado...omg.

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:-[  Ora bem, já duplico a Tab e já tenho o evento a funcionar, mas não faço ideia Qual o controlo a fazer "disparar" o evento, existe alguma propriedade onde eu possa saber qual foi o controlo que fez o evento disparar, ou em que Tab ele está (basta-me mesmo saber o nome da Tab em que o controlo está)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa o sender para ver que disparou o evento.

Private Sub txtSendText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendText.KeyPress

End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa o sender para ver que disparou o evento.

Private Sub txtSendText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendText.KeyPress

End Sub

Foi a 1ª coisa que experimentei mas retorna-me o nome da Form e não do controlo neste caso frmMain, por isso é que perguntei :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deves ter feito alguma coisa mal  :)

Vê este exemplo para um botão:

    ' Cria um novo tab e copia os controlos
    Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNew.Click
        Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                page.Controls.Add(tb)
            ElseIf TypeOf c Is Button Then
                Dim btn As New Button
                btn.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                btn.Text = c.Text
                AddHandler btn.Click, AddressOf btnClick
                page.Controls.Add(btn)
            End If
        Next

        Me.TabControl1.TabPages.Add(page)
    End Sub


    ' Mostra qual o botão que foi pressionado
    Private Sub btnClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim b As Button = DirectCast(sender, Button)
        MessageBox.Show(b.Text)
    End Sub

Repara que os delegates são diferentes de controlo para controlo e no .NET até podes nem os definir (designam-se relaxed delegates), mas neste caso tens de especificar os correctos, porque precisas de saber quem o disparou.

Neste caso, para um botão, são: "ByVal sender As Object, ByVal e As System.EventArgs"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado, assim já consegui.

Para saber os delegates, em principio basta "ver" o código para um evento "normal" né?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para saber os delegates, em principio basta "ver" o código para um evento "normal" né?

Sim, é o mais fácil :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi se já resolveste o problema inicial ou não e se o fizeste, como o fizeste, mas fica aqui outra sugestão:

Podias fazer um user control com todos os controlos que precisas em cada tab, depois era só criares o controlo em runtime como fazes para qualquer outro tipo de controlo e adiciona-lo à respectiva tab.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim já estava resolvido, mas, queres "expandir" essa ideia?

Criar um User control com os controlos que preciso? Como assim?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:P Estou com outro problema, não percebo o que me está a falhar.

Se duplicar os controlos, tudo ok, mas se definir Anchor nos "novos" controlos eles ficam marados (isto se definir a anchor para right, porque Anchor em left não estraga.)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:P Estou com outro problema, não percebo o que me está a falhar.

Se duplicar os controlos, tudo ok, mas se definir Anchor nos "novos" controlos eles ficam marados (isto se definir a anchor para right, porque Anchor em left não estraga.)

Já te tinha alertado para isso!

Ou criar uma rotina que faça tudo dinamicamente, ou um user control, ou mesmo um form e depois inseres no painel.

Como estás a ver tens muitas opções melhores do que essa :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois mas nunca fiz nada do género, o que queres dizer com "rotina que faça dinámicamente" ou com "user control" ?

0

Partilhar esta mensagem


Link 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