Návod: Deklarace a vyvolávání událostí (Visual Basic)

Tento návod ukazuje, jak deklarovat a vyvolat události pro třídu s názvem Widget. Po dokončení kroků můžete chtít přečíst doprovodné téma Návod : Zpracování událostí, které ukazuje, jak pomocí událostí z Widget objektů poskytnout informace o stavu v aplikaci.

Třída widgetu

Předpokládejme, že máte Widget třídu. Vaše Widget třída má metodu, která může trvat dlouhou dobu, než se spustí, a vy chcete, aby vaše aplikace mohla vložit nějaký druh indikátoru dokončení.

Samozřejmě můžete nastavit, aby Widget objekt zobrazoval dialogové okno dokončeno procent, ale pak byste se s tímto dialogovým oknem zasekli v každém projektu, ve kterém jste použili Widget třídu. Dobrým principem návrhu objektu je nechat aplikaci, která používá objekt, zpracovává uživatelské rozhraní – pokud celý účel objektu není spravovat formulář nebo dialogové okno.

Účelem Widget je provádět jiné úlohy, takže je lepší přidat PercentDone událost a nechat proceduru, která volá Widgetmetody zpracování této události a zobrazení aktualizací stavu. Událost PercentDone může také poskytnout mechanismus pro zrušení úlohy.

Sestavení příkladu kódu pro toto téma

  1. Otevřete nový projekt aplikace pro Windows v jazyce Visual Basic a vytvořte formulář s názvem Form1.

  2. Přidejte dvě tlačítka a popisek do Form1.

  3. Pojmenujte objekty, jak je znázorněno v následující tabulce.

    Object Vlastnost Nastavení
    Button1 Text Spustit úkol
    Button2 Text Zrušit
    Label (Name), Text lblPercentDone, 0
  4. V nabídce Projekt zvolte Přidat třídu a přidejte do projektu třídu pojmenovanouWidget.vb.

Deklarace události pro třídu Widget

  • Pomocí klíčového Event slova deklarujte událost ve Widget třídě. Všimněte si, že událost může mít ByVal a ByRef argumenty, jak WidgetPercentDone ukazuje událost:

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

Když volající objekt obdrží PercentDone událost, Percent argument obsahuje procento dokončeného úkolu. Argument Cancel lze nastavit tak, aby True zrušil metodu, která vyvolala událost.

Poznámka:

Argumenty události můžete deklarovat stejně jako argumenty procedur s následujícími výjimkami: Události nemohou mít Optional nebo ParamArray argumenty a události nemají návratové hodnoty.

Událost PercentDone je vyvolána LongTask metodou Widget třídy. LongTask má dva argumenty: doba, po kterou metoda předstírala, že pracuje, a minimální časový interval před LongTask pozastavením pro vyvolání PercentDone události.

Vyvolání události PercentDone

  1. Chcete-li zjednodušit přístup k Timer vlastnosti používané touto třídou, přidejte Imports příkaz na začátek oddílu deklarací modulu třídy nad Class Widget příkaz.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Do třídy přidejte následující kód 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
    

Když vaše aplikace volá metodu LongTask , Widget třída vyvolá PercentDone událost každých MinimumInterval sekund. Když se událost vrátí, zkontroluje, LongTask zda Cancel byl argument nastaven na True.

Tady je potřeba několik omezení. Pro zjednodušení tento LongTask postup předpokládá, že předem víte, jak dlouho bude úkol trvat. To je skoro nikdy případ. Rozdělení úkolů na bloky sudých velikostí může být obtížné a často to, co je pro uživatele nejdůležitější, jednoduše doba, po kterou projde, než zjistí, že se něco děje.

Možná jste v této ukázce viděli další chybu. Vlastnost Timer vrátí počet sekund, které uplynuly od půlnoci, a proto se aplikace zasekne, pokud je spuštěna těsně před půlnocí. Opatrnější přístup k měření času by při zvažování hraničních podmínek, jako je tento, nebo se jim úplně vyhnul pomocí vlastností, jako Nowje .

Teď, když Widget třída může vyvolat události, můžete přejít k dalšímu návodu. Návod: Zpracování událostí ukazuje použití WithEvents k přidružení obslužné rutiny události k PercentDone události.

Viz také