Kelalaian array kontrol dari VB.NET merupakan tantangan bagi mereka yang mengajar tentang array.
- Tidak lagi mungkin untuk hanya menyalin kontrol, seperti kotak teks, dan kemudian tempel (sekali atau beberapa kali) untuk membuat array kontrol.
- Kode VB.NET untuk membuat struktur yang mirip dengan array kontrol telah, di semua buku di VB.NET yang saya beli dan online, lebih lama dan jauh lebih kompleks. Itu tidak memiliki kesederhanaan pengkodean array kontrol yang ditemukan di VB6.
Jika Anda mereferensikan pustaka kompatibilitas VB6, ada objek di sana yang bertindak sangat mirip dengan array kontrol. Untuk melihat apa yang saya maksud, cukup gunakan panduan pemutakhiran VB.NET dengan program yang berisi larik kontrol. Kodenya jelek lagi, tapi berhasil. Berita buruknya adalah Microsoft tidak akan menjamin bahwa komponen kompatibilitas akan terus didukung, dan Anda tidak seharusnya menggunakannya.
Kode VB.NET untuk membuat dan menggunakan "array kontrol" jauh lebih lama dan jauh lebih kompleks.
Menurut Microsoft, untuk melakukan sesuatu yang hampir sama dengan apa yang dapat Anda lakukan di VB 6 membutuhkan pembuatan "komponen sederhana yang menduplikasi fungsi array kontrol."
Anda memerlukan kelas baru dan formulir hosting untuk menggambarkan hal ini. Kelas sebenarnya membuat dan menghancurkan label baru. Kode kelas lengkap adalah sebagai berikut:
LabelArray Kelas Publik
Sistem Warisan. Koleksi CollectionBase
Baca PribadiHanya HostForm Sebagai _
Sistem. Windows. Formulir. Bentuk
Fungsi Publik AddNewLabel () _
Sebagai Sistem. Windows. Formulir. Label
'Buat instance baru dari kelas Label.
Dim aLabel Sebagai Sistem Baru. Windows. Formulir. Label
'Tambahkan Label ke koleksi
daftar internal.
Saya. Daftar. Tambah (aLabel)
'Tambahkan Label ke koleksi Kontrol
'dari Formulir yang dirujuk oleh bidang HostForm.
HostForm. Kontrol. Tambah (aLabel)
'Tetapkan properti awal untuk objek Label.
label Top = Hitung * 25
label Lebar = 50
label Kiri = 140
label Tag = Saya. Menghitung
label Text = "Label" & Me. Menghitung. ToString
Kembalikan aLabel
Fungsi Akhir
Sub Publik Baru (_
Tuan rumah ByVal Sebagai Sistem. Windows. Formulir. Bentuk)
HostForm = host
Saya. AddNewLabel ()
End Sub
Properti ReadOnly Publik Default _
Item (ByVal Index As Integer) As _
Sistem. Windows. Formulir. Label
Dapatkan
Kembalikan CType (Daftar Saya. Item (Indeks), _
Sistem. Windows. Formulir. Label)
End Get
Akhiri Properti
Sub Publik Hapus ()
'Periksa untuk memastikan ada Label yang harus dihapus.
Jika saya. Hitung> 0 Lalu
'Hapus Label terakhir yang ditambahkan ke array
'dari form host mengontrol koleksi.
'Perhatikan penggunaan properti default di
'mengakses array.
HostForm. Kontrol. Hapus (Saya (Hitungan. - 1))
Saya. Daftar. RemoveAt (Me. Count - 1)
Berakhir jika
End Sub
Kelas Akhir
Untuk menggambarkan bagaimana kode kelas ini akan digunakan, Anda bisa membuat Formulir yang menyebutnya. Anda harus menggunakan kode yang ditunjukkan di bawah ini dalam formulir:
Formulir Kelas Publik1. Sistem Warisan. Windows. Formulir. Bentuk. #Region "Kode yang dihasilkan Windows Form Designer" 'Anda juga harus menambahkan pernyataan:' MyControlArray = New LabelArray (Me) 'setelah panggilan InitializeComponent () di. 'Kode Wilayah tersembunyi. 'Nyatakan objek ButtonArray baru. Redupkan MyControlArray Sebagai LabelArray. Sub Pribadi btnLabelAdd_Klik (_. Pengirim ByVal Sebagai Sistem. Objek, _. ByVal e As System. EventArgs) _. Menangani btnLabelAdd. Klik. 'Panggil metode AddNewLabel. 'dari MyControlArray. MyControlArray. AddNewLabel () 'Ubah properti BackColor. 'dari Tombol 0. MyControlArray (0) .BackColor = _. Sistem. Gambar. Warna. Merah. End Sub. Sub Pribadi btnLabelRemove_Click (_. Pengirim ByVal Sebagai Sistem. Objek, _. ByVal e As System. EventArgs) _. Menangani btnLabelRemove. Klik. 'Panggil metode Hapus MyControlArray. MyControlArray. Menghapus() End Sub. Kelas Akhir
Pertama, ini bahkan tidak melakukan pekerjaan di Design Time seperti yang biasa kami lakukan di VB 6! Dan kedua, mereka tidak ada dalam array, mereka berada dalam Koleksi VB.NET - hal yang jauh berbeda dari array.
Alasan VB.NET tidak mendukung "kontrol array" VB 6 adalah bahwa tidak ada yang disebut "kontrol" "array" (perhatikan perubahan tanda kutip). VB 6 membuat koleksi di belakang layar dan membuatnya tampil sebagai array untuk pengembang. Tapi ini bukan sebuah array dan Anda memiliki sedikit kontrol atas fungsi yang disediakan melalui IDE.
VB.NET, di sisi lain, menyebutnya apa adanya: kumpulan objek. Dan mereka menyerahkan kunci kerajaan kepada pengembang dengan menciptakan semuanya langsung di tempat terbuka.
Sebagai contoh dari jenis keuntungan yang diberikan pengembang, dalam VB 6 kontrol harus dari tipe yang sama, dan mereka harus memiliki nama yang sama. Karena ini hanya objek di VB.NET, Anda bisa membuatnya berbeda jenis dan memberi mereka nama yang berbeda dan masih mengelolanya dalam kumpulan objek yang sama.
Dalam contoh ini, acara Klik yang sama menangani dua tombol dan kotak centang dan menampilkan mana yang diklik. Lakukan itu dalam satu baris kode dengan VB 6!
Sub Pribadi MixedControls_Click (_
Pengirim ByVal Sebagai Sistem. Objek, _
ByVal e As System. EventArgs) _
Menangani Tombol1. Klik, _
Button2.Klik, _
Centang Box1.Click
'Pernyataan di bawah ini harus merupakan satu pernyataan panjang!
“Ada empat baris di sini untuk membuatnya tetap sempit
Cukup untuk muat di halaman web
Label2.Text =
Microsoft Dasar visual. Benar (pengirim. GetType. ToString,
Len (pengirim. GetType. ToString) -
(InStr (pengirim. GetType. ToString, "Formulir") + 5))
End Sub
Perhitungan substring agak rumit, tetapi sebenarnya bukan yang kita bicarakan di sini. Anda dapat melakukan apa saja di acara Klik. Anda bisa, misalnya, menggunakan Jenis kontrol dalam pernyataan Jika untuk melakukan hal yang berbeda untuk kontrol yang berbeda.
Umpan Balik Kelompok Studi Komputasi Frank tentang Array
Kelompok Studi Frank memberikan contoh dengan formulir yang memiliki 4 label dan 2 tombol. Tombol 1 membersihkan label dan Tombol 2 mengisinya. Sebaiknya baca lagi pertanyaan asli Frank dan perhatikan bahwa contoh yang digunakannya adalah loop yang digunakan untuk menghapus properti Caption dari array komponen Label. Berikut ini setara dengan VB.NET dari kode VB 6 itu. Kode ini melakukan apa yang awalnya diminta oleh Frank!
Formulir Kelas Publik1. Sistem Warisan. Windows. Formulir. Bentuk. #Region "Kode yang dihasilkan Windows Form Designer" Dim LabelArray (4) Sebagai Label. 'mendeklarasikan array label. Sub Formulir Pribadi1_Load (_. Pengirim ByVal Sebagai Sistem. Objek, _. ByVal e As System. EventArgs) _. Menangani MyBase. Beban. SetControlArray () End Sub. Sub SetControlArray () LabelArray (1) = Label1. LabelArray (2) = Label2. LabelArray (3) = Label3. LabelArray (4) = Label4. End Sub. Sub Tombol Pribadi1_Klik (_. Pengirim ByVal Sebagai Sistem. Objek, _. ByVal e As System. EventArgs) _. Menangani Tombol1.Klik. 'Tombol 1 Hapus Array. Dim a Sebagai Integer. Untuk a = 1 hingga 4. LabelArray (a) .Text = "" Lanjut. End Sub. Sub Tombol Pribadi2_Klik (_. Pengirim ByVal Sebagai Sistem. Objek, _. ByVal e As System. EventArgs) _. Menangani Tombol2.Klik. Tombol 2 Isi Array. Dim a Sebagai Integer. Untuk a = 1 hingga 4. LabelArray (a) .Text = _. "Array Kontrol" & CStr (a) Lanjut. End Sub. Kelas Akhir
Jika Anda bereksperimen dengan kode ini, Anda akan menemukan bahwa selain menetapkan properti Label, Anda juga dapat memanggil metode. Jadi mengapa saya (dan Microsoft) bersusah payah membangun kode "Jelek" di Bagian I artikel?
Saya harus tidak setuju bahwa itu benar-benar "Array Kontrol" dalam pengertian VB klasik. VB 6 Control Array adalah bagian yang didukung dari sintaks VB 6, bukan hanya teknik. Bahkan, mungkin cara untuk menggambarkan contoh ini adalah bahwa itu adalah array kontrol, bukan Array Kontrol.
Pada Bagian I, saya mengeluh bahwa contoh Microsoft HANYA bekerja pada waktu berjalan dan bukan waktu desain. Anda dapat menambah dan menghapus kontrol dari formulir secara dinamis, tetapi semuanya harus diimplementasikan dalam kode. Anda tidak dapat menarik dan melepas kontrol untuk membuatnya seperti yang Anda bisa di VB 6. Contoh ini bekerja terutama pada waktu desain dan bukan pada waktu berjalan. Anda tidak dapat menambah dan menghapus kontrol secara dinamis saat dijalankan. Di satu sisi, itu kebalikan dari contoh Bagian I.
Contoh array kontrol VB 6 klasik adalah yang sama yang diimplementasikan dalam kode .NET VB. Di sini, dalam kode VB 6 (ini diambil dari Mezick & Hillier, Panduan Ujian Sertifikasi Visual Basic 6, hal 206 - sedikit dimodifikasi, karena contoh dalam buku menghasilkan kontrol yang tidak dapat dilihat):
Redupkan MyTextBox sebagai VB.TextBox. IntNumber statis sebagai Integer. intNumber = intNumber + 1. Setel MyTextBox = _. Saya. Kontrol. Tambah ("VB.TextBox", _. "Teks" & intNumber) MyTextBox. Text = MyTextBox. Nama. MyTextBox. Terlihat = Benar. MyTextBox. Kiri = _. (intNumber - 1) * 1200
Tetapi sebagaimana Microsoft (dan saya) setuju, array kontrol VB 6 tidak dimungkinkan di VB.NET. Jadi yang terbaik yang dapat Anda lakukan adalah menduplikasi fungsinya. Artikel saya menduplikasi fungsi yang ditemukan dalam contoh Mezick & Hillier. Kode Kelompok Studi menduplikasi fungsi untuk dapat mengatur properti dan metode panggilan.
Jadi intinya adalah bahwa itu benar-benar tergantung pada apa yang ingin Anda lakukan. VB.NET tidak menyelesaikan semuanya sebagai bagian dari bahasa - Namun - tetapi pada akhirnya itu jauh lebih fleksibel.
Take Fays Control John Fannon
John menulis: Saya perlu array kontrol karena saya ingin meletakkan tabel angka sederhana pada formulir di run time. Saya tidak ingin mual menempatkan mereka semua secara individu dan saya ingin menggunakan VB.NET. Microsoft menawarkan solusi yang sangat terperinci untuk masalah sederhana, tetapi ini adalah palu godam yang sangat besar untuk memecahkan kacang yang sangat kecil. Setelah beberapa percobaan, saya akhirnya menemukan solusi. Begini cara saya melakukannya.
Contoh Tentang Visual Basic di atas menunjukkan bagaimana Anda bisa membuat TextBox pada Formulir dengan membuat instance objek, pengaturan properti, dan menambahkannya ke koleksi Kontrol yang merupakan bagian dari Formulir obyek.
Dim txtDataShow As New TextBox
txtDataShow. Tinggi = 19
txtDataShow. Lebar = 80
txtDataShow. Lokasi = Titik Baru (X, Y)
Saya. Kontrol. Tambah (txtDataShow)
Meskipun solusi Microsoft menciptakan Kelas, saya beralasan bahwa akan mungkin untuk membungkus semua ini dalam subrutin sebagai gantinya. Setiap kali Anda memanggil subrutin ini, Anda membuat instance baru dari kotak teks pada formulir. Berikut kode lengkapnya:
Formulir Kelas Publik1
Sistem Warisan. Windows. Formulir. Bentuk
#Region "Kode yang dihasilkan Windows Form Designer"
Sub Pribadi BtnStart_Klik (_
Pengirim ByVal Sebagai Sistem. Objek, _
ByVal e As System. EventArgs) _
Menangani btn Mulai. Klik
Dim I As Integer
Dim sData As String
Untuk I = 1 hingga 5
sData = CStr (I)
Panggil AddDataShow (sData, I)
Lanjut
End Sub
Sub AddDataShow (_
ByVal sText As String, _
ByVal I As Integer)
Dim txtDataShow As New TextBox
Redup UserLft, UserTop Sebagai Integer
Dim X, Y Sebagai Integer
UserLft = 20
UserTop = 20
txtDataShow. Tinggi = 19
txtDataShow. Lebar = 25
txtDataShow. TextAlign = _
Penjajaran Horizontal. Pusat
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Text = sText
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. Tinggi
txtDataShow. Lokasi = Titik Baru (X, Y)
Saya. Kontrol. Tambah (txtDataShow)
End Sub
Kelas Akhir
Poin yang sangat bagus, John. Ini tentu jauh lebih sederhana daripada kode Microsoft... jadi saya bertanya-tanya mengapa mereka bersikeras melakukannya dengan cara itu?
Untuk memulai penyelidikan kami, mari kita coba mengubah salah satu tugas properti dalam kode. Ayo berubah
txtDataShow. Tinggi = 19
untuk
txtDataShow. Tinggi = 100
hanya untuk memastikan bahwa ada perbedaan yang nyata.
Ketika kami menjalankan kode lagi, kami... Whaaaat??? ... hal yang sama. Tidak ada perubahan sama sekali. Bahkan, Anda dapat menampilkan nilai dengan pernyataan seperti MsgBox (txtDataShow. Tinggi) dan Anda masih mendapatkan 20 sebagai nilai properti, apa pun yang Anda tetapkan. Mengapa itu terjadi?
Jawabannya adalah bahwa kita tidak menurunkan Kelas kita sendiri untuk membuat objek, kita hanya menambahkan sesuatu ke Kelas lain sehingga kita harus mengikuti aturan kelas lain. Dan aturan tersebut menyatakan bahwa Anda tidak dapat mengubah properti Height. (Baiklah... kamu bisa. Jika Anda mengubah properti Multiline ke True, maka Anda dapat mengubah Tinggi.)
Mengapa VB.NET terus maju dan mengeksekusi kode bahkan tanpa merintih bahwa mungkin ada sesuatu yang salah ketika, pada kenyataannya, itu benar-benar mengabaikan pernyataan Anda adalah keluhan keseluruhan. Saya mungkin menyarankan setidaknya peringatan dalam kompilasi. (Petunjuk! Petunjuk! Petunjuk! Apakah Microsoft mendengarkan?)
Contoh dari Bagian I mewarisi dari Kelas lain, dan ini membuat properti tersedia untuk kode di Kelas pewarisan. Mengubah properti Ketinggian menjadi 100 dalam contoh ini memberi kami hasil yang diharapkan. (Lagi... satu penafian: Ketika sebuah instance baru dari komponen Label besar dibuat, itu menutupi yang lama. Untuk benar-benar melihat komponen Label baru, Anda harus menambahkan metode panggilan aLabel. Bawa ke depan().)
Contoh sederhana ini menunjukkan bahwa, meskipun kita BISA hanya menambahkan objek ke Kelas lain (dan kadang-kadang ini adalah hal yang benar untuk dilakukan), kontrol pemrograman atas objek mengharuskan kita menurunkan mereka dalam Kelas dan cara yang paling terorganisir (berani saya katakan, "cara .NET" ??) adalah untuk membuat properti dan metode dalam Kelas turunan baru untuk mengubah sesuatu. John tetap tidak yakin pada awalnya. Dia mengatakan bahwa pendekatan barunya sesuai dengan tujuannya meskipun ada batasan untuk tidak menjadi "COO" (Berorientasi Objek dengan Benar). Namun, baru-baru ini, John menulis,
"... setelah menulis satu set 5 kotak teks pada saat runtime, saya ingin memperbarui data di bagian selanjutnya dari program - tetapi tidak ada yang berubah - data asli masih ada.
Saya menemukan bahwa saya bisa menyelesaikan masalah dengan menulis kode untuk melepas kotak-kotak lama dan meletakkannya kembali dengan data baru. Cara yang lebih baik untuk melakukannya adalah dengan menggunakan Aku. Menyegarkan. Tetapi masalah ini telah menarik perhatian saya pada kebutuhan untuk menyediakan metode untuk mengurangi kotak teks serta menambahkannya. "
Kode John menggunakan variabel global untuk melacak berapa banyak kontrol yang telah ditambahkan ke formulir sehingga metode ...
Sub Formulir Pribadi1_Load (_
Pengirim ByVal Sebagai Sistem. Objek, _
ByVal e As System. EventArgs) _
Menangani MyBase. Beban
CntlCnt0 = Saya. Kontrol. Menghitung
End Sub
Maka kontrol "terakhir" dapat dihapus ...
N = Saya. Kontrol. Hitung - 1
Saya. Kontrol. RemoveAt (N)
John mencatat bahwa, "mungkin ini agak canggung."
Begitulah cara Microsoft melacak objek di COM AND dalam kode contoh "jelek" mereka di atas.
Saya sekarang telah kembali ke masalah secara dinamis membuat kontrol pada formulir di run time dan saya telah melihat lagi pada artikel 'Apa yang Terjadi pada Array Kontrol'.
Saya telah membuat kelas dan sekarang dapat menempatkan kontrol ke formulir seperti yang saya inginkan.
John mendemonstrasikan cara mengontrol penempatan kontrol dalam kotak grup menggunakan kelas baru yang telah ia mulai gunakan. Mungkin Microsoft benar dalam solusi "jelek" mereka!