Array di 3600 PictureBox

Stato
Discussione chiusa ad ulteriori risposte.

xXStephXx

Utente Electrum
28 Aprile 2008
389
16
1
125
Salve.... Ancora una volta conto sul vostro aiuto.
In pratica ho creato un array bidimensionale contenente 60X60 pictureBox. Il mio progetto è di mettere queste pictureBox tutte allineate disponendole su 60 file e su 60 colonne... Hanno tutte 2x2 di size...
Fin qui non ci sono problemi ecco il codice:
Codice:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Mappa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        PictureBox[,] pb = new PictureBox[60,60];
        private void Form1_Load(object sender, EventArgs e)
        {

            for (int x = 0; x < 60; x++)
            {
                for (int y = 0; y < 60; y++)
                {
                    pb[x, y] = new PictureBox();
                    pb[x, y].Size = new Size(2, 2);
                    pb[x, y].BackColor = Color.White;
                    pb[x, y].Location = new Point((x * 2)+10, (y * 2)+10);
                    Controls.Add(pb[x, y]);
                 }
             }
}
}
}

Bene, adesso, create tutte le 3600 pictureBox a scacchiera 60*60, vorrei creare un evento per ciascuna, in modo che quando ci passo sopra il mouse, si attivi il codice:
pb[clickedX, clickedY].BackColor= Color.Black;

Questa istruzione l'ho creata mettendo un timer, che controlli la posizione del mouse xD, però per ottenere ciò che volevo fare io, dovrei fare in modo che si crei un evento per ogni pb del tipo
private void pb_Click(...);

ovviamente non ne posso creare manualmente 3600...
Chi mi sa aiutare?
Voglio sapere se è possibile crearne uno solo, a cui passare con un ref la pictureBox interessata
 
in visualbasic.net quando dichiaro una variabile basta che scrivo withevents (ma non ricordo se questo caso andrebbe bene, ipotizzando che si possa fare, perchè dovrebbero essere globali della class form).
Lasciando perdere questa premessa, c'è un'istruzione che si chiama addHandler, che permette di agganciare una funzione ad un evento di un oggetto.

Dichiari una funzione (il tipo deve essere consono a quello che si aspetta l'evento, cioè lo stesso numero e tipo di parametri) e per ogni elemento dell'array chiami addHandler (cerca su internet).

Se non sbaglio, tutti gli eventi del .NET ha il primo parametro che si chiama sender (di predefinito, poi uno lo chiama come vuole). quello è il riferimento all'oggetto che ha scatenato l'evento.
 
Ah grazie 1000... Stasera provo...
Una domandina, per ottenere l'indirizzo della funzione, basta mettere &func?
 
cmq mi sono accorto che addHandler è solo in vb.net. per il c# viene ridefinito l'operatore +=.
esempio
Codice:
flashTimer.Tick += new EventHandler(timerTick);
public void timerTick(object sender, EventArgs e)
{
   /// Do something here!
}
ovviamente timerTick è la funzione che deve gestire il tutto, mentre .Tick è l'evento.

se non hai problemi a comprendere il vb.net c'è anche questo link
http://visualbasic.about.com/b/2006/12/13/using-addhandler-and-addressof.htm
che fa al caso tuo.
 
Funziona, non capisco solo una cosa...
Tra una chiamata e l'altra ci passa qualche secondo.

Ok risolto si può chiudere... grazie 1000 Whivel
 
consiglierei di postare il codice modificato per eventuali visitatori con lo stesso problema
 
Codice:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Mappa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        PictureBox[,] pb = new PictureBox[60,60];
        private void Form1_Load(object sender, EventArgs e)
        {

            for (int x = 0; x < 60; x++)
            {
                for (int y = 0; y < 60; y++)
                {
pb[x, y] = new PictureBox();
 pb[x, y].Size = new Size(2, 2);
pb[x, y].BackColor = Color.White;
pb[x, y].Location = new Point((x * 2)+10, (y * 2)+10);
pb[x, y].MouseMove += new MouseEventHandler(Colora);

                    Controls.Add(pb[x, y]);
                 }
             }
}

 private void Colora(object Sender, EventArgs e)
        {
            PictureBox ppb = (PictureBox)Sender;
            ppb.BackColor = Color.Black;
        }
}
}

Ok... in realtà questo codice mi serviva per fare un programma tale che l'utente disegna su una tabella di pictureBox, e il disegno viene riprodotto sul gioco "METIN2", gettando monete a terra, nelle stesse coordinate disegnate nel programma... Ovviamente basate su quelle dove si trova il personaggio... Lo so sono pazzo xD
 
lasciando predere lo scopo, ti ringrazio per tutti gli utenti che prenderanno spunto dal codice ^^
 
Stato
Discussione chiusa ad ulteriori risposte.