none
Criar componente em tempo de execução RRS feed

  • Pergunta

  • Boa noite !

    Estou com uma dúvida que pode parecer besta, mas não consegui pensar num modo (ou até pesquisar) para o que desejo.

    No sistema que estou criando, o usuário terá um botão para criar um PictureBox com uma X imagem dentro.

    Então ele clica e em tempo real vai criar essa PictureBox com a imagem inserida.
    Até aí tudo bem. 

    Porém cada PictureBox criado, terá um evento de ação. Já consegui conselhar isso, só que o problema é quando tem 2 ou mais componentes criados.

    Dá conflito de ações, pois os dois tem o mesmo nome de objeto

    Preciso de uma forma que ele crie componentes com "nome sequencial". Tipo:

    PictureBox-A (E seus respectivos Handles)
    Se houver o A já, então cria o B.. e assim vai.

    Preciso disso, para que cada ação de cada picturebox seja destinado ao seu handle (embora ser a mesma ação, elas tem de agir independente).

    Alguém tem uma idéia? Posso criar funções para receber o nome do PictureBox ativo e etc, tal. Mas o maior problema é que se mantém o mesmo nome de objeto, não tem como eu filtrar qual está ativo.

    Obrigado!

    Att

    Alan
    quarta-feira, 8 de agosto de 2012 03:17

Respostas

  • Olá!

    Problema resolvido... segue abaixo:

    Public WithEvents PB As New PictureBox()
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            PB = New PictureBox()
    
            Me.Controls.Add(PB)
    
            AddHandler PB.MouseClick, AddressOf MyPicClicked_Click
    End Sub
    
    
    Private Sub MyPicClicked_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    
            Messagebox.show("Voce clicou no PB " & sender.Text.tostring)
    
    
    End Sub
    Muito obrigado Andre!

    Abç

    Alan
    • Marcado como Resposta Alan.Bernardes quarta-feira, 8 de agosto de 2012 13:52
    quarta-feira, 8 de agosto de 2012 13:52

Todas as Respostas

  • Alan,

    Se o código a ser executado no evento é o mesmo para todos os PictureBoxes, a maneira que você está fazendo é a correta (ligar todos os PictureBoxes criados com o mesmo handler)... A única coisa que você tem que se atentar é, dentro do event handler, ao invés de trabalhar com um PictureBox específico, utilize o parâmetro sender (fazendo um cast para PictureBox) e você saberá qual foi o PictureBox que disparou aquele handler...


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quarta-feira, 8 de agosto de 2012 11:08
    Moderador
  • Agradeço a Resposta Andre!

    Estou tentando e ainda não obtive um resultado esperado.. vou postar parte do código, e você me diz se está correto.
    O código está apenas em criar um objeto e exibir mensagem à ele. Só que como falei, quero que isso seja um evento para todos os objetos criados.

    Public WithEvents PB As New PictureBox()
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            PB = New PictureBox()
    
            Me.Controls.Add(PB)
    End Sub
    
    
    Private Sub MyPicClicked_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PB.MouseClick
    
            Messagebox.show("Voce clicou no PB " & sender.Text.tostring)
    
    
    End Sub

    Só que a ação sempre está ao PB, o objeto é instanciado para PB, e não para um novo objeto com um nome diferente, para assim eu ter a ação individual de cada.

    Alguma idéia?

    Obrigado!

    Alan
    quarta-feira, 8 de agosto de 2012 12:58
  • Olá!

    Problema resolvido... segue abaixo:

    Public WithEvents PB As New PictureBox()
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            PB = New PictureBox()
    
            Me.Controls.Add(PB)
    
            AddHandler PB.MouseClick, AddressOf MyPicClicked_Click
    End Sub
    
    
    Private Sub MyPicClicked_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    
            Messagebox.show("Voce clicou no PB " & sender.Text.tostring)
    
    
    End Sub
    Muito obrigado Andre!

    Abç

    Alan
    • Marcado como Resposta Alan.Bernardes quarta-feira, 8 de agosto de 2012 13:52
    quarta-feira, 8 de agosto de 2012 13:52