Oppure

Loading
18/08/12 21:32
lord_texter
Salve a tutti, dall'oggetto del post suppongo si capisca subito l atipologia di argomento sul quale vorrei chiedere informazioni.
Stò scrivendo un programma che crei un area di 800px^2 dividendola in aree da 25 px^2 usando picturebox (e fino a qui nessun problema). Il problema è che poi devo fare in modo che ogni volta che l'utente clicca su una delle picturebox create si verifichi un evento che colora la casella e che scrive un valore numerico in una variabile di tipo string.
Per aggiungere eventi alle picturebox create uso "AddHandler" che mi permette di gestire anche l'evento click delle textbox. La domanda è la seguente: come posso fare a fare in modo che ogni picturebox reagisca in modo differente al click?

Ecco il codice completo (Uso la versione del net framework 4.0)
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim a As Integer = 1
        Dim b As Integer = 1
        For i = 0 To 32 'creo 32 colonne
            For k = 0 To 32 'genero una colonna
                Dim img1 As New PictureBox()
                img1.Size = New Size(25, 25)
                img1.Location = New Point(b, a)
                img1.Name = "pic1" & 1
                Me.Controls.Add(img1)
                AddHandler img1.Click, AddressOf MyButton_Click
                img1.BackColor = Color.Black
                img1.BorderStyle = BorderStyle.Fixed3D
                a = a + 25
            Next
            b = b + 25
            a = 1
        Next
    End Sub

    Private Sub MyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
       
'questo è l'evento click per le picturebox generate
    End Sub



End Class
aaa
19/08/12 10:59
Uno sciame di API
Inserisci un codice separato per ogni picturebox
Es.
 Private Sub Pb1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb1.click
Messagebox.show("A")
'Mostra A
End Sub
Private Sub Pb2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb2.click
Messagebox.show("B")
'Mostra B
End Sub
Private Sub Pb3_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb3.click
Messagebox.show("C")
'Mostra C
End Sub

Per ora è l'unica cosa che mi viene in mente.
Ciao :D .
aaa
20/08/12 14:45
Dedalux
For i = 0 To 32
crea 33 colonne, non 32.

Dipende da cosa deve fare ogni picturebox. Se devono esegure tutti la stessa azione ma su target differenti potresti per esempio implementare una ruotine che accetta un parametro target, e farla gestire dall'evento click scegliendo il target in base al nome del controllo che la chiama. Se la situazione è diversa così sarà anche la soluzione. Devi spiegarti meglio.

Info: potrebbe esserti utile sapere che a = a + 25 si può riscrivere a += 25

P.S. sarebbe buona norma chiamare la variabile di tipo PictureBox "pbx" non img, in quanto potrebbe sembrare un controllo di tipo Image.
Inoltre io aggiungerei il controllo solo dopo aver terminato l'impostazione di tutte le sue proprietà.

P.P.S. non capisco perchè imposti il nome a pic1 & numero, non bastava pic & numero?
aaa
20/08/12 23:08
lord_texter
Grazie a tutti per le rapide risposte rapide. Avevo pensato anche io a scrivere un codice separato per ogni picturebox, ma speravo ci fosse qualche altro metodo più "elegante".

La scelta di chiamare le picturebox "pic1 & numero" è stata dettata dal fatto che mi è più comoda per una catalogazione delle picturebox all'interno del programma ;)

Grazie ancora
aaa
20/08/12 23:55
lord_texter
Postato originariamente da Uno sciame di API:

Inserisci un codice separato per ogni picturebox
Es.
 Private Sub Pb1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb1.click
Messagebox.show("A")
'Mostra A
End Sub
Private Sub Pb2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb2.click
Messagebox.show("B")
'Mostra B
End Sub
Private Sub Pb3_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb3.click
Messagebox.show("C")
'Mostra C
End Sub

Per ora è l'unica cosa che mi viene in mente.
Ciao :D .


Ho usato il metodo da te suggerito ma non funziona, anche se ho rimosso l'" AddHadler" e ho dichiarato ogni picturebox in questo modo
Dim WithEvents pic1, pic2, pic3, pic4 As PictureBox

ed ho poi creato eventi come quelli da te suggeriti
Private Sub pic1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pic1.click
Messagebox.show("A")
'Mostra A
End Sub


Non riscontro nessun errore durante il Debug, ma quando vado a cliccare sul controllo non si attiva l'evento
aaa
21/08/12 9:45
Uno sciame di API
Non sò dove può essere il problema, sei sicuro di aver inserito bene il codice?
Per esempio, il click su Pb1 esegue il codice contenuto nel sub "Pb1_click", il click su Pb2 quello nel sub "Pb2_click" e così via perchè alla prima riga di ogni sub, c'è scritto "Handles Pb1.click","Handles Pb2.click" ecc. e, se ho capito bene, hai eliminato quella parte o l'hai scritta uguale in tutti i sub. :)
Se così fosse, prova a scrivere "Handles Pb1.click" al sub "Pb1_click" , "Handles Pb2.click" al sub "Pb2_click" e così via.
Spero di esserti stato di aiuto! :k:
Ciao. :D
aaa
21/08/12 11:31
lord_texter
Si, il codice è inserito bene, ho notato facendo qualche prova che quanto vado a rinominare l'oggetto appena creato usando la seguente sintassi:
controllo_creato.Name = "nome del controllo"

non viene rinominato.

Ho provato a usare la stessa sintassi per cambiare nomi a oggi non creati in routine e in quel caso funziona.

com'è possibile? Ho cercato anche sull'msdn, ma non ho trovato soluzioni
aaa
21/08/12 18:57
Uno sciame di API
A me funziona benissimo invece!:yup:
Prova a scrivere:
MessageBox.Show(controllo_creato.Name)

E vedi il risultato. :)
Ciao.
aaa