Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Delegate ed evento
Forum - C# / VB.NET - Delegate ed evento

Avatar
Sparvier0 (Normal User)
Newbie


Messaggi: 19
Iscritto: 25/02/2011

Segnala al moderatore
Postato alle 18:56
Mercoledì, 20/04/2011
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
Codice sorgente - presumibilmente C++

  1. namespace MITProg
  2. {
  3.    
  4.  
  5.     class BooleanaEventArgs : EventArgs
  6.     {
  7.  
  8.         private bool booleana;
  9.  
  10.         public bool Booleana{
  11.         get { return booleana;}
  12.         }
  13.  
  14.             public BooleanaEventArgs(bool booleana){
  15.                 this.booleana = booleana;
  16.             }
  17.  
  18.  
  19.     }
  20.     }



Classe  EventHandler

Codice sorgente - presumibilmente C++

  1. namespace MITProg
  2. {
  3.     public class EventHandlerClass
  4.     {
  5.         public void HandleEventoTrue(BooleanaEventArgs e)
  6.         {
  7.             MessageBox.Show("Valore true", "Evento");
  8.         }
  9.     }
  10. }



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

Codice sorgente - presumibilmente C#

  1. namespace MITProg
  2. {
  3.  
  4.     public delegate void BooleanaDelegate(BooleanaEventArgs);
  5.  
  6.     public partial class RiassuntoParametri : Form
  7.     {
  8.  
  9.         public event BooleanaDelegate EventoTrue;
  10.         private bool booleana;
  11.  
  12.         public void SubscribeEventoTrue(BooleanaDelegate eventHandler)
  13.         {
  14.             EventoTrue += eventHandler;
  15.         }
  16.  
  17.         public void UnsubsribeEventoTrue(BooleanaDelegate eventHandler)
  18.         {
  19.             EventoTrue -= eventHandler;
  20.         }
  21.  
  22.         private void ChiamaEvento()
  23.         {
  24.             if (EventoTrue != null)
  25.             {
  26.                 EventoTrue(new BooleanaEventArgs(true));
  27.             }
  28.         }
  29.  
  30.        
  31.  
  32.         public RiassuntoParametri()
  33.         {
  34.             InitializeComponent();
  35.         }
  36.  
  37.         // Caricamento del form
  38.         //
  39.         private void RiassuntoParametri_Load(object sender, EventArgs e)
  40.         {
  41.          
  42.            ........... Altra roba ..............
  43.  
  44.             // gestione evento booleano
  45.          
  46.             EventHandlerClass handler = new EventHandlerClass();
  47.             RiassuntoParametri prova = new RiassuntoParametri();
  48.             prova.SubscribeEventoTrue(new       BooleanaDelegate(handler.HandleEventoTrue));
  49.  
  50.             booleana = true;
  51.  
  52.             if (booleana) {
  53.                 ChiamaEvento();
  54.             }
  55.  
  56.             prova.UnsubsribeEventoTrue(new BooleanaDelegate(handler.HandleEventoTrue));



Dove sbaglio??

Non ditemi che è tutto sbagliato, please :asd:

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 11:10
Venerdì, 22/04/2011
Bastava questo:
Codice sorgente - presumibilmente VB.NET

  1. public event EventHandler EventoTrue;
  2. private booleana;
  3.  
  4. public Boolean Booleana
  5. {
  6.    get { return booleana; }
  7.    set
  8.    {
  9.       booleana = value;
  10.       if (booleana && EventoTrue != null)
  11.          EventoTrue(this, EventArgs.Empty);
  12.    }
  13. }



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

Sto studiando sul libro della O'Reill e tutto è molto più chiaro. - Sparvier0 - 22/04/11 15:31
Domanda: la classe che estende EventArgs la uso per salvare dei valori giusto? E questi valori dovrebbero essere delle informazioni utili per gestire il mio evento? - Sparvier0 - 22/04/11 15:33


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM