Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo è il secondo di due argomenti che illustrano come usare gli eventi. Il primo argomento , Procedura dettagliata: Dichiarazione e generazione di eventi, illustra come dichiarare e generare eventi. Questa sezione utilizza il modulo e la classe della procedura dettagliata per mostrare come gestire gli eventi quando si verificano.
L'esempio di Widget
classe usa istruzioni tradizionali di gestione degli eventi. Visual Basic fornisce altre tecniche per lavorare con gli eventi. Come esercizio, puoi modificare questo esempio per utilizzare le istruzioni AddHandler
e Handles
.
Per gestire l'evento PercentDone della classe Widget
Inserire il codice seguente in
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
La
WithEvents
parola chiave specifica che la variabilemWidget
viene utilizzata per gestire gli eventi di un oggetto. Specificare il tipo di oggetto specificando il nome della classe da cui verrà creato l'oggetto.La variabile
mWidget
viene dichiarata inForm1
perchéWithEvents
le variabili devono essere a livello di classe. Questo vale indipendentemente dal tipo di classe in cui vengono inseriti.La variabile
mblnCancel
viene utilizzata per annullare ilLongTask
metodo .
Scrittura di codice per gestire un evento
Non appena si dichiara una variabile usando WithEvents
, il nome della variabile viene visualizzato nell'elenco a discesa a sinistra dell'editor di codice della classe. Quando si seleziona mWidget
, gli Widget
eventi della classe vengono visualizzati nell'elenco a discesa a destra. Se si seleziona un evento, viene visualizzata la routine evento corrispondente, con il prefisso mWidget
e un carattere di sottolineatura. A tutte le routine evento associate a una WithEvents
variabile viene assegnato il nome della variabile come prefisso.
Per gestire un evento
Selezionare
mWidget
dall'elenco a discesa a sinistra nell'editor di codice.Selezionare l'evento
PercentDone
nell'elenco a discesa a destra. L'editor di codice apre lamWidget_PercentDone
routine evento.Annotazioni
L'editor di codice è utile, ma non obbligatorio, per l'inserimento di nuovi gestori eventi. In questa procedura dettagliata è più semplice copiare i gestori eventi direttamente nel codice.
Aggiungere il codice seguente al
mWidget_PercentDone
gestore eventi:Private Sub mWidget_PercentDone( ByVal Percent As Single, ByRef Cancel As Boolean ) Handles mWidget.PercentDone lblPercentDone.Text = CInt(100 * Percent) & "%" My.Application.DoEvents() If mblnCancel Then Cancel = True End Sub
Ogni volta che viene generato l'evento
PercentDone
, la procedura dell'evento visualizza la percentuale di completamento in un controlloLabel
. IlDoEvents
metodo consente all'etichetta di ridisegnare e offre all'utente la possibilità di fare clic sul pulsante Annulla.Aggiungere il codice seguente per il
Button2_Click
gestore eventi:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Se l'utente fa clic sul pulsante Annulla mentre LongTask
è in esecuzione, l'evento Button2_Click
viene eseguito non appena l'istruzione DoEvents
permette l'elaborazione degli eventi. La variabile a livello di classe mblnCancel
è impostata su True
, quindi l'evento mWidget_PercentDone
la verifica e imposta l'argomento ByRef Cancel
su True
.
Connessione di una variabile WithEvents a un oggetto
Form1
è ora configurato per gestire gli eventi di un Widget
oggetto. Tutto ciò che resta è trovare un Widget
da qualche parte.
Quando si dichiara una variabile WithEvents
in fase di progettazione, non viene associato alcun oggetto. Una WithEvents
variabile è esattamente come qualsiasi altra variabile oggetto. È necessario creare un oggetto e assegnarvi un riferimento con la WithEvents
variabile .
Per creare un oggetto e assegnarvi un riferimento
Selezionare (Eventi Form1) nell'elenco a discesa a sinistra nell'editor di codice.
Selezionare l'evento
Load
nell'elenco a discesa a destra. L'editor di codice apre laForm1_Load
routine evento.Aggiungere il seguente codice alla routine dell'evento
Form1_Load
per creare ilWidget
:Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
Quando questo codice viene eseguito, Visual Basic crea un Widget
oggetto e ne connette gli eventi alle routine evento associate a mWidget
. Da quel punto in poi, ogni volta che il Widget
genera l'evento PercentDone
, viene eseguita la procedura evento mWidget_PercentDone
.
Per chiamare il metodo LongTask
Aggiungere il codice seguente al
Button1_Click
gestore eventi:Private Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button1.Click mblnCancel = False lblPercentDone.Text = "0%" lblPercentDone.Refresh() mWidget.LongTask(12.2, 0.33) If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%" End Sub
Prima che il LongTask
metodo venga chiamato, l'etichetta che visualizza la percentuale di completamento deve essere inizializzata e il flag a livello Boolean
di classe per annullare il metodo deve essere impostato su False
.
LongTask
viene chiamato con una durata dell'attività di 12,2 secondi. L'evento PercentDone
viene generato una volta ogni un terzo di secondo. Ogni volta che viene generato l'evento, viene eseguita la procedura evento mWidget_PercentDone
.
Al termine di LongTask
, mblnCancel
viene testato per verificare se LongTask
è terminato normalmente o se è stato interrotto perché mblnCancel
è stato impostato su True
. La percentuale di completamento viene aggiornata solo nel caso precedente.
Per eseguire il programma
Premere F5 per inserire il progetto in modalità di esecuzione.
Fare clic sul pulsante Avvia attività . Ogni volta che viene generato l'evento
PercentDone
, l'etichetta viene aggiornata con la percentuale di completamento dell'attività.Fare clic sul pulsante Annulla per arrestare l'attività. Si noti che l'aspetto del pulsante Annulla non cambia immediatamente quando si fa clic su di esso. L'evento
Click
non può verificarsi finché l'istruzioneMy.Application.DoEvents
non consente l'elaborazione degli eventi.Annotazioni
Il
My.Application.DoEvents
metodo non elabora gli eventi esattamente allo stesso modo del form. In questa procedura dettagliata, ad esempio, è necessario fare clic due volte sul pulsante Annulla . Per consentire al modulo di gestire direttamente gli eventi, è possibile usare il multithreading. Per altre informazioni, vedere Threading gestito.
Potrebbe essere utile eseguire il programma con F11 ed eseguire il codice una riga alla volta. È possibile vedere chiaramente come l'esecuzione entra in LongTask
e quindi entra brevemente di nuovo in Form1
ogni volta che viene generato l'evento PercentDone
.
Cosa accadrebbe se, mentre l'esecuzione era di nuovo nel codice di Form1
, il LongTask
metodo veniva chiamato di nuovo? Nel peggiore dei casi, un overflow dello stack potrebbe verificarsi se LongTask
venisse chiamato ogni volta che l'evento viene sollevato.
È possibile che la variabile mWidget
gestisca gli eventi per un oggetto diverso Widget
assegnando un riferimento al nuovo Widget
oggetto a mWidget
. In effetti, puoi fare in modo che il codice in Button1_Click
esegua questa operazione ogni volta che si fa clic sul pulsante.
Per gestire gli eventi per un widget diverso
Aggiungere la riga di codice seguente alla procedura
Button1_Click
, immediatamente precedente alla riga che recitamWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Il codice precedente crea un nuovo Widget
oggetto ogni volta che si fa clic sul pulsante. Non appena il LongTask
metodo viene completato, il riferimento a Widget
viene rilasciato e l'oggetto Widget
viene eliminato definitivamente.
Una WithEvents
variabile può contenere un solo riferimento all'oggetto alla volta, quindi se si assegna un oggetto diverso Widget
a mWidget
, gli eventi dell'oggetto precedente Widget
non verranno più gestiti. Se mWidget
è l'unica variabile oggetto contenente un riferimento al vecchio Widget
, l'oggetto viene eliminato definitivamente. Se si desidera gestire gli eventi da diversi Widget
oggetti, usare l'istruzione AddHandler
per elaborare gli eventi da ogni oggetto separatamente.
Annotazioni
È possibile dichiarare tutte WithEvents
le variabili necessarie, ma le matrici di WithEvents
variabili non sono supportate.