PDA

View Full Version : [Vb '08]Array PictureBox


immakx
07-11-2008, 19:33
Per prima cosa, dato che è venerdì sera, buon Weekend a tutti,
poi,
la domanda da novizio di Vb.Net è la seguente: devo realizzare una tabella di picturebox ( 5x5 ) ed eseguo:

Dim MyBox(25) As PictureBox
Dim Cnt As Integer = 1
Dim Cnv As Integer = 1
For x As Integer = 1 To 25
MyBox(x) = PictureBox1 ' picturebox di riferimento
MyBox(x).Image = Image.FromFile(Application.StartupPath & "\Img\n" & x & ".mxp")
MyBox(x).Left = ((Cnt - 1) * 70) + 12
MyBox(x).Top = ((Cnv - 1) * 70) + 12
MyBox(x).Refresh()
Cnt = Cnt + 1
If Cnt = 6 Then
Cnt = 1
Cnv = Cnv + 1
End If
Next

Ma vedo che anche se le picturebox vengono generate giuste ognuna va a riscrivere tutti i valori delle precedenti e cosi alla fine mi trovo con tutte le picturebox uguali e sovrapposte all'ultima ...

cosa mi sto dimenticando ?

Su Msdn non sono riuscito a capirlo...

Grazie

||ElChE||88
07-11-2008, 21:13
Questo codice
MyBox(x) = PictureBox1 ' picturebox di riferimento
non crea una nuova PictureBox, ma soltanto una referenza a PictureBox1.
Prova:
MyBox(x) = New PictureBox

MarcoGG
07-11-2008, 21:56
1. Dim MyBox(25) As PictureBox :
Questo array, a meno che tu non l'abbia creato espressamente per un motivo, è superfluo. Ad ogni ciclo aggiungi semplicemente una nuova PictureBox e il risultato non cambia...

2. Manca un esplicito riferimento al contenitore per questi controlli. Male. Io ti consiglio un Panel, che sposti dove vuoi sulla Form... Ne hai solo vantaggi.
Sennò rischi che controlli aggiunti a runtime vadano a sovrapporsi a quelli già presenti sulla Form.

3. Non si eredita MAI chiamando un controllo già presente sulla Form ( il tuo PictureBox1 ). Semplicemente ti fai una classe che eredita da PictureBox e nel costruttore specifichi tutte le proprietà di default che deve avere.

In soldoni :

-> La classe :
Public Class MiaPictureBox

Inherits Windows.Forms.PictureBox

Public Sub New()

Me.Width = 160
Me.Height = 120
Me.BackColor = Color.Black
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
'...
'...

End Sub

End Class

-> Codice corretto ( senza stravolgere il tuo... ) :
Dim MyBox(25) As PictureBox
Dim Cnt As Integer = 1
Dim Cnv As Integer = 1
For x As Integer = 1 To 25
Dim PctBox As New MiaPictureBox
MyBox(x) = PctBox
MyBox(x).Image = Image.FromFile(Application.StartupPath & "\Img\n" & x & ".mxp")
Panel1.Controls.Add(MyBox(x))
MyBox(x).Left = ((Cnt - 1) * 70) + 12
MyBox(x).Top = ((Cnv - 1) * 70) + 12
MyBox(x).Refresh()
Cnt = Cnt + 1
If Cnt = 6 Then
Cnt = 1
Cnv = Cnv + 1
End If
Next

;)

immakx
08-11-2008, 09:31
In soldoni :
[..]

-> Codice corretto ( senza stravolgere il tuo... ) :



Grazie 1000 !!!
:cincin: