Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ini adalah topik kedua dari dua topik yang menunjukkan cara memanfaatkan event. Topik pertama, Panduan: Mendeklarasikan dan Meningkatkan Peristiwa, menunjukkan cara mendeklarasikan dan memunculkan peristiwa. Bagian ini menggunakan formulir dan kelas dari panduan tersebut untuk menunjukkan cara menangani peristiwa saat berlangsung.
Contoh Widget
kelas menggunakan pernyataan penanganan peristiwa tradisional. Visual Basic menyediakan teknik lain untuk menangani event. Sebagai latihan, Anda dapat memodifikasi contoh ini untuk menggunakan pernyataan AddHandler
dan Handles
.
Untuk menangani event PercentDone dari kelas Widget
Tempatkan kode berikut di
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Kata
WithEvents
kunci menentukan bahwa variabelmWidget
digunakan untuk menangani peristiwa objek. Anda menentukan jenis objek dengan memberikan nama kelas tempat objek akan dibuat.Variabel
mWidget
dideklarasikan dalamForm1
karenaWithEvents
variabel harus tingkat kelas. Ini berlaku terlepas dari jenis kelas tempat Anda menempatkannya.Variabel
mblnCancel
digunakan untuk membatalkanLongTask
metode .
Menulis Kode untuk Menangani Peristiwa
Segera setelah Anda mendeklarasikan variabel menggunakan WithEvents
, nama variabel muncul di daftar drop-down kiri Editor Kode kelas. Ketika Anda memilih mWidget
, peristiwa dari kelas Widget
akan muncul dalam daftar drop-down di sebelah kanan. Memilih peristiwa menampilkan prosedur peristiwa yang sesuai, dengan awalan mWidget
dan garis bawah. Semua prosedur peristiwa yang terkait dengan WithEvents
variabel diberi nama variabel sebagai awalan.
Untuk menangani peristiwa
Pilih
mWidget
dari daftar drop-down kiri di Editor Kode.Pilih acara dari daftar drop-down
PercentDone
yang berada di sebelah kanan. Editor Kode membukamWidget_PercentDone
prosedur acara.Nota
Editor Kode berguna, tetapi tidak diperlukan, untuk menyisipkan penanganan aktivitas baru. Dalam panduan ini, lebih mudah untuk langsung menyalin pengendali acara ke dalam kode Anda.
Tambahkan kode berikut ke pengendali event
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 acara
PercentDone
dipicu, prosedur acara menunjukkan persentase selesai di kontrolLabel
. Metode iniDoEvents
memungkinkan label untuk mengecat ulang, dan juga memberi pengguna kesempatan untuk mengklik tombol Batalkan .Tambahkan kode berikut untuk penanganan
Button2_Click
aktivitas:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Jika pengguna mengklik tombol Batal saat LongTask
berjalan, Button2_Click
peristiwa akan dijalankan segera setelah pernyataan DoEvents
memungkinkan pemrosesan peristiwa terjadi. Variabel tingkat kelas mblnCancel
diatur ke True
, dan event mWidget_PercentDone
kemudian mengujinya dan menetapkan nilai ByRef Cancel
ke True
.
Menyambungkan Variabel WithEvents ke Objek
Form1
sekarang disiapkan untuk menangani Widget
peristiwa objek. Yang tersisa hanyalah menemukan Widget
di suatu tempat.
Ketika Anda mendeklarasikan variabel WithEvents
pada waktu desain, tidak ada objek yang terkait dengannya. Variabel WithEvents
sama seperti variabel objek lainnya. Anda harus membuat objek dan menetapkan referensi ke objek tersebut WithEvents
dengan variabel .
Untuk membuat objek dan menetapkan referensi ke objek tersebut
Pilih (Peristiwa Form1) dari daftar tarik-turun di sebelah kiri di Editor Kode.
Pilih acara dari daftar drop-down
Load
yang berada di sebelah kanan. Editor Kode membukaForm1_Load
prosedur acara.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 Widget
objek dan menghubungkan peristiwanya ke prosedur peristiwa yang terkait dengan mWidget
. Mulai saat itu, setiap kali Widget
memicu peristiwa PercentDone
-nya, prosedur peristiwa mWidget_PercentDone
dijalankan.
Untuk memanggil metode LongTask
Tambahkan kode berikut ke pengendali event
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 penanda tingkat kelas Boolean
untuk membatalkan metode harus diatur ke False
.
LongTask
dipanggil dengan durasi tugas 12,2 detik. Acara PercentDone
ini dimunculkan setiap sepertiga detik. Setiap kali peristiwa dipicu, mWidget_PercentDone
prosedur peristiwa dijalankan.
Setelah LongTask
selesai, mblnCancel
diuji untuk melihat apakah LongTask
berakhir secara normal, atau jika berhenti karena mblnCancel
diatur ke True
. Persentase selesai hanya diperbarui dalam kasus sebelumnya.
Untuk menjalankan program
Tekan F5 untuk menempatkan proyek dalam mode jalankan.
Klik tombol Mulai Tugas . Setiap kali
PercentDone
peristiwa dinaikkan, label diperbarui dengan persentase tugas yang selesai.Klik tombol Batal untuk menghentikan tugas. Perhatikan bahwa tampilan tombol Batalkan tidak langsung berubah ketika Anda mengkliknya. Peristiwa
Click
tidak dapat terjadi sampaiMy.Application.DoEvents
pernyataan mengizinkan pemrosesan peristiwa.Nota
Metode
My.Application.DoEvents
ini tidak memproses peristiwa dengan cara yang sama persis seperti bentuknya. Misalnya, dalam panduan ini, Anda harus mengklik tombol Batalkan dua kali. Untuk mengizinkan formulir menangani peristiwa secara langsung, Anda dapat menggunakan multithreading. Untuk informasi selengkapnya, lihat Utas Terkelola.
Anda mungkin merasa berguna untuk menjalankan program dengan F11 dan menelusuri kode baris demi baris. Anda dapat dengan jelas melihat bagaimana eksekusi memasuki LongTask
, lalu memasuki kembali Form1
secara singkat setiap kali kejadian PercentDone
dijalankan.
Apa yang akan terjadi jika, saat eksekusi kembali dalam kode Form1
, metode LongTask
dipanggil lagi? Paling buruk, luapan tumpukan mungkin terjadi jika LongTask
dipanggil setiap kali peristiwa dinaikkan.
Anda dapat menyebabkan variabel mWidget
menangani peristiwa untuk objek yang berbeda Widget
dengan menetapkan referensi ke yang baru Widget
ke mWidget
. Bahkan, Anda dapat membuat kode dalam Button1_Click
melakukan ini setiap kali Anda mengklik tombol.
Untuk menangani peristiwa untuk widget yang berbeda
Tambahkan baris kode berikut ke
Button1_Click
prosedur, segera sebelum baris bertuliskanmWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Kode di atas membuat suatu 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 yang berbeda Widget
ke mWidget
, peristiwa objek sebelumnya Widget
tidak akan lagi ditangani. Jika mWidget
adalah satu-satunya variabel objek yang berisi referensi ke yang lama Widget
, objek dihancurkan. Jika Anda ingin menangani peristiwa dari beberapa Widget
objek, gunakan AddHandler
pernyataan untuk memproses peristiwa dari setiap objek secara terpisah.
Nota
Anda dapat mendeklarasikan variabel sebanyak WithEvents
yang Anda butuhkan, tetapi array WithEvents
variabel tidak didukung.