Windows Forms membangun aplikasi yang bekerja sebagai reaksi atas event, dan topik ini menata pola pikir tersebut menjadi kebiasaan menulis kode yang benar. Tiga event yang paling sering digunakan, yaitu Click, TextChanged, dan Load, dibahas lengkap beserta dua cara mengaitkan event handler, yaitu prosedur yang merespons event, melalui klausa Handles dan AddHandler. Setelah membaca topik ini, handler untuk event mana pun dapat ditulis dengan tanda tangan yang tepat dan dihubungkan pada penerbitnya dengan benar.
Event sebagai inti aplikasi berjendela#
Aplikasi console mengeksekusi pernyataan dari atas ke bawah lalu selesai, sedangkan aplikasi berjendela hidup dalam keadaan menunggu. Setelah form tampil, program berdiam di dalam loop pesan yang mengambil pesan Windows seperti gerakan tetikus atau penekanan tombol, kemudian meneruskannya ke kontrol yang bersangkutan. Kontrol menerjemahkan pesan itu menjadi event, yakni pemberitahuan bahwa sesuatu telah terjadi, misalnya Click ketika Button ditekan atau TextChanged ketika isi TextBox berubah.
Event pada .NET adalah anggota kelas yang dibangun di atas delegate, tipe yang menyimpan rujukan ke sebuah prosedur. Satu event dapat menampung banyak prosedur sekaligus, dan seluruhnya dipanggil ketika event diterbitkan. Aplikasi tidak pernah memaksa kontrol bereaksi, melainkan menyiapkan prosedur yang disebut event handler, lalu mendaftarkannya pada event yang dituju. Pola menunggu dan merespons inilah yang membedakan pemrograman berjendela dari program berurutan, sehingga pemahamannya menjadi fondasi bagi seluruh pembahasan Windows Forms.
Tanda tangan handler event#
Setiap handler Windows Forms ditulis dengan tanda tangan yang sama, yaitu dua parameter bernama sender dan e. Parameter pertama bertipe Object dan berisi kontrol yang menerbitkan event, sedangkan parameter kedua bertipe EventArgs atau turunannya dan membawa data tambahan tentang eventnya. Bentuk bakunya seperti berikut.
' tidak-dijalankan
Private Sub NamaHandler(sender As Object, e As EventArgs)
' isi reaksi terhadap event
End SubParameter sender memungkinkan satu handler digunakan bersama oleh beberapa kontrol. Bila handler perlu mengubah sifat penerbitnya, Object dikonversi kembali ke tipe kontrol aslinya dengan DirectCast, sebagaimana contoh berikut.
' tidak-dijalankan
Private Sub TombolDiklik(sender As Object, e As EventArgs)
Dim tombol As Button = DirectCast(sender, Button)
tombol.Text = "Sudah ditekan"
End SubHandler juga boleh dideklarasikan dengan tipe data event yang lebih spesifik, misalnya MouseEventArgs untuk event tetikus. Untuk Click, TextChanged, dan Load, bentuk EventArgs polos sudah tepat karena ketiganya tidak membawa data tambahan.
Tiga event yang sering digunakan#
Berkas berikut adalah form contoh untuk topik ini, dan kode berjalan di Windows melalui Visual Studio atau dotnet run, sedangkan di lingkungan kerja tanpa layar, kode hanya diperiksa kompilasinya. Form ini menggunakan ketiga event sekaligus dengan perilaku yang mudah diamati.
' tidak-dijalankan
Imports System.Drawing
Imports System.Windows.Forms
Public Class FormPesan
Inherits Form
Private WithEvents inputNama As New TextBox()
Private WithEvents labelSambutan As New Label()
Private WithEvents tombolBersih As New Button()
Sub New()
Text = "Contoh Event"
ClientSize = New Size(300, 140)
inputNama.Location = New Point(20, 20)
inputNama.Size = New Size(260, 23)
labelSambutan.Location = New Point(20, 55)
labelSambutan.Size = New Size(260, 23)
tombolBersih.Text = "Bersihkan"
tombolBersih.Location = New Point(20, 90)
tombolBersih.Size = New Size(260, 30)
tombolBersih.Enabled = False
AddHandler tombolBersih.Click, AddressOf TombolBersihDiklik
Controls.Add(inputNama)
Controls.Add(labelSambutan)
Controls.Add(tombolBersih)
End Sub
Private Sub FormPesanDimuat(sender As Object, e As EventArgs) Handles MyBase.Load
Text = "Contoh Event, sudah dimuat"
End Sub
Private Sub InputNamaBerubah(sender As Object, e As EventArgs) Handles inputNama.TextChanged
labelSambutan.Text = "Halo, " & inputNama.Text
tombolBersih.Enabled = inputNama.Text <> ""
End Sub
Private Sub TombolBersihDiklik(sender As Object, e As EventArgs)
inputNama.Clear()
labelSambutan.Text = String.Empty
End Sub
End ClassKetiganya bekerja sebagai berikut. Event Load diterbitkan satu kali tepat sebelum form ditampilkan, sehingga handler FormPesanDimuat hanya mengganti judul jendela pada saat itu. Event TextChanged diterbitkan setiap kali isi TextBox berubah, termasuk setiap ketukan tombol huruf, sehingga label sambutan mengikuti ketikan secara langsung dan tombol Bersihkan ikut diaktifkan bila isinya tidak kosong. Event Click diterbitkan ketika tombol ditekan, dan handler TombolBersihDiklik mengosongkan TextBox sekaligus labelnya, sehingga tombol tersebut otomatis dinonaktifkan kembali lewat handler TextChanged.
Mengaitkan dengan klausa Handles#
Cara pertama adalah klausa Handles yang ditulis pada akhir deklarasi prosedur. Prosedur InputNamaBerubah terpasang pada event TextChanged milik inputNama dengan cara itu, sedangkan FormPesanDimuat terpasang pada event Load milik formnya sendiri melalui MyBase.Load. Compiler menyusun pendaftarannya secara otomatis, sehingga tidak ada baris kode pengaitan yang perlu ditulis dan handler tidak mungkin terlupa.
Klausa Handles menuntut sumber event berupa variabel WithEvents, yaitu field yang dideklarasikan dengan kata kunci tersebut. WithEvents membuat compiler menghasilkan pendaftaran dan pelepasan handler secara otomatis ketika field diberi nilai, sehingga pengaitan tetap benar meskipun kontrol dibuat belakangan. Templat Visual Studio menggunakan pola yang sama pada setiap kontrol yang diseret ke form, sehingga klausa Handles menjadi gaya yang paling lazim di proyek Windows Forms.
Mengaitkan dengan AddHandler#
Cara kedua adalah pernyataan AddHandler yang mendaftarkan handler pada saat pernyataan itu dieksekusi. Bentuknya berupa dua argumen, yaitu alamat event seperti tombolBersih.Click dan rujukan prosedur melalui AddressOf. Pada berkas contoh, baris AddHandler tombolBersih.Click, AddressOf TombolBersihDiklik memasang handler tombol Bersihkan lewat cara ini.
AddHandler unggul ketika pendaftaran baru mungkin dilakukan saat program berjalan. Kontrol yang dibuat di dalam perulangan, handler yang berganti-ganti, atau pendaftaran yang bergantung pada kondisi tertentu lebih mudah ditulis dengan cara ini. Pasangannya, RemoveHandler, melepaskan kembali handler yang sudah terdaftar, sedangkan klausa Handles tidak menyediakan pelepasan sewaktu-waktu.
' tidak-dijalankan
For Each nama As String In daftarNama
Dim tombol As New Button() With {.Text = nama}
AddHandler tombol.Click, AddressOf TombolNamaDiklik
Controls.Add(tombol)
NextMemilih antara Handles dan AddHandler#
| Aspek | Klausa Handles | AddHandler |
|---|---|---|
| Penulisan | pada deklarasi prosedur, lewat WithEvents | pernyataan tersendiri dengan AddressOf |
| Waktu pengaitan | saat form dibuat | kapan pun saat program berjalan |
| Pelepasan handler | tidak tersedia | tersedia lewat RemoveHandler |
| Penggunaan lazim | kontrol tetap buatan designer | kontrol dinamis dan pendaftaran bersyarat |
Kedua cara menghasilkan pendaftaran yang sama di tingkat .NET, sehingga tidak ada perbedaan kecepatan yang berarti. Pemilihannya bergantung pada kapan pengaitan diperlukan dan seberapa dinamis kontrolnya, bukan pada benar dan salah. Banyak proyek menggunakan keduanya sekaligus, sebagaimana form contoh pada topik ini, dan memilih satu gaya untuk satu kontrol membuat asal-usul setiap handler mudah dilacak saat kode dibaca ulang.
Kesalahan umum#
Tiga kesalahan berikut paling sering ditemui saat menulis handler.
- Memasang klausa
Handlespada field yang tidak dideklarasikanWithEvents. Compiler menolaknya dengan pesan bahwa klausa Handles membutuhkan variabel WithEvents pada tipe yang sama. Perbaikannya adalah menambahkanWithEventspada deklarasi atau beralih keAddHandler. - Memasang satu handler dua kali, misalnya lewat
HandlessekaligusAddHandler. Prosedurnya tetap satu, tetapi terdaftar dua kali pada event yang sama. - Menuliskan tanda tangan yang tidak cocok, misalnya parameter kedua bertipe
KeyEventArgsuntuk event Click. Compiler menolak pendaftarannya karena tanda tangan handler harus sama dengan event yang dituju, dan perbaikannya adalah mengembalikan bentuksender As Object, e As EventArgs.
Ringkasan#
- Aplikasi berjendela bekerja dengan pola menunggu dan merespons, sedangkan event adalah pemberitahuan bahwa sesuatu telah terjadi, diterbitkan oleh kontrol dan diterima oleh event handler.
- Handler Windows Forms menggunakan tanda tangan
sender As Object, e As EventArgs, dengansenderberisi penerbit event danemembawa datanya. - Klausa
Handlesmengaitkan handler secara otomatis pada fieldWithEvents, sedangkanAddHandlermendaftarkannya saat program berjalan dan dapat dilepas denganRemoveHandler. - Load diterbitkan sekali sebelum form tampil, TextChanged pada setiap perubahan isi TextBox, dan Click ketika tombol ditekan.
Referensi#
- Event handlers in Windows Forms — Microsoft Learn — Gambaran umum handler event pada Windows Forms.
- Handling and raising events — .NET — Microsoft Learn — Mekanisme event dan delegate pada .NET.
- Events (Visual Basic) — Microsoft Learn
— Panduan event di Visual Basic, termasuk
WithEventsdanHandles. - Handles Clause — Microsoft Learn — Sintaks dan aturan klausa Handles.
- AddHandler Statement — Microsoft Learn — Sintaks pendaftaran handler saat program berjalan.
- Form.Load Event — Microsoft Learn — Event yang diterbitkan sebelum form ditampilkan.
- Control.Click Event — Microsoft Learn — Event klik pada semua kontrol.
- Control.TextChanged Event — Microsoft Learn — Event perubahan nilai Text pada kontrol.