Panduan: Menangani Peristiwa (Visual Basic)

Ini adalah topik kedua dari dua topik yang menunjukkan cara bekerja dengan peristiwa. Topik pertama, Panduan: Mendeklarasikan dan Memunculkan Peristiwa, menunjukkan cara mendeklarasikan dan memunculkan peristiwa. Bagian ini menggunakan formulir dan kelas dari panduan tersebut untuk menunjukkan cara menangani peristiwa saat sedang berlangsung.

Contoh kelas Widget menggunakan pernyataan penanganan peristiwa tradisional. Visual Basic menyediakan teknik lain untuk bekerja dengan peristiwa. Sebagai latihan, Anda dapat memodifikasi contoh ini untuk menggunakan pernyataan AddHandler dan Handles.

Untuk menangani peristiwa PercentDone dari kelas Widget

  1. Tempatkan kode berikut di Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Kata kunci WithEvents menentukan bahwa variabel mWidget digunakan untuk menangani peristiwa objek. Anda menentukan jenis objek dengan memberikan nama kelas tempat objek akan dibuat.

    Variabel mWidget dideklarasikan dalam Form1 karena variabel WithEvents harus dalam tingkat kelas. Ini berlaku terlepas dari jenis kelas tempat Anda menempatkannya.

    Variabel mblnCancel digunakan untuk membatalkan metode LongTask.

Menulis Kode untuk Menangani Peristiwa

Segera setelah Anda mendeklarasikan variabel menggunakan WithEvents, nama variabel muncul di daftar drop-down sisi kiri Code Editor (Editor Kode) kelas. Saat Anda memilih mWidget, peristiwa kelas Widget muncul di daftar drop-down sisi kanan. Memilih peristiwa menampilkan prosedur peristiwa yang sesuai, dengan prefiks mWidget dan garis bawah. Semua prosedur peristiwa yang terkait dengan variabel WithEvents diberi nama variabel sebagai prefiks.

Untuk menangani peristiwa

  1. Pilih mWidget dari daftar drop-down sisi kiri di Code Editor (Editor Kode).

  2. Pilih peristiwa PercentDone dari daftar drop-down sisi kanan. Code Editor (Editor Kode) membuka prosedur peristiwa mWidget_PercentDone.

    Catatan

    Code Editor (Editor Kode) berguna, tetapi tidak wajib, untuk menyisipkan penanganan aktivitas baru. Dalam panduan ini, lebih langsung untuk hanya menyalin penanganan aktivitas langsung ke dalam kode Anda.

  3. Tambahkan kode berikut ke penanganan aktivitas mWidget_PercentDone:

    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
    

    Setiap kali peristiwa PercentDone dimunculkan, prosedur peristiwa menampilkan persentase selesai dalam kontrol Label. Metode DoEvents memungkinkan label untuk dicat ulang, dan juga memberi pengguna peluang untuk mengeklik tombol Cancel (Batalkan).

  4. Tambahkan kode berikut untuk penanganan aktivitas Button2_Click:

    Private Sub Button2_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

Jika pengguna mengklik tombol Cancal (Batal) saat LongTask berjalan, peristiwa Button2_Click segera dijalankan setelah pernyataan DoEvents yang mengizinkan pemrosesan peristiwa terjadi. Variabel tingkat kelas mblnCancel diatur ke True, dan peristiwa mWidget_PercentDone kemudian mengujinya dan mengatur argumen ByRef Cancel ke True.

Menghubungkan Variabel WithEvents ke Objek

Form1 sekarang disiapkan untuk menangani peristiwa objek Widget. Hal yang tersisa hanyalah menemukan Widget di suatu tempat.

Ketika Anda mendeklarasikan variabel WithEvents pada waktu desain, tidak akan ada objek yang terkait dengannya. Variabel WithEvents sama seperti variabel objek lainnya. Anda harus membuat objek dan menetapkan referensi ke objek tersebut dengan variabel WithEvents.

Untuk membuat objek dan menetapkan referensi ke objek tersebut

  1. Pilih (Form1 Events) dari daftar drop-down sisi kiri di Code Editor (Editor Kode).

  2. Pilih peristiwa Load dari daftar drop-down sisi kanan. Code Editor (Editor Kode) membuka prosedur peristiwa Form1_Load.

  3. Tambahkan kode berikut untuk prosedur peristiwa Form1_Load guna membuat Widget:

    Private Sub Form1_Load(
        ByVal sender As System.Object,
        ByVal e As System.EventArgs
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

Ketika kode ini dijalankan, Visual Basic membuat objek Widget dan menghubungkan peristiwanya ke prosedur peristiwa yang terkait dengan mWidget. Dari titik tersebut, setiap kali Widget memunculkan peristiwa PercentDone, prosedur peristiwa mWidget_PercentDone akan dijalankan.

Untuk memanggil metode LongTask

  • Tambahkan kode berikut ke penanganan aktivitas Button1_Click:

    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
    

Sebelum metode LongTask dipanggil, label yang menampilkan persentase selesai harus diinisialisasi, dan bendera Boolean tingkat kelas untuk membatalkan metode harus diatur ke False.

LongTask dipanggil dengan durasi tugas 12,2 detik. Peristiwa PercentDone dimunculkan satu kali setiap sepertiga detik. Setiap kali peristiwa dimunculkan, prosedur peristiwa mWidget_PercentDone akan dijalankan.

Ketika LongTask selesai, mblnCancel diuji untuk melihat jika LongTask berakhir secara normal, atau jika berhenti karena mblnCancel diatur ke True. Persentase selesai diperbarui hanya dalam kasus sebelumnya.

Untuk menjalankan program

  1. Tekan F5 untuk menempatkan proyek dalam mode jalankan.

  2. Klik tombol Start Task (Mulai Tugas). Setiap kali peristiwa PercentDone dimunculkan, label diperbarui dengan persentase tugas yang selesai.

  3. Klik tombol Cancel (Batalkan) untuk menghentikan tugas. Perhatikan bahwa tampilan tombol Cancel (Batalkan) tidak segera berubah saat Anda mengekliknya. Peristiwa Click tidak dapat terjadi hingga pernyataan My.Application.DoEvents mengizinkan pemrosesan peristiwa.

    Catatan

    Metode My.Application.DoEvents tidak memproses peristiwa dengan cara yang sama seperti yang dilakukan formulir. Misalnya, dalam panduan ini, Anda harus mengeklik tombol Cancel (Batalkan) dua kali. Untuk mengaktifkan formulir guna menangani peristiwa secara langsung, Anda dapat menggunakan pengaluran-jamak. Untuk informasi selengkapnya, lihat Alur Terkelola.

Anda mungkin merasa instruktif untuk menjalankan program dengan F11 dan menelusuri kode baris pada satu waktu. Anda dapat melihat dengan jelas cara eksekusi memasuki LongTask, lalu masuk kembali ke Form1 secara singkat setiap kali peristiwa PercentDone dimunculkan.

Apa yang akan terjadi jika, saat eksekusi kembali dalam kode Form1, metode LongTask dipanggil lagi? Hal paling buruk adalah luapan tumpukan mungkin terjadi jika LongTask dipanggil setiap kali peristiwa dimunculkan.

Anda dapat menyebabkan variabel mWidget untuk menangani peristiwa bagi objek Widget yang berbeda dengan menetapkan referensi ke Widget baru menjadi mWidget. Bahkan, Anda dapat membuat kode dalam Button1_Click untuk melakukan tindakan ini setiap kali Anda mengeklik tombol.

Untuk menangani peristiwa bagi widget yang berbeda

  • Tambahkan baris kode berikut ke prosedur Button1_Click, segera sebelum baris yang bertuliskan mWidget.LongTask(12.2, 0.33):

    mWidget = New Widget
    ' Create a new Widget object.
    

Kode di atas membuat Widget baru setiap kali tombol diklik. Segera setelah metode LongTask selesai, referensi ke Widget dirilis, dan Widget dihancurkan.

Variabel WithEvents hanya dapat berisi satu referensi objek pada satu waktu, jadi jika Anda menetapkan objek Widget yang berbeda ke mWidget, peristiwa objek Widget sebelumnya tidak akan lagi ditangani. Jika mWidget adalah satu-satunya variabel objek yang berisi referensi ke Widget yang lama, objek akan dihancurkan. Jika Anda ingin menangani peristiwa dari beberapa objek Widget, gunakan pernyataan AddHandler untuk memproses peristiwa dari setiap objek secara terpisah.

Catatan

Anda dapat mendeklarasikan variabel WithEvents sebanyak yang Anda butuhkan, tetapi array variabel WithEvents tidak didukung.

Lihat juga