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 BooleanLa
WithEventsparola chiave specifica che la variabilemWidgetviene 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
mWidgetviene dichiarata inForm1perchéWithEventsle variabili devono essere a livello di classe. Questo vale indipendentemente dal tipo di classe in cui vengono inseriti.La variabile
mblnCancelviene utilizzata per annullare ilLongTaskmetodo .
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
mWidgetdall'elenco a discesa a sinistra nell'editor di codice.Selezionare l'evento
PercentDonenell'elenco a discesa a destra. L'editor di codice apre lamWidget_PercentDoneroutine 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_PercentDonegestore 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 SubOgni volta che viene generato l'evento
PercentDone, la procedura dell'evento visualizza la percentuale di completamento in un controlloLabel. IlDoEventsmetodo consente all'etichetta di ridisegnare e offre all'utente la possibilità di fare clic sul pulsante Annulla.Aggiungere il codice seguente per il
Button2_Clickgestore 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
Loadnell'elenco a discesa a destra. L'editor di codice apre laForm1_Loadroutine evento.Aggiungere il seguente codice alla routine dell'evento
Form1_Loadper 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_Clickgestore 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
Clicknon può verificarsi finché l'istruzioneMy.Application.DoEventsnon consente l'elaborazione degli eventi.Annotazioni
Il
My.Application.DoEventsmetodo 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.