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
Tempatkan kode berikut di
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Kata kunci
WithEvents
menentukan bahwa variabelmWidget
digunakan untuk menangani peristiwa objek. Anda menentukan jenis objek dengan memberikan nama kelas tempat objek akan dibuat.Variabel
mWidget
dideklarasikan dalamForm1
karena variabelWithEvents
harus dalam tingkat kelas. Ini berlaku terlepas dari jenis kelas tempat Anda menempatkannya.Variabel
mblnCancel
digunakan untuk membatalkan metodeLongTask
.
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
Pilih
mWidget
dari daftar drop-down sisi kiri di Code Editor (Editor Kode).Pilih peristiwa
PercentDone
dari daftar drop-down sisi kanan. Code Editor (Editor Kode) membuka prosedur peristiwamWidget_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.
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 kontrolLabel
. MetodeDoEvents
memungkinkan label untuk dicat ulang, dan juga memberi pengguna peluang untuk mengeklik tombol Cancel (Batalkan).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
Pilih (Form1 Events) dari daftar drop-down sisi kiri di Code Editor (Editor Kode).
Pilih peristiwa
Load
dari daftar drop-down sisi kanan. Code Editor (Editor Kode) membuka prosedur peristiwaForm1_Load
.Tambahkan kode berikut untuk prosedur peristiwa
Form1_Load
guna membuatWidget
: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
Tekan F5 untuk menempatkan proyek dalam mode jalankan.
Klik tombol Start Task (Mulai Tugas). Setiap kali peristiwa
PercentDone
dimunculkan, label diperbarui dengan persentase tugas yang selesai.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 pernyataanMy.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 bertuliskanmWidget.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.