|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2004
Messaggi: 274
|
[C#] Problema con la generazione di eventi
il mio progetto ha una classe che si chiama Partita
All'interno ho scritto queste due banali righe: public delegate void EventoVuoto(); public event EventoVuoto GameStarted; Nel momento in cui la classe viene usata, dopo certe cosine avviene il lancio dell'evento: ... bla bla bla ... GameStarte(); ... bla bla bla ... Ora questa classe viene usata da una mia applicazione, da una form per la precisione che prima crea una istanza di Partita chiamandola Gioco e quindi procede ad agganciare l'evento così: Gioco.GameStarted += new Partita.EventoVuoto(OnGameStarted); Dove OnGameStarted è definita come metodo pubblico della mia form public void OnGameStarted() { // Questo succede quando viene creata da nuovo la classe 'Partita' // L'applicazione deve rispondere disabilitando i controlli per nuova partita // e per le opzioni mnuNuova.Enabled = false; mnuSfidaAmici.Enabled = false; mnuSfidaComputer.Enabled = false; } Il problema è che in realtà nel momento, a runtime, in cui l'esecuzione arriva al lancio dell'evento mi viene detto che è necessario usare new per creare una istanza. Perchè? E di cosa? Sto di certo sbagliando approccio, ma ho trovato un esempio praticamente identico su un manuale e quello funziona. Su MSDN invece ti fan creare un oggetto Evento derivato, e poi il delegato avrà l'oggetto this ed anche l'evento. ma non è necessario, almeno così dice il manuale e difatti il SUO esempio funziona. Sigh.
__________________
Realtebo |
![]() |
![]() |
![]() |
#2 |
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Probabilmente viene eseguito il codice A prima del codice B
A Codice:
... bla bla bla ... GameStarte(); ... bla bla bla ... B Codice:
Gioco.GameStarted += new Partita.EventoVuoto(OnGameStarted); Aggiungi ad A il controllo: Codice:
if(GameStarte!=null) GameStarte(); ![]() |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2004
Messaggi: 274
|
Grazie per la dritta, ma per evitare questo problema la classe Form che è poi la form principale della mia applicazione, prevede come variabile privata propio "Gioco" di tipo 'Partita' e viene creata all'atto stesso della dichiarazione usando un costruttore senza argomenti, e che per altro non fa nulla.
Una volta che la form è attiva, l'utente può premere 'nuova partita' e li viene creata una nuova istanza di 'Partita', e questa volta usando un altro costruttore. Una volta ottenuta l'istanza, assegno gli eventi Al termine eseguo il metodo 'Avvia()' dell'istanza appena creata e LI DENTRO avviene il lancio dell'evento maledetto. Dato che è la prima volta che lavoro con gli eventi non ho altra teoria che non un capitolo di un ottimo manuale Apress (pro c# 2008 and the net framework 3.5) i cui esempi funzionano tutti, tra l'altro. Forse cmq ho mal interpretato qualcosa della teoria o dell'approccio... forse qualcosa va dichiarato diversamente o in posti diversi.. no so... Se ti mando su il codice sorgente ci daresti un occhiata? (tanto è solo uno stupido gioco del tris creato appunto a motivi di studio)
__________________
Realtebo |
![]() |
![]() |
![]() |
#4 | |
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Ma quando debugghi e va in exception, qual'è la variabile a null?
Quote:
![]() |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Apr 2004
Messaggi: 274
|
>>> Motivi di studio PERSONALI, sono da sempre autodidatta
Cappero, avevi ragione. ero stato così stupido che, nel vano tentativo di evitare l'insorgere di un errore, ne avevo creato un altro. creavo una istanza, agganciavo gli eventi quindi ricreavo l'istanza, e qui gli eventi andavano a quel paese... Da oggi in poi verificherò sempre che gli eventi abbiano un handler prima di lanciarli ! (O sarebbe meglio sollevare un'eccezione ?)
__________________
Realtebo |
![]() |
![]() |
![]() |
#6 | |
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Quote:
Ciao |
|
![]() |
![]() |
![]() |
#7 |
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Dimenticavo... se vuoi capire meglio il meccanismo degli eventi, dai un'occhiata sull'MSDN alle keyword: add & remove.
http://msdn2.microsoft.com/en-us/lib...ea(VS.71).aspx |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:21.