Condividi tramite


Procedura dettagliata: dichiarazione e generazione di eventi

Aggiornamento: novembre 2007

In questa procedura dettagliata vengono illustrate la dichiarazione e la generazione di eventi per una classe denominata Widget. Dopo aver completato i passaggi richiesti, è possibile leggere l'argomento correlato, Procedura dettagliata: gestione di eventi, in cui viene descritto come utilizzare eventi da oggetti Widget per fornire informazioni sullo stato in un'applicazione.

Classe Widget

Si supponga per il momento di disporre di una classe Widget. Poiché alla classe Widget è associato un metodo il cui tempo di esecuzione potrebbe essere elevato, si desidera che nell'applicazione venga visualizzato un indicatore di completamento.

Naturalmente è possibile fare in modo che l'oggetto Widget mostri una finestra di dialogo relativa alla percentuale di completamento, ma tale finestra verrebbe visualizzata in tutti i progetti in cui viene utilizzata la classe Widget. Nel corso della progettazione di oggetti è consigliabile lasciare che l'interfaccia utente venga gestita dall'applicazione che utilizza un oggetto, a meno che lo scopo dell'oggetto non sia la gestione di un form o di una finestra di dialogo.

Poiché lo scopo di Widget è l'esecuzione di altre attività, è consigliabile aggiungere un evento PercentDone e consentire alla routine che chiama i metodi Widget di gestire tale evento e di visualizzare gli aggiornamenti relativi allo stato. L'evento PercentDone è inoltre in grado di fornire un meccanismo per l'annullamento dell'attività.

Per creare un esempio di codice per questo argomento

  1. Aprire un nuovo progetto Applicazione Windows di Visual Basic e creare un form denominato Form1.

  2. Aggiungere due pulsanti e un'etichetta a Form1.

  3. Assegnare un nome agli oggetti, come illustrato nella tabella riportata di seguito.

    Oggetto

    Proprietà

    Impostazione

    Button1

    Text

    Inizia attività

    Button2

    Text

    Annulla

    Label

    (Name), Text

    lblPercentDone, 0

  4. Scegliere Aggiungi classe dal menu Progetto per aggiungere una classe denominata Widget.vb al progetto.

Per dichiarare un evento per la classe Widget

  • Utilizzare la parola chiave Event per dichiarare un evento nella classe Widget. Si noti che è possibile che a un evento siano associati gli argomenti ByVal e ByRef, come dimostrato dall'evento PercentDone di Widget:

    Public Event PercentDone(ByVal Percent As Single, _
                             ByRef Cancel As Boolean)
    

Quando l'oggetto chiamante riceve un evento PercentDone, l'argomento Percent indica la percentuale completata dell'attività. Per annullare il metodo che ha generato l'evento, è possibile impostare su True l'argomento Cancel.

Nota:

È possibile dichiarare argomenti per gli eventi analogamente a quanto avviene per gli argomenti delle routine. Non è tuttavia possibile specificare per gli eventi argomenti Optional o ParamArray; gli eventi inoltre non hanno valori restituiti.

L'evento PercentDone viene generato dal metodo LongTask della classe Widget. LongTask accetta due argomenti: il periodo di tempo apparentemente richiesto dal metodo per eseguire le operazioni e l'intervallo di tempo minimo necessario prima che LongTask sospenda le operazioni per generare l'evento PercentDone.

Per generare l'evento PercentDone

  1. Per semplificare l'accesso alla proprietà Timer utilizzata da questa classe, aggiungere un'istruzione Imports alla sezione delle dichiarazioni del modulo di classe, sopra l'istruzione Class Widget.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. 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 con un intervallo pari ai secondi definiti in MinimumInterval. Al ritorno dell'evento, LongTask controlla se l'argomento Cancel è stato impostato su True.

A questo punto sono necessarie alcune osservazioni. Per semplificare, la routine LongTask presuppone che si conosca anticipatamente il tempo richiesto dall'attività. In realtà questo dato non è quasi mai disponibile. È possibile che la suddivisione delle attività in blocchi di dimensioni uniformi risulti difficoltosa e spesso gli utenti desiderano soprattutto sapere quanto tempo è necessario attendere prima di ottenere un'indicazione relativa ad operazioni in corso.

Nell'esempio riportato è inoltre presente un ulteriore difetto. La proprietà Timer restituisce il numero di secondi dalla mezzanotte. Se avviata poco prima di mezzanotte, l'applicazione non funzionerà in modo corretto. Per una misurazione più precisa del tempo si consiglia di tenere in considerazione simili limitazioni o di utilizzare proprietà quali Now.

La classe Widget è ora in grado di generare eventi ed è quindi possibile passare all procedura dettagliata successiva. Nella sezione Procedura dettagliata: gestione di eventi viene illustrato come utilizzare WithEvents per associare un gestore eventi all'evento PercentDone.

Vedere anche

Attività

Procedura dettagliata: gestione di eventi

Procedura: scrivere gestori eventi

Concetti

Eventi e gestori eventi

Delegati e operatore AddressOf

AddHandler e RemoveHandler

Riferimenti

Proprietà Timer

WithEvents

Proprietà Now

Istruzione Event

ByVal

ByRef

Istruzione Imports (tipo e spazio dei nomi .NET)