Terkadang Anda akan berada di suatu kondisi dimana anda harus melakukan 1 event yang sama untuk banyak kontrol dalam 1 form. Misalnya pada form yang Anda buat, terdapat 20 textbox yang boleh hanya diisi huruf saja. Normalnya anda akan melakukan hal ini pada form tersebut.
Form1.vb Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub Private Sub Text2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text2.KeyPress If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub Private Sub Text3_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text3.KeyPress If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub ... Private Sub Text20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text20.KeyPress If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub
Tidak ada yang salah dengan cara ini, hanya saja Anda melakukan banyak pengulangan script yang sama dalam form tersebut. Akan lebih baik jika script yang sama tersebut dikumpulkan dalam 1 fungsi, dan Anda hanya tinggal memanggil fungsi tersebut. Sehingga hasilnya menjadi seperti berikut.
Form1.vb Private Sub Text_KeyPress(sender As Object, e As KeyPressEventArgs) If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress Text_KeyPress(Me, e) End Sub Private Sub Text2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text2.KeyPress Text_KeyPress(Me, e) End Sub Private Sub Text3_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text3.KeyPress Text_KeyPress(Me, e) End Sub ... Private Sub Text20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text20.KeyPress Text_KeyPress(Me, e) End Sub
Script diatas sudah bagus. Lalu bagaimana jika Anda memiliki 5 form dengan jumlah kontrol dan nama yang berbeda? Maka Anda akan menggunakan script diatas pada setiap form yang ada. Tentunya hal ini merupakan pengulangan script yang sama dan sangat tidak praktis untuk dilakukan. Akan lebih baik jika event KeyPress ini dapat diletakkan ke dalam sebuah modul, dan Anda dapat memanggilnya dalam setiap form. Sehingga hasilnya seperti ini
Module1.vb Private Sub Text_KeyPress(sender As Object, e As KeyPressEventArgs) If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub Form1.vb Imports Module1.vb Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress Text_KeyPress(Me, e) End Sub Private Sub Text2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text2.KeyPress Text_KeyPress(Me, e) End Sub Private Sub Text3_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text3.KeyPress Text_KeyPress(Me, e) End Sub ... Private Sub Text20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text20.KeyPress Text_KeyPress(Me, e) End Sub Form2.vb Imports Module1.vb Private Sub TextNama_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextNama.KeyPress Text_KeyPress(Me, e) End Sub Private Sub TextAlamat_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextAlamat.KeyPress Text_KeyPress(Me, e) End Sub Private Sub TextTelp_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextTelp.KeyPress Text_KeyPress(Me, e) End Sub
Cara ini masih dapat dioptimasi lagi. Bagaimana caranya agar Anda dapat memberikan event Keypress tanpa melakukan kopi script ini secara manual?
Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress Text_KeyPress(Me, e) End Sub
Jawabannya adalah Anda memberikan event KeyPress tersebut pada saat runtime. Anda hanya menambahkan script untuk menambahkan handle KeyPress untuk setiap kontrol tersebut pada modul, dan Anda tinggal memanggil fungsi tersebut pada saat form dibuka. Maka hasil akhir scriptnya adalah sebagai berikut.
Module1.vb Public Sub KeyPressLetterOnly(sender As Object, e As KeyPressEventArgs) If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub Public Sub SetAddHandler(ByVal oControl As Control, ByVal sCommand As String, ByVal sEvent As String) If sCommand = "KeyPress" Then If sEvent = "KeyPressLetterOnly" Then RemoveHandler oControl.KeyPress, AddressOf KeyPressLetterOnly AddHandler oControl.KeyPress, AddressOf KeyPressLetterOnly End If End If End Sub Form1.vb Imports Module1.vb Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load SetAddHandler(Text1, "KeyPress", "KeyPressLetterOnly") SetAddHandler(Text2, "KeyPress", "KeyPressLetterOnly") SetAddHandler(Text3, "KeyPress", "KeyPressLetterOnly") ... SetAddHandler(Text20, "KeyPress", "KeyPressLetterOnly") End Sub Form2.vb Imports Module1.vb Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load SetAddHandler(TextNama, "KeyPress", "KeyPressLetterOnly") SetAddHandler(TextAlamat, "KeyPress", "KeyPressLetterOnly") SetAddHandler(TextTelp, "KeyPress", "KeyPressLetterOnly") End Sub
Dengan cara ini, Anda dapat dengan mudah menambahkan / mengurangi sebuah event untuk tiap kontrolnya. Anda hanya cukup menambahkan 1 baris script dibandingkan dengan sebelumnya yang harus menambahkan 3 baris script. Sehingga tidak lagi ditemukan pengulangan script pada semua form yang digunakan.
Seandainya pun ada event baru, misalnya KeyPress yang hanya berisi angka saja, maka Anda tinggal memodifikasi sedikit script diatas, sehingga hasil nya sebagai berikut.
Module1.vb Public Sub KeyPressLetterOnly(sender As Object, e As KeyPressEventArgs) If Not Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub Public Sub KeyPressDigitOnly(sender As Object, e As KeyPressEventArgs) If Not Char.IsDigit(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub Public Sub SetAddHandler(ByVal oControl As Control, ByVal sCommand As String, ByVal sEvent As String) If sCommand = "KeyPress" Then If sEvent = "KeyPressLetterOnly" Then RemoveHandler oControl.KeyPress, AddressOf KeyPressLetterOnly AddHandler oControl.KeyPress, AddressOf KeyPressLetterOnly ElseIf sEvent = "KeyPressDigitOnly" Then RemoveHandler oControl.KeyPress, AddressOf KeyPressDigitOnly AddHandler oControl.KeyPress, AddressOf KeyPressDigitOnly End If End If End Sub Form1.vb Imports Module1.vb Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load SetAddHandler(Text1, "KeyPress", "KeyPressDigitOnly") SetAddHandler(Text2, "KeyPress", "KeyPressDigitOnly") SetAddHandler(Text3, "KeyPress", "KeyPressLetterOnly") ... SetAddHandler(Text20, "KeyPress", "KeyPressLetterOnly") End Sub Form2.vb Imports Module1.vb Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load SetAddHandler(TextNama, "KeyPress", "KeyPressLetterOnly") SetAddHandler(TextAlamat, "KeyPress", "KeyPressLetterOnly") SetAddHandler(TextTelp, "KeyPress", "KeyPressDigitOnly") End Sub
Script tersebut tidak terbatas pada kontrol TextBox dan Event KeyPress saja. Anda bisa menggunakan kontrol lain misalnya ComboBox, dengan event lain, misalnya GotFocus. Anda tinggal memodifikasi script tersebut sehingga sesuai dengan keinginan Anda.
Selamat mencoba!