Oppure

Loading
20/04/11 16:56
Sparvier0
Salve,

vorrei creare un evento personalizzato che si attivi quando una variabile booleana viene posta a true.

Ho fatto così, ma credo sia molto sbagliato:

Classe BooleanaEventArgs
namespace MITProg
{
    

    class BooleanaEventArgs : EventArgs
    {

        private bool booleana;

        public bool Booleana{
        get { return booleana;}
        }

            public BooleanaEventArgs(bool booleana){
                this.booleana = booleana;
            }


    }
    }



Classe EventHandler

namespace MITProg
{
    public class EventHandlerClass
    {
        public void HandleEventoTrue(BooleanaEventArgs e)
        {
            MessageBox.Show("Valore true", "Evento");
        }
    }
}



Classe dove viene impostata la variabile bool a true dopo una serie di istruzioni

namespace MITProg
{

    public delegate void BooleanaDelegate(BooleanaEventArgs);

    public partial class RiassuntoParametri : Form
    {

        public event BooleanaDelegate EventoTrue;
        private bool booleana;

        public void SubscribeEventoTrue(BooleanaDelegate eventHandler)
        {
            EventoTrue += eventHandler;
        }

        public void UnsubsribeEventoTrue(BooleanaDelegate eventHandler)
        {
            EventoTrue -= eventHandler;
        }

        private void ChiamaEvento()
        {
            if (EventoTrue != null)
            {
                EventoTrue(new BooleanaEventArgs(true));
            }
        }

        

        public RiassuntoParametri()
        {
            InitializeComponent();
        }

        // Caricamento del form
        //
        private void RiassuntoParametri_Load(object sender, EventArgs e)
        {
         
           ........... Altra roba ..............

            // gestione evento booleano
          
            EventHandlerClass handler = new EventHandlerClass();
            RiassuntoParametri prova = new RiassuntoParametri();
            prova.SubscribeEventoTrue(new       BooleanaDelegate(handler.HandleEventoTrue));

            booleana = true;

            if (booleana) {
                ChiamaEvento();
            }

            prova.UnsubsribeEventoTrue(new BooleanaDelegate(handler.HandleEventoTrue));




Dove sbaglio??

Non ditemi che è tutto sbagliato, please :asd:
aaa
22/04/11 9:10
Il Totem
Bastava questo:
public event EventHandler EventoTrue;
private booleana;

public Boolean Booleana
{
   get { return booleana; }
   set
   {
      booleana = value;
      if (booleana && EventoTrue != null)
         EventoTrue(this, EventArgs.Empty);
   }
}


Nota che:
- BooleanaEventArgs è inutile. Se l'evento viene lanciato solo quando il valore passa a true, è ovvio che BooleanaEventArgs.Booleana è true. Non c'è bisogno di un campo per contenerne il valore, quindi nemmeno di una classe apposita.
- EventHandler esiste già come classe, anche in una versione generics EventHandler<T>, quindi anche EventHandlerClass è inutile.
- Inutile anche definire due funzioni per sottroscrivere l'evento, dato che basta un += o un -= per fare la stessa cosa. E' una ripetizione che non porta nessun vantaggio.

Ma più importante è che non deve essere il client a occuparsi di quando chiamare l'evento: lo deve gestire e basta. Il codice che controlla quando un evento viene lanciato deve essere posto dove avvengono le azioni di cui l'evento fornisce notifica. In questo caso, deve stare nel blocco Set di una proprietà.
aaa