lupetto77 (Normal User)
Pro
Messaggi: 75
Iscritto: 04/12/2011
|
Mi sono accorto che se le pictureBox si trovano nel panel il codice che usavo prima non funzionava e dava un errore, mentre se spostavo le pictureBox nel Form il codice funzionava benessimo.
Il codice era questo:
Codice sorgente - presumibilmente C# / VB.NET |
for (int immagine = 0; immagine < imageList1.Images.Count; immagine++)
{
(Controls["pictureBox" + (2 + immagine).ToString()] as PictureBox).Image = imageList1.Images[immagine];
}
|
E le immagini vengono caricate tutte in ordine corretto.
Con il tuo codice mi carica le immagini nelle pictureBox fuori il panel come ti ho scritto nel messaggio che ho postato prima.
Però se le sposto fuori carica tutte le immagini però in ordine sbagliato.
Però se si riesce a risolvere il problema del panel è meglio, ai consigli?
|
|
Thejuster (Admin)
Guru^2
Messaggi: 2306
Iscritto: 04/05/2008
|
La soluzione e proprio sotto al tuo naso lupetto.
Quel codice che hai mostrato, come detto prima.
Non ho detto che non funziona, ma è un metodo molto rozzo.
Identificare l'oggetto come tipo è una cosa molto più professionale e leggibile da parte
anche di altri programmatori. O anche da parte tua in un futuro.
Per quanto riguarda il tuo problema te lo risolvo in un secondo.
Anche speravo che riuscivi a capirlo da solo
Come il Form, anche il Panel è un contenitore di controlli giusto?
Entrambi sono dei Controls Containers.
quindi invece di fare
Codice sorgente - presumibilmente Plain Text |
for(int i = 0; i < Controls.Count; i++)
|
Basta modificare in
Codice sorgente - presumibilmente Plain Text |
for(int i = 0; i < Panel1.Controls.Count; i++)
|
Quindi il tutto diventa cosi
Codice sorgente - presumibilmente C# / VB.NET |
int conta = 0;
for (int i = 0; i < panel1.Controls.Count; i++)
{
if (panel1.Controls[i].GetType() == typeof(PictureBox))
{
panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
conta++;
}
}
|
Ora.
Per quanto riguarda l'ordine scorretto.
ti basta invertire il ciclo.
Ecco il codice finale
Codice sorgente - presumibilmente C# / VB.NET |
int conta = 0;
for (int i = panel1.Controls.Count - 1; i > 0; i--)
{
if (panel1.Controls[i].GetType() == typeof(PictureBox))
{
panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
conta++;
}
}
|
|
|
lupetto77 (Normal User)
Pro
Messaggi: 75
Iscritto: 04/12/2011
|
Hai ragione lo penso anch'io mi perdo sempre per le cose più facili, spero che ai pazienza sono ancora agli inizi.
Ho provato il tuo ultimo codice e mi da questo errore:
Eccezione non gestita di tipo 'System.ArgumentOutOfRangeException' in System.Windows.Forms.dll
Ulteriori informazioni: InvalidArgument=Valore di '9' non valido per 'index'.
su questa riga
Codice sorgente - presumibilmente Plain Text |
panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
|
se metto + 1 carica le immagini, ma una delle pictureBox non viene caricata.
stessa cosa cosi:
Codice sorgente - presumibilmente Plain Text |
panel1.Controls[i].BackgroundImage = imageList1.Images[conta];
|
ma si può risolvere in questo modo, mettendo >= per farle caricare tutte, cosi:
Codice sorgente - presumibilmente C# / VB.NET |
for (int i = panel1.Controls.Count - 1; i >= 0; i--)
|
ma l'ordine è sempre sbagliato.
Scusa ancora per l'ignoranza e grazie ancora infinite per la pazienza.
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Perchè non usi un debugger? E' lì.... comodo... che funziona benissimo..... basta solo premere a lato di una riga di codice e premere il tastino verde a forma di freccia in alto centralmente. Ti renderai conto molto velocemente del problema!
Quell'ECCEZIONE (non gestita) non ERRORE!!!! serve per dirti: stai cercando di accedere in lettura, o in scrittura a della memoria che non fa parte della memoria dedicata alla struttura in esame.
|
|
lupetto77 (Normal User)
Pro
Messaggi: 75
Iscritto: 04/12/2011
|
Si volevo dire Eccezione e non Errore, non mi veniva la parola
Ho risolto cosi:
Codice sorgente - presumibilmente C++ |
int conta = 0; try { for (int i = panel1.Controls.Count - 1; i >= 0; i--) { if (panel1.Controls[i].GetType() == typeof(PictureBox)) { (panel1.Controls["pictureBox" + (2 + conta).ToString()]).BackgroundImage = imageList1.Images[conta]; //panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2]; conta++; } } } catch (Exception) { conta = 0; }
|
va bene o c'è un modo più efficace?
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Quella eccezione va evitata, non gestita. Devi trovare l'errore logica che porta all'accesso di un indice fuori array. Se l'array è lungo 10 elementi il primo indice è 0, e l'ultimo 9. Quella eccezione è perchè stai cercando di accedere ad un array di X elementi con indice minore di 0 o MAGGIORE O UGUALE a x. Quindi c'è un errore logico, e lo devi trovare.
|
|
lupetto77 (Normal User)
Pro
Messaggi: 75
Iscritto: 04/12/2011
|
Il codice cosi funziona anche senza gesterire l'eccezzione
Codice sorgente - presumibilmente C# / VB.NET |
int conta = 0;
for (int i = panel1.Controls.Count - 1; i >= 0; i--)
{
if (panel1.Controls[i].GetType() == typeof(PictureBox))
{
panel1.Controls["pictureBox" + (2 + conta).ToString()].BackgroundImage = imageList1.Images[conta];
conta++;
}
}
|
Puoi dirmi se va bene come è scritto o se migliorabile puoi dirmi come?
Grazie ancora.
Ultima modifica effettuata da lupetto77 il 15/10/2015 alle 0:28 |
|
Thejuster (Admin)
Guru^2
Messaggi: 2306
Iscritto: 04/05/2008
|
Lupetto, principalmente siamo qui per tentar di far capire dove si sbaglia
e non per dare a chi chiede codice pronto come una libreria.
Darkjuster ti ha dato un ottimo consiglio
Come me, che ti ho scritto il codice corretto.
questo qui.
Codice sorgente - presumibilmente C# / VB.NET |
int conta = 0;
for (int i = panel1.Controls.Count - 1; i >= 0; i--)
{
if (panel1.Controls[i].GetType() == typeof(PictureBox))
{
//---> panel1.Controls["pictureBox" + (2 + conta).ToString()].BackgroundImage = imageList1.Images[conta];
conta++;
}
}
|
E' completamente inutile.
perché il condizionale sopra, effettua già la verifica.
Se l'oggetto preso in considerazione è una Picturebox,
al controllo và assegnata l'immagine di background dalla ImageList.
invece sotto hai ripetuto la stessa funzione fatta dal condizionale.
Vuoi sapere cosa c'è di differente questo codice dal mio?
Codice sorgente - presumibilmente Plain Text |
panel1.Controls["pictureBox" + (2 + conta).ToString()] (diventa = pictureBox2.BackgroundImage = Imagelist[2];
|
Questo frammento è completamente identico a quest'altro
Codice sorgente - presumibilmente Plain Text |
panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
|
Per cui mi sembra una baggianata scusami...
Che quello funziona e questo no. Impossibile. Il procedimento è lo stesso, cambia il metodo di stesura.
Quello sopra, agisce trovando il nome esatto del controllo
Quello sotto, agisce in ordine partendo dal primo controllo trovato.
entrambi assegnano a tutte le picturebox l'immagine di background.
Fossi in tè, eviterei di usare una ImageList per queste operazioni.
Ma utilizzerei meglio una Lista di Immagini. cosa molto diversa.
Codice sorgente - presumibilmente C++ |
List<Image> immagini = new List<Image>(); //ToDO //Ciclo per aggiungere le risorse //Oppure manualmente int conta = 0; for (int i = panel1.Controls.Count - 1; i >= 0; i--) { if (panel1.Controls[i].GetType() == typeof(PictureBox)) { panel1.Controls[i].BackgroundImage = immagini[conta]; conta++; } }
|
Personalmente, userei questo metodo per diversi motivi.
1) Una imageList ha delle misure obbligate per ogni immagine
2) Una imageList supporta una qualità grafica più bassa
3) Le imageList vengono associate a dei controlli e non usate come semplici liste.
Ti posso garantire che ti sto dando consigli preziosi.
Poi, ovviamente ognuno agisce a suo modo.
Ultima modifica effettuata da Thejuster il 15/10/2015 alle 8:56
|
|