Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Inserire le immagini nelle picturesBox
Forum - C# / VB.NET - Inserire le immagini nelle picturesBox - Pagina 2

Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 17:22
Mercoledì, 14/10/2015
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

  1. for (int immagine = 0; immagine < imageList1.Images.Count; immagine++)
  2.             {
  3.                 (Controls["pictureBox" + (2 + immagine).ToString()] as PictureBox).Image = imageList1.Images[immagine];
  4.             }


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?

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2306
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:11
Mercoledì, 14/10/2015
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

  1. for(int i = 0; i < Controls.Count; i++)



Basta modificare in

Codice sorgente - presumibilmente Plain Text

  1. for(int i = 0; i < Panel1.Controls.Count; i++)





Quindi il tutto diventa cosi

Codice sorgente - presumibilmente C# / VB.NET

  1. int conta = 0;
  2.             for (int i = 0; i < panel1.Controls.Count; i++)
  3.             {
  4.                 if (panel1.Controls[i].GetType() == typeof(PictureBox))
  5.                 {
  6.                     panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
  7.                     conta++;
  8.                 }
  9.             }




Ora.
Per quanto riguarda l'ordine scorretto.
ti basta invertire il ciclo.


Ecco il codice finale

Codice sorgente - presumibilmente C# / VB.NET

  1. int conta = 0;
  2.             for (int i = panel1.Controls.Count - 1; i > 0; i--)
  3.             {
  4.                 if (panel1.Controls[i].GetType() == typeof(PictureBox))
  5.                 {
  6.                     panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
  7.                     conta++;
  8.                 }
  9.             }



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 21:19
Mercoledì, 14/10/2015
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

  1. 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

  1. 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

  1. 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.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 21:23
Mercoledì, 14/10/2015
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.

PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 22:51
Mercoledì, 14/10/2015
Si volevo dire Eccezione e non Errore, non mi veniva la parola :)

Ho risolto cosi:

Codice sorgente - presumibilmente C++

  1. int conta = 0;
  2.             try
  3.             {
  4.                 for (int i = panel1.Controls.Count - 1; i >= 0; i--)
  5.                 {
  6.                     if (panel1.Controls[i].GetType() == typeof(PictureBox))
  7.                     {
  8.                         (panel1.Controls["pictureBox" + (2 + conta).ToString()]).BackgroundImage = imageList1.Images[conta];
  9.                         //panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
  10.                         conta++;
  11.                     }
  12.                 }
  13.             }
  14.             catch (Exception)
  15.             {
  16.  
  17.                 conta = 0;
  18.             }



va bene o c'è un modo più efficace?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:03
Mercoledì, 14/10/2015
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.

PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 0:26
Giovedì, 15/10/2015
Il codice cosi funziona anche senza gesterire l'eccezzione

Codice sorgente - presumibilmente C# / VB.NET

  1. int conta = 0;
  2.             for (int i = panel1.Controls.Count - 1; i >= 0; i--)
  3.             {
  4.                 if (panel1.Controls[i].GetType() == typeof(PictureBox))
  5.                 {
  6.                     panel1.Controls["pictureBox" + (2 + conta).ToString()].BackgroundImage = imageList1.Images[conta];
  7.                     conta++;
  8.                 }
  9.             }



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
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2306
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:55
Giovedì, 15/10/2015
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

  1. int conta = 0;
  2.             for (int i = panel1.Controls.Count - 1; i >= 0; i--)
  3.             {
  4.                 if (panel1.Controls[i].GetType() == typeof(PictureBox))
  5.                 {
  6.           //--->       panel1.Controls["pictureBox" + (2 + conta).ToString()].BackgroundImage = imageList1.Images[conta];
  7.                     conta++;
  8.                 }
  9.             }



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

  1. panel1.Controls["pictureBox" + (2 + conta).ToString()]  (diventa =  pictureBox2.BackgroundImage = Imagelist[2];



Questo frammento è completamente identico a quest'altro

Codice sorgente - presumibilmente Plain Text

  1. 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++

  1. List<Image> immagini = new List<Image>();
  2.  
  3.  
  4. //ToDO
  5. //Ciclo per aggiungere le risorse
  6. //Oppure manualmente
  7.  
  8.             int conta = 0;
  9.             for (int i = panel1.Controls.Count - 1; i >= 0; i--)
  10.             {
  11.                 if (panel1.Controls[i].GetType() == typeof(PictureBox))
  12.                 {
  13.                     panel1.Controls[i].BackgroundImage = immagini[conta];
  14.                     conta++;
  15.                 }
  16.             }




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


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo