Procedura dettagliata: dichiarazione e generazione di eventi (Visual Basic)
Questa procedura dettagliata illustra come dichiarare e generare eventi per una classe denominata Widget
. Dopo aver completato i passaggi, è possibile leggere l'argomento complementare, Procedura dettagliata: Gestione degli eventi, che illustra come usare gli eventi dagli oggetti Widget
per fornire informazioni sullo stato in un'applicazione.
Classe Widget
Si supponga per il momento di avere una classe Widget
. La classe Widget
ha un metodo la cui esecuzione può richiedere molto tempo e si vuole che l'applicazione sia in grado di inserire un qualche tipo di indicatore di completamento.
Naturalmente è possibile fare in modo che l'oggetto Widget
mostri una finestra di dialogo con percentuale di completamento, ma tale finestra di dialogo verrebbe quindi visualizzata in ogni progetto in cui è stata usata la classe Widget
. Un principio valido per la progettazione di oggetti consiste nel consentire all'applicazione che usa un oggetto di gestire l'interfaccia utente, a meno che l'intero scopo dell'oggetto non sia gestire un modulo o una finestra di dialogo.
Lo scopo di Widget
consiste nell'eseguire altre attività, quindi è preferibile aggiungere un evento PercentDone
e permettere alla routine che chiama i metodi di Widget
di gestire tale evento e visualizzare gli aggiornamenti dello stato. L'evento PercentDone
può anche fornire un meccanismo per annullare l'attività.
Per compilare l'esempio di codice per questo argomento
Aprire un nuovo progetto di applicazione Windows di Visual Basic e creare un modulo denominato
Form1
.Aggiungere due pulsanti e un'etichetta per
Form1
.Assegnare i nomi agli oggetti come illustrato nella tabella seguente.
Object Proprietà Impostazione Button1
Text
Start Task Button2
Text
Annulla Label
(Name)
,Text
lblPercentDone, 0 Scegliere Aggiungi classe dal menu Progetto per aggiungere una classe denominata
Widget.vb
al progetto.
Per dichiarare un evento per la classe Widget
Usare la parola chiave
Event
per dichiarare un evento nella classeWidget
. Si noti che un evento può avere argomentiByVal
eByRef
, come dimostrato dall'eventoPercentDone
diWidget
:Public Event PercentDone(ByVal Percent As Single, ByRef Cancel As Boolean)
Quando l'oggetto chiamante riceve un evento PercentDone
, l'argomento Percent
contiene la percentuale di completamento dell'attività. L'argomento Cancel
può essere impostato su True
per annullare il metodo che ha generato l'evento.
Nota
È possibile dichiarare argomenti per gli evento con lo stesso approccio usato per gli argomenti di routine, con le eccezioni seguenti: gli eventi non possono avere argomenti Optional
o ParamArray
e gli eventi non hanno valori restituiti.
L'evento PercentDone
viene generato dal metodo LongTask
della classe Widget
. LongTask
accetta due argomenti: l'intervallo di tempo in cui il metodo fa finta di eseguire il lavoro e l'intervallo di tempo minimo prima della sospensione di LongTask
per generare l'evento PercentDone
.
Per generare l'evento PercentDone
Per semplificare l'accesso alla proprietà
Timer
usata da questa classe, aggiungere un'istruzioneImports
all'inizio della sezione della dichiarazione del modulo di classe, sopra l'istruzioneClass Widget
.Imports Microsoft.VisualBasic.DateAndTime
Aggiungere il codice seguente alla classe
Widget
:Public Sub LongTask(ByVal Duration As Single, ByVal MinimumInterval As Single) Dim Threshold As Single Dim Start As Single Dim blnCancel As Boolean ' The Timer property of the DateAndTime object returns the seconds ' and milliseconds that have passed since midnight. Start = CSng(Timer) Threshold = MinimumInterval Do While CSng(Timer) < (Start + Duration) ' In a real application, some unit of work would ' be done here each time through the loop. If CSng(Timer) > (Start + Threshold) Then RaiseEvent PercentDone( Threshold / Duration, blnCancel) ' Check to see if the operation was canceled. If blnCancel Then Exit Sub Threshold = Threshold + MinimumInterval End If Loop End Sub
Quando l'applicazione chiama il metodo LongTask
, la classe Widget
genera l'evento PercentDone
ogni MinimumInterval
secondi. Quando l'evento viene restituito, LongTask
verifica se l'argomento Cancel
è stato impostato su True
.
Sono a questo punto necessarie alcune avvertenze. Per semplicità, la procedura LongTask
presuppone che si sappia in anticipo quanto tempo richiederà l'attività. Questo non succede praticamente mai. Dividere le attività in blocchi di dimensioni uniformi può essere difficile e spesso gli utenti sono principalmente interessati semplicemente alla quantità di tempo trascorso prima che venga confermato che è in corso un'operazione.
È possibile che si sia notato un altro difetto di questo esempio. La proprietà Timer
restituisce il numero di secondi trascorsi dalla mezzanotte. L'applicazione rimane quindi bloccata se viene avviata poco prima di mezzanotte. Un approccio più attento alla misurazione del tempo prenderebbe in considerazione condizioni limite come questa o riuscirebbe a evitarle completamente, usando proprietà come Now
.
Ora che la classe Widget
può generare eventi, è possibile passare alla procedura dettagliata successiva. La Procedura dettagliata: Gestione degli eventi illustra come usare WithEvents
per associare un gestore dell'evento all'evento PercentDone
.