Domanda:
vb.net istanza di oggetto..?
Davide
2012-11-01 08:04:18 UTC
ciao. Allora ho il seguente codice:
For i As Int16 = 0 To canedifici.Count - 1
Dim mypic As PictureBox = Panel4.Controls("Picturebox" & i.ToString)
mypic.Load(canedifici(i))
next
Mi spiegate per piacere perkè c***** mi da l'errore "Riferimento di un oggeto non impostato su un'istanza di oggetto?
l'errore dovrebbe essere mypic. lo scopo è quello di iterare dei picturebox in un panel e caricargli un'immagine.
il fatto è che se io faccio così:
for i as int16 = 0 to canedifici.count
panel4.controls.item(i).
dopo il punto non mi da la proprietà "Load".
mi spiegate come fare a iterare controlli e anche perkè la microsoft non ha messa questa proprietà nel controllo di iterazione. ogni volta che devo iterare per risparmiare spazio, l'istanza di oggetto non è impostata. grazie per le risposte...
Tre risposte:
Maurizio
2012-11-01 13:24:00 UTC
Hai due modi per scrivere il programma.

1) Tu hai inserito manualmente i picturebox con nomi del tipo PictureBox1, PictureBox2 ....

Per cercare PictureBox1 dalla collection dei controlli devi scrivere una funzione che itera sui controlli di tipo PictureBox e cerca il nome:



Function CercaPicBox(ByVal strName As String) As PictureBox

Dim myCtrl As Control

For Each myCtrl In Me.Controls

If (myCtrl.GetType() Is GetType(PictureBox)) Then

Dim picName As PictureBox = CType(myCtrl, PictureBox)

If picName.Name = strName Then

Return picName

End If

End If

Next

End Function



Con questa funzione l'assegnamento delle immagini avviene con un ciclo del tipo:



'Assegna le immagini a 4 controlli PictureBox inseriti manualmente nella form

'Con nomi PictureBox1, PictureBox2, PictureBox3, PictureBox4

For i = 1 To 4

Dim pic As New PictureBox

pic = CercaPicBox("PictureBox" & CStr(i).Trim)

pic.Load(pathImages + "EXAMPLE" & i & ".png")

Next



2) Oppure non inserisci nulla nella form e generi i controlli picturebox runtime, dal momento che la parola new non funziona per matrici di controlli, definisci prima una picturebox generica di nome pic con la parola chiave new e poi la assegni al vettore dei controlli, così potrai lavorare successivamente sugli elementi del vettore, ecco il listato:



Private Sub frmImgControl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Predispongo un vettore per contenere i 4 controlli immagine

Dim picControls(0 To 3) As PictureBox

Dim i As Integer

Dim xPos As Integer = 20

Dim pathImages As String = My.Computer.FileSystem. SpecialDirectories .MyPictures + "\"

For i = LBound(picControls) To UBound(picControls)

Dim pic As New PictureBox

pic.Left = xPos

xPos = xPos + 100

pic.Top = 100

pic.Width = 80

pic.Height = 80

pic.SizeMode = PictureBoxSizeMode.Zoom

Controls.Add(pic)

picControls(i) = pic

Next i



'caricamento immagini

For i = LBound(picControls) To UBound(picControls)

picControls(i).Load(pathImages + "EXAMPLE" & i & ".png")

Next



End Sub
BluNotte
2012-11-02 00:13:46 UTC
È un po' difficile aiutarti, visto che non capisco molto del pezzo che hai scritto.

Da quello che scrivi, presumibilmente, Panel4.Control("Picturebox" & i.ToString) restituisce Nothing, e quindi il programma lancia un'eccezione quando tenti di invocare Nothing.Load.



Probabilmente, hai messo delle PictureBox in un Panel, e vuoi caricare delle immagini, contenute in canedifici, all'interno delle PictureBox.



Panel.Controls restituisce un oggetto di tipo ControlCollection, che implementa IEnumerable. Quindi puoi fare:

For Each box in Panel4.Controls

...

Next



Ad ogni modo, per fare una cosa pulita, dovresti inserirti tutte le PictureBox in un tuo array, agire su quello.
Giorgio
2012-11-01 15:08:02 UTC
l'errore è abbastanza chiaro...ma sai come funziona la programmazione ad oggetti?

---------------------

si certo, devi instanziare l'oggetto

Dim mypic As PictureBox = new PictureBox ()

mypic = Panel4.Controls("Picturebox" & i.ToString)


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...