Condividi tramite


Procedura dettagliata: Gestione degli eventi (Visual Basic)

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

  1. Inserire il codice seguente in Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    La WithEvents parola chiave specifica che la variabile mWidget 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 in Form1 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 il LongTask 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

  1. Selezionare mWidget dall'elenco a discesa a sinistra nell'editor di codice.

  2. Selezionare l'evento PercentDone nell'elenco a discesa a destra. L'editor di codice apre la mWidget_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.

  3. 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 controllo Label. Il DoEvents metodo consente all'etichetta di ridisegnare e offre all'utente la possibilità di fare clic sul pulsante Annulla.

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

  1. Selezionare (Eventi Form1) nell'elenco a discesa a sinistra nell'editor di codice.

  2. Selezionare l'evento Load nell'elenco a discesa a destra. L'editor di codice apre la Form1_Load routine evento.

  3. Aggiungere il seguente codice alla routine dell'evento Form1_Load per creare il Widget:

    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

  1. Premere F5 per inserire il progetto in modalità di esecuzione.

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

  3. 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'istruzione My.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 recita mWidget.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.

Vedere anche