Bagikan melalui


Panduan: Menangani Peristiwa (Visual Basic)

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

  1. Tempatkan kode berikut di Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Kata WithEvents kunci 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 WithEvents variabel harus tingkat kelas. Ini berlaku terlepas dari jenis kelas tempat Anda menempatkannya.

    Variabel mblnCancel digunakan untuk membatalkan LongTask 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

  1. Pilih mWidget dari daftar drop-down kiri di Editor Kode.

  2. Pilih acara dari daftar drop-down PercentDone yang berada di sebelah kanan. Editor Kode membuka mWidget_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.

  3. 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 kontrol Label. Metode ini DoEvents memungkinkan label untuk mengecat ulang, dan juga memberi pengguna kesempatan untuk mengklik tombol Batalkan .

  4. 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

  1. Pilih (Peristiwa Form1) dari daftar tarik-turun di sebelah kiri di Editor Kode.

  2. Pilih acara dari daftar drop-down Load yang berada di sebelah kanan. Editor Kode membuka Form1_Load prosedur acara.

  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 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

  1. Tekan F5 untuk menempatkan proyek dalam mode jalankan.

  2. Klik tombol Mulai Tugas . Setiap kali PercentDone peristiwa dinaikkan, label diperbarui dengan persentase tugas yang selesai.

  3. Klik tombol Batal untuk menghentikan tugas. Perhatikan bahwa tampilan tombol Batalkan tidak langsung berubah ketika Anda mengkliknya. Peristiwa Click tidak dapat terjadi sampai My.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 bertuliskan mWidget.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.

Lihat juga