Jump to content

Recommended Posts

Posted

Boas pessoal!

Tenho o seguinte codigo para a criaçao de uma pictureBox.

newPictureBox.Location = New Drawing.Point(firstpoint(0) + 100, firstpoint(1))
            firstpoint(0) = newPictureBox.Location.X
            firstpoint(1) = newPictureBox.Location.Y
            newPictureBox.Visible = True
            newPictureBox.Size = New System.Drawing.Size(126, 97)
            newPictureBox.BackColor = Color.Blue
            newPictureBox.Enabled = True
            'add control to form


            Controls.Add(Me.newPictureBox)

Eu chamo o evento quando clico num botao. O problema e que ele realmente mostra uma nova picturebox mas se voltar a clicar ele ira mostrar outra na posiçao que escolho. Mas o que eu queria mesmo era que cada vez que clica-se no butao ele cria-se as picturebox no codigo sem depois a apagar.

Alguem tem ideia de como posso ultrapassar este problema?

Posted

Não as adiciones ao container....

Explica lá melhor

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"

Posted

Não as adiciones ao container....

Explica lá melhor

Nao as adiciono onde? Nao percebi.

Vejamos eu tenho um botao. Ao clicar nele ele executa esse codigo de modo a que seja criada a picturebox. esse codigo ja a cria mas se eu voltar a clicar no mesmo de forma a puder adicionar outra a que foi criada anteriormente desaparece.

Consegui-me explicar melhor?

Posted

Se percebi bem...

Isso é porque as estás a criar no mesmo local.... Tens que ter uma variável de contador que para ires incrementando a location dos novos objectos...

PS - Não deveria desaparecer..... mas sim..aparecer de novo....por isso pode se outra coisa qualquer que nao me está a ocorrer...

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Posted

Se percebi bem...

Isso é porque as estás a criar no mesmo local.... Tens que ter uma variável de contador que para ires incrementando a location dos novos objectos...

PS - Não deveria desaparecer..... mas sim..aparecer de novo....por isso pode se outra coisa qualquer que nao me está a ocorrer...

Ja tinha feito isso que me recomendas-te mas tambem nao fez diferença. a anterior foi sempre "eliminada", desaparece...

Posted

Tens de criar uma instância da picturebox.

Se newPictureBox for referência sempre à mesma PictureBox, chapéu não é?

Tens de criar sempre uma nova instância.

Mete o teu código completo e não o exemplo que tiraste do stack exchange ou coisa parecida.

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"

Posted

Experimenta correr isso desse lado..

 For j = 0 To 5
            Dim pctbox As New PictureBox 'Instancia nova picbox
            Dim i As Integer 'guarda o numero de iteracoes para alterar a location
            pctbox.Location = New Drawing.Point(20, i * 30 - 30) 'mexes nestes valores e nos de baixo para desenhares como queres
            pctbox.Visible = True
            pctbox.Size = New System.Drawing.Size(100, 20)
            pctbox.BackColor = Color.Blue
            pctbox.Enabled = True
            Controls.Add(pctbox)
            i += 1
        Next

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Posted

Experimenta correr isso desse lado..

 For j = 0 To 5
            Dim pctbox As New PictureBox 'Instancia nova picbox
            Dim i As Integer 'guarda o numero de iteracoes para alterar a location
            pctbox.Location = New Drawing.Point(20, i * 30 - 30) 'mexes nestes valores e nos de baixo para desenhares como queres
            pctbox.Visible = True
            pctbox.Size = New System.Drawing.Size(100, 20)
            pctbox.BackColor = Color.Blue
            pctbox.Enabled = True
            Controls.Add(pctbox)
            i += 1
        Next

Ja percebi onde esta o problema. Tinha a variavel de nova picturebox declarada num modulo. e nao fazia tipo picturee=new picturebox.

E com os erros que se apreende. e Muito obrigada mesmo.

Gostaria de fazer outra pergunta se nao se importassem, quando atraves da toolbox colocamos uma picturebox  no form e clicamos sobre ela, vamos para o codigo, cujo evento(nao sei se e assim que se chama mas se nao for corrijam-me sff)

Private Sub PictureBox2_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox2.Click

    End Sub

o que eu queria fazer era com o codigo defenir os nomes das picturesbox que crio e depois fazer esse evento(código anterior), ou seja a cada click nas pictures que crio atraves do codigo, devo por exemplo enviar a msgbox(). so para exemplo pois o que quero fazer e permitir que todas as picturesbox que sejam criadas tenham a possibilidade de fazer um drag and drop.

Sera isto possivel?

Posted

tu até podes adicionar um handler em runtime... mas julgo que te vai apontar sempre para o mesmo lado...

Tal como te disse num posta anterior, penso que a melhor solução é com a criação de um user control para esse efeito...

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Posted

tu até podes adicionar um handler em runtime... mas julgo que te vai apontar sempre para o mesmo lado...

Tal como te disse num posta anterior, penso que a melhor solução é com a criação de um user control para esse efeito...

Ja estive a ver aquele link que publicas-te na outra publicaçao.

No entanto nao consegui perceber como e que eu faço aquilo. Mas se souberes de mais algum site sobre isso que aches util publica, pois vou ter que analisar varios para ver se percebo como fazer...

Posted

Este código fica no botão para criar as pictboxes     

 For j = 0 To 5
            Dim pctbox As New PictureBox
            Dim i As Integer
            pctbox.Name = "picbox" & i
            pctbox.Tag = i
            pctbox.Location = New Drawing.Point(20, i * 30 - 30)
            pctbox.Visible = True
            pctbox.Size = New System.Drawing.Size(100, 20)
            pctbox.BackColor = Color.Blue
            pctbox.Enabled = True
            Controls.Add(pctbox)
            AddHandler pctbox.Click, AddressOf FazQualquercoisa
            i += 1
        Next

E este fica logo após...

    Private Sub FazQualquercoisa(ByVal Sender As Object, ByVal e As System.EventArgs)
        Select Case Sender.tag
            Case 1
                MsgBox("Faz qualquer coisa para a box1")
            Case 2
                MsgBox("Faz qualquer coisa para a box2")
            Case Else
                MsgBox("Faz aquilo que quiseres...")
        End Select
    End Sub

Agora já podes clicar em cima de cada uma delas.....e ver o resultado...

Mas pelo que investiguei, a pictbox não tem a propriedade allowdrag and drop, pelo qque percebi..não vai ser simples fazer aquilo que queres...

Existem alguns truques...mas são isso mesmo.... mas é possível...

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Posted

Estive a pensar mais um bocado..e pensei..pensei... Afinal é possível....

Este exemplo conjugado com o anterior (tratamento de acordo com a tag) deve cobrir todas as situações que queres

Então no botão que carregas as boxes colocas este código...

   For j = 0 To 5 'coloquei esta iteracção para representar várias....
            Dim pctbox As New PictureBox
            Dim i As Integer
            pctbox.Name = "picbox" & i
            pctbox.Tag = i
            pctbox.SizeMode = PictureBoxSizeMode.Zoom
            pctbox.AllowDrop = True
            pctbox.Location = New Drawing.Point(100, i * 70)
            pctbox.Visible = True
            pctbox.Size = New System.Drawing.Size(60, 60)
            pctbox.Enabled = True
            pctbox.BorderStyle = BorderStyle.FixedSingle
            AddHandler pctbox.DragOver, AddressOf enterPic
            AddHandler pctbox.DragEnter, AddressOf enterPic
            AddHandler pctbox.DragDrop, AddressOf TrataDrop
            Controls.Add(pctbox)
            i += 1
        Next

E depois a seguir colas isto.....

    ''' <summary>
    ''' Trata de altera ro formato do rato quando tem conteudo
    ''' </summary>
    ''' <param name="Sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub enterPic(ByVal Sender As Object, ByVal e As DragEventArgs)
        If ((e.Data.GetDataPresent(DataFormats.FileDrop)) Or e.Data.GetDataPresent("FileGroupDescriptor")) Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub
    ''' <summary>
    ''' Ao largar o rato vai verificar se tem data e se tiver faz qualquer coisa...neste caso... vai representar a imagem que escolheste
    ''' </summary>
    ''' <param name="Sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TrataDrop(ByVal Sender As Object, ByVal e As DragEventArgs)
        Dim strFile() As String
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            strFile = e.Data.GetData(DataFormats.FileDrop.ToString)
            If strFile.Length = 1 Then
                MsgBox(strFile(0))
                Sender.Image = System.Drawing.Image.FromFile(strFile(0))
            Else
                MsgBox("Tem mais que um ficheiro arrastado")
            End If
        End If
    End Sub

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Posted

Estive a pensar mais um bocado..e pensei..pensei... Afinal é possível....

Este exemplo conjugado com o anterior (tratamento de acordo com a tag) deve cobrir todas as situações que queres

Então no botão que carregas as boxes colocas este código...

   For j = 0 To 5 'coloquei esta iteracção para representar várias....
            Dim pctbox As New PictureBox
            Dim i As Integer
            pctbox.Name = "picbox" & i
            pctbox.Tag = i
            pctbox.SizeMode = PictureBoxSizeMode.Zoom
            pctbox.AllowDrop = True
            pctbox.Location = New Drawing.Point(100, i * 70)
            pctbox.Visible = True
            pctbox.Size = New System.Drawing.Size(60, 60)
            pctbox.Enabled = True
            pctbox.BorderStyle = BorderStyle.FixedSingle
            AddHandler pctbox.DragOver, AddressOf enterPic
            AddHandler pctbox.DragEnter, AddressOf enterPic
            AddHandler pctbox.DragDrop, AddressOf TrataDrop
            Controls.Add(pctbox)
            i += 1
        Next

E depois a seguir colas isto.....

    ''' <summary>
    ''' Trata de altera ro formato do rato quando tem conteudo
    ''' </summary>
    ''' <param name="Sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub enterPic(ByVal Sender As Object, ByVal e As DragEventArgs)
        If ((e.Data.GetDataPresent(DataFormats.FileDrop)) Or e.Data.GetDataPresent("FileGroupDescriptor")) Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub
    ''' <summary>
    ''' Ao largar o rato vai verificar se tem data e se tiver faz qualquer coisa...neste caso... vai representar a imagem que escolheste
    ''' </summary>
    ''' <param name="Sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TrataDrop(ByVal Sender As Object, ByVal e As DragEventArgs)
        Dim strFile() As String
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            strFile = e.Data.GetData(DataFormats.FileDrop.ToString)
            If strFile.Length = 1 Then
                MsgBox(strFile(0))
                Sender.Image = System.Drawing.Image.FromFile(strFile(0))
            Else
                MsgBox("Tem mais que um ficheiro arrastado")
            End If
        End If
    End Sub

Caro José so hoje consegui voltar ao "trabalho"

Verifiquei que o seu código funciona na perfeição.

Aproveito para colocar outra pergunta que me pode ser util!

Imaginemos que tenho uma pic com o tamanho de 100,97, e a loclizaçao no eixo x e no ponto 10(ex)

Eu crio uma label. ao criar essa label como a posso colocar de forma a que ela fique centrada em relaçao a picturebox?

Ja tentei isto:

newlabel.Location = New Drawing.Point((pctbox.Size.Width / 2) - (lennomepic), pctbox.Location.Y + pctbox.Size.Height + 15)

sendo o lennomepic o tamanho do nome que irei inserir na label. Esse mesmo nome e inserido numa inputbox...

Ele centra o mesmo quando e so uma letra mas se forem varias ja nao fica centrado. Como poderei resolver esta situaçao?

Ja agora aquilo que ele faria era se o nome inserido fosse maior que a picturebox, deveria introduzir o resto do texto em novas linhas de forma a que o mesmo nao ultrapassa-se a picture...

Tem alguma ideia de como fazer?

Posted

Estive a pensar mais um bocado..e pensei..pensei... Afinal é possível....

Este exemplo conjugado com o anterior (tratamento de acordo com a tag) deve cobrir todas as situações que queres

Então no botão que carregas as boxes colocas este código...

   For j = 0 To 5 'coloquei esta iteracção para representar várias....
            Dim pctbox As New PictureBox
            Dim i As Integer
            pctbox.Name = "picbox" & i
            pctbox.Tag = i
            pctbox.SizeMode = PictureBoxSizeMode.Zoom
            pctbox.AllowDrop = True
            pctbox.Location = New Drawing.Point(100, i * 70)
            pctbox.Visible = True
            pctbox.Size = New System.Drawing.Size(60, 60)
            pctbox.Enabled = True
            pctbox.BorderStyle = BorderStyle.FixedSingle
            AddHandler pctbox.DragOver, AddressOf enterPic
            AddHandler pctbox.DragEnter, AddressOf enterPic
            AddHandler pctbox.DragDrop, AddressOf TrataDrop
            Controls.Add(pctbox)
            i += 1
        Next

E depois a seguir colas isto.....

    ''' <summary>
    ''' Trata de altera ro formato do rato quando tem conteudo
    ''' </summary>
    ''' <param name="Sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub enterPic(ByVal Sender As Object, ByVal e As DragEventArgs)
        If ((e.Data.GetDataPresent(DataFormats.FileDrop)) Or e.Data.GetDataPresent("FileGroupDescriptor")) Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub
    ''' <summary>
    ''' Ao largar o rato vai verificar se tem data e se tiver faz qualquer coisa...neste caso... vai representar a imagem que escolheste
    ''' </summary>
    ''' <param name="Sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TrataDrop(ByVal Sender As Object, ByVal e As DragEventArgs)
        Dim strFile() As String
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            strFile = e.Data.GetData(DataFormats.FileDrop.ToString)
            If strFile.Length = 1 Then
                MsgBox(strFile(0))
                Sender.Image = System.Drawing.Image.FromFile(strFile(0))
            Else
                MsgBox("Tem mais que um ficheiro arrastado")
            End If
        End If
    End Sub

Resolvido!!!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.