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

  1. Aprire un nuovo progetto di applicazione Windows di Visual Basic e creare un modulo denominato Form1.

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

  3. 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
  4. 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 classe Widget. Si noti che un evento può avere argomenti ByVal e ByRef, come dimostrato dall'evento PercentDonedi Widget:

    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

  1. Per semplificare l'accesso alla proprietà Timer usata da questa classe, aggiungere un'istruzione Imports all'inizio della sezione della dichiarazione 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 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.

Vedi anche