Monday, December 12, 2016

Bab 3: Visual Basic .NET: Langkah Demi Langkah



BEKERJA DENGAN STRUKTUR DATA PADA VB.NET


APA YANG AKAN ANDA PELAJARI PADA BAB INI:
1. Menggunakan array
2. Bekerja dengan enumerasi
3.  Menggunakan konstanta
4.  Bekerja dengan struktur

Pada bab-bab terdahulu, Anda telah bekerja dan menggunakan sejumlah tipe data sederhana, seperti variabel Integer dan String. Meskipun kedua tipe data ini berguna pada banyak situasi, tetapi pada program yang lebih kompleks, struktur data sangat diperlukan. Struktur data adalah sekelompok elemen data yang diorganisir menjadi satu entitas atau unit. Pada bab ini, Anda akan belajar tentang sejumlah struktur data yang tersedia pada Visual Basic. Anda akan melihat sejumlah cara dimana Anda dapat menggunakan himpunan data yang kompleks. Terakhir, Anda akan belajar bagaimana membangun kelas-kelas koleksi untuk menciptakan dan memanipulasi list-list yang memuat data kompleks.

MEMAHAMI ARRAY
Salah satu hal yang sering dijumpai dalam menuliskan piranti lunak adalah kebutuhan akan list atau daftar yang memuat data yang berelasi. Anda dapat menyediakan fungsionalitas ini menggunakan array. Array memuat sejumlah elemen dengan tipe data sama. Sebagai contoh, Anda bisa saja ingin menyimpan beberapa umur dari sejumlah teman Anda di dalam suatu array integer atau nama-nama teman Anda di dalam sebuah array string.

Bagian ini akan menjelaskan bagaimana mendefinisikan, mengisi, dan menggunakan array pada aplikasi-aplikasi Anda.

Mendefinisikan dan Menggunakan Array
Ketika Anda mendefinisikan sebuah array, Anda sebenarnya sedang menciptakan sebuah variabel yang memuat lebih dari satu dimensi. Sebagai contoh, jika Anda mendefinisikan sebuah variabel sebagai suatu string, Anda hanya dapat memuat satu nilai string di dalamnya:

Dim strNama As String


Namun, dengan array Anda dapat menciptakan sejenis efek pengganda pada suatu variabel, sehingga Anda dapat memiliki lebih dari satu nilai di dalam suatu variabel. Array didefinisikan dengan memberikan ukuran array setelah nama variabel. Sebagai contoh, jika Anda ingin mendefinisikan sebuah array string dengan 10 elemen, Anda melakukan ini:

Dim strNama(9) As String


Ketika Anda memiliki sebuah array, Anda dapat mengakses elemen-elemen individual di dalamnya dengan memberikan sebuah nilai indeks antara 0 sampai nilai maksimum yang mungkin. Nilai maksimum yang mungkin ini adalah ukuran array yang dikurangi dengan 1.

Sebagai contoh, untuk menetapkan elemen dengan indeks 2 di dalam array, Anda melakukan ini:

strNama(2) = "Vivian"


Untuk mmbaca elemen tersebut, Anda melakukan ini:

MessageBox.Show(strNama(2))

Apa yang penting adalah bahwa elemen-elemen lain di dalam array tetap tidak terpengaruh ketika Anda menetapkan elemen tertentu. Jadi, jika Anda melakukan ini:

strNama(3) = "Beti"


strNama(2) tetap memuat “Vivian”.


LATIHAN
Mendefinisikan dan Menggunakan Sebuah Array Sederhana
Cara terbaik dalam memahami array adalah dengan menuliskan kode untuk mendemonstrasikannya.

1. Klik File kemudian New Project. Pada dialog New Project, ciptakan sebuah Windows Forms Application yang baru dengan nama Demo Array.

2. Ketika mode Design untuk Form1 ditampilkan, tambahkan sebuah kontrol ListBox pada form. Dengan menggunakan jendela Properties, tetapkan proper Name menjadi listTeman dan properti IntegralHeight menjadi False.

3. Tambahkan sebuah kontrol Button pada form. Tetapkan properti Name menjadi tombolElemenArray dan tetapkan properti Text menjadi Elemen Array. Tata kontrol-kontrol Anda sehingga form tampak seperti pada Gambar 3.1.


GAMBAR 3.1

4. Klik ganda pada tombol tersebut dan tambahkan kode yang ditebalkan berikut pada event handler Click. Anda akan menerima pesan error yang menyatakan bahwa prosedur BersihkanList tidak didefinisikan. Anda dapat mengabaikan error ini karena Anda akan menambahkan prosedur ini pada langkah selanjutnya:

Private Sub tombolElemenArray_Click(sender As Object, e As EventArgs)
  Handles tombolElemenArray.Click
    'Membersikan list
    BersihkanList()

    'Mendeklarasikan sebuah array
    Dim strTeman(4) As String

    'Mengisi array
    strTeman(0) = "Widi"
    strTeman(1) = "Hari"
    strTeman(2) = "Jodi"
    strTeman(3) = "Misel"
    strTeman(4) = "Rico"

    'Menambahkan item pertama di dalam array pada list
    listTeman.Items.Add(strTeman(0))
End Sub

5.    Sekarang ciptakan prosedur berikut:

Private Sub BersihkanList()
    'Membersikan list
    listTeman.Items.Clear()
End Sub

6.  Simpan projek Anda dengan mengklik tombol Save All pada toolbar dan kemudian jalankan program. Ketika form ditampilkan, klik tombol Elemen Array. Kotak list pada form Anda akan diisi dengan nama Widi.

Penjelasan
Pada contoh ini, Anda membersihkan kotak list dengan memanggil metode BersihkanList. Meskipun list kosong pada titik ini, Anda akan menambahkan tombol-tombol lain pada projek inipada latihan-latihan selanjutnya, dan membandingkan hasil yang didapat dari tiap tombol:

'Membersikan list
BersihkanList()


Ketika Anda mendefinisikan sebuah array, Anda perlu menetapkan tipe data dan ukuran array. Pada kasus ini, Anda menetapkan sebuah array dengan tipe data String dan menetapkan ukuran array 5. Ingat bahwa cara dalam mendefinisikan ukuran array sedikit memerlukan kehati-hatian. Anda perlu menetapkan ukuran dengan ukuran akhir dikurangi dengan satu. Oleh karena itu, di sini Anda menggunakan baris berikut:

'Mendeklarasikan sebuah array
 Dim strTeman(4) As String


Dengan cara ini, Anda akan memiliki sebuah array dengan ukuran 5. Cara lain dalam mengekspresikan ini adalah bahwa Anda memiliki sebuah array yang memuat 5 elemen.

Setelah selesai, Anda telah memiliki sebuah array, dan Anda dapat mengakses setiap item di dalam array menggunakan indeks. Indeks diberikan sebagai suatu nilai di dalam kurung setelah nama array. Indeks diawali dari nol dan berakhir dengan banyak item dikurangi satu. Contoh berikut menetapkan lima item di dalam array:

'Mengisi array
strTeman(0) = "Widi"
strTeman(1) = "Hari"
strTeman(2) = "Jodi"
strTeman(3) = "Misel"
strTeman(4) = "Rico"


Sama seperti Anda dapat menggunakan indeks untuk mengisi array, Anda juga dapat menggunakannya untuk membaca elemen array. Pada kasus ini,Anda akan menampilkan item pertama di dalam array pada kotak list:

'Menambahkan item pertama di dalam array pada list
listTeman.Items.Add(strTeman(0))


Metode yang Anda mendefinisikan hanya memuat sebaris kode tetapi pendaur-ulangannya didemonstrasikan pada latihan berikut. Metode ini hanya membersikan koleksi Items pada kotak list:

Private Sub BersihkanList()
'Membersikan list
listTeman.Items.Clear()
End Sub



Menggunakan For Each…Next
Salah satu cara umum dalam menggunakan array adalah dengan memanfaatkan loop For Each…Next. Loop ini telah dikenalkan pada Bab 2, ketika Anda menggunakannya dengan sebuah koleksi string yang dihasilkan dari metode My.Computer.FileSystem.GetDirectories.

LATIHAN
Menggunakan For Each…Next dengan Array
Latihan ini mendemonstrasikan bagaimana Anda menggunakan loop For Each…Next dengan sebuah array.

1.  Tutup program Anda jika ia sedang dijalankan dan buka editor kode untuk Form1. Tambahkan deklarasi variabel yang ditebalkan berikut di bagian atas dari kelas form Anda:

Public Class Form1
    'Mendeklarasikan sebuah array level form
    Private strTeman(4) As String

2.   Pada jendela properties, pilih event Load untuk Form1. Ini akan menyebabkan event handler Form1_Load disisipkan pada kode Anda. Tambahkan kode yang ditebalkan berikut pada prosedur ini:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Mengisi array
    strTeman(0) = "Widi"
    strTeman(1) = "Hari"
    strTeman(2) = "Jodi"
    strTeman(3) = "Misel"
    strTeman(4) = "Rico"
End Sub

3.   Kembali ke mode Design dan tambahkan kontrol Button lain. Tetapkan properti Name menjadi tombolEnumerasiArray dan properti Text menjadi Enumerasi Array.

4. Klik ganda pada tombol ini dan tambahkan kode yang ditebalkan berikut pada event handler Click:

Private Sub tombolEnumerasiArray_Click(sender As Object, e As EventArgs)
   Handles tombolEnumerasiArray.Click
     'Membersikan list
     BersihkanList()

     'Mengenumerasi array
     For Each strNama As String In strTeman
         'Menambahkan item array pada list
         listTeman.Items.Add(strNama)
     Next
End Sub

5.  Jalankan projek dan klik tombol ini. Anda akan melihat hasil seperti ditunjukkan pada Gambar 3.2.


GAMBAR 3.2

Penjelasan
Anda memulai latihan ini dengan mendeklarasikan sebuah variabel array yang merupakan variabel lokal pada form, yang berarti bahwa variabel ini tersedia bagi semua prosedur di dalam kelas form. Ketika variabel dideklarasikan di luar dari suatu metode di dalam kelas form, variabel itu tersedia bagi semua metode di dalam form:

'Mendeklarasikan sebuah array level form
Private strTeman(4) As String


Selanjutnya, Anda menambahkan event handler Load untuk form dan kemudian menambahkan kode untuk mengisi array. Prosedur ini dipanggil kapanpun form dimuat, yang memastikan bahwa array Anda selalu terisi:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Mengisi array
    strTeman(0) = "Widi"
    strTeman(1) = "Hari"
    strTeman(2) = "Jodi"
    strTeman(3) = "Misel"
    strTeman(4) = "Rico"
End Sub


Bab 2 menunjukkan loop For Each…Next beriterasi pada sebuah koleksi string; pada contoh ini, koleksi string tersebut berada di dalam sebuah array. Prinsipnya sama; Anda menciptakan sebuah variabel kendali yang bertipe For Each…Next data sama dengan elemen array. Hal ini dilakukan dalam satu baris kode. Variabel kendali, strNama, dideklarasikan dan digunakan pada statemen For Each dengan menggunakan katakunci As String.

Internal di balik loop menjejak array yang diawali pada elemen 0 sampai elemen array terakhir. Untuk tiap iterasi, Anda dapat memeriksa nilai dari variabel kendali dan melakukan sesuatu padanya; pada kasus ini, Anda menambahkan nama pada list:

'Mengenumerasi array
For Each strNama As String In strTeman
    'Menambahkan item array pada list
    listTeman.Items.Add(strNama)
Next


Perhatikan bahwa item-item ditambahkan pada list dengan urutan yang sama seperti sesuai dengan urutannya di dalam array. Hal ini karena For Each…Next menjejak dari item pertama sampai item terakhir.




Melewatkan Array Sebagai Parameter
Pelewatan array sebagai parameter kepada suatu fungsi adalah hal yang sangat berguna. Hal ini didemonstrasikan pada latihan berikut.

LATIHAN
Melewatkan Array Sebagai Parameter
Pada latihan ini, Anda akan melihat bagaimana melewatkan sebuah array kepada suatu fungsi sebagai parameter.
1.   Kembali ke form Design pada projek Demo Array dan tambahkan kontrol Button lain. Tetapkan properti Name menjadi tombolArraySebagaiParameter dan properti Text menjadi Array Sebagai Parameter.

2.  Klik ganda pada tombol dan tambahkan kode yang ditebalkan berikut pada event handler Click. Anda akan menerima pesan error yang menyatakan bahwa prosedur TambahkanItemPadaList tidak didefinisikan. Anda dapat mengabaikan error ini karena Anda akan menambahkan prosedur ini pada langkah selanjutnya:

Private Sub tombolArraySebagaiParameter_Click(sender As Object, e As EventArgs)
   Handles tombolArraySebagaiParameter.Click
    'Membersikan list
    BersihkanList()

    ‘Tampilkan teman Anda
    TambahkanItemPadaList(strTeman)
End Sub

3.    Tambahkan prosedur TambahkanItemPadaList sebagai berikut:

Private Sub TambahkanItemPadaList(ByVal arrayList() As String)
    'Mengenumerasi array
    For Each strNama As String In arrayList
        'Menambahkan item array pada list
        listTeman.Items.Add(strNama)
    Next
End Sub

4. Jalankan projek dan klik pada tombol ini. Anda akan melihat hasil yang sama seperti ditunjukkan pada Gambar 3.2.

Penjelasan
Tekniknya di sini adalah memberitahu metode TambahkanItemPadaList bahwa parameter yang diharapkan adalah sebuah array bertipe String. Anda melakukan inidengan menggunakan header prosedur berikut:

Private Sub TambahkanItemPadaList(ByVal arrayList() As String)


Jika Anda menetapkan sebuah array tetapi tidak mendefinisikan ukuran array (atau nilai batas atas), maka Anda sedang memberitahu Visual Basic bahwa Anda tidak mengetahui atau tidak peduli seberapa besar array itu. Ini berarti bahwa Anda dapat melewatkan sebuah array dengan ukuran apapun kepada TambahkanItemPadaList. Pada prosedur tombolArraySebagaiParameter, Anda mengirimkan array semula Anda:

‘Tampilkan teman Anda
TambahkanItemPadaList(strTeman)




LATIHAN
Menambahkan Teman Lain
Apa yang terjadi jika Anda mendefinisikan array lain dengan ukuran yang berbeda? Pada latihan ini, Anda akan melihatnya.

1.   Kembali ke form Design pada projek Demo Array dan tambahkan kontrol Button lain. Tetapkan properti Name menjadi tombolParameterArrayLain dan properti Text menjadi Parameter Array Lain.

2. Klik ganda pada tombol dan tambahkan kode yang ditebalkan berikut pada event handler Click:

Private Sub tombolParameterArrayLain_Click(sender As Object, e As EventArgs)
  Handles tombolParameterArrayLain.Click
    'Membersikan list
    BersihkanList()

    'Mendeklarasikan sebuah array
    Dim strTemanLain(1) As String

    'Mengisi array
    strTemanLain(0) = "Elsa"
    strTemanLain(1) = "Debi"

    'Menampilkan teman Anda
    TambahkanItemPadaList(strTeman)
    TambahkanItemPadaList(strTemanLain)
End Sub

3.  Jalankan projek dan klik tombol ini. Anda akan melihat form yang ditunjukkan pada Gambar 3.3.


GAMBAR 3.3

Penjelasan
Apa yang telah Anda lakukan di sini adalah membuktikan bahwa array yang Anda lewatkan sebagai parameter tidak harus berukuran tetap. Anda menciptakan sebuah array baru berukuran 2 dan melewatkannya kepada fungsi TambahkanItemPadaList yang sama.


Ketika Anda menuliskan kode, Anda dapat memberitahu apakah sebuah parameter adalah bertipe array dengan melihat kurung kosong pada kotak pop-up IntelliSense, seperti ditunjukkan pada Gambar 3.4.


GAMBAR 3.4

Mengurutkan Array
Kadangkala adalah berguna untuk bisa mengurutkan sebuah array. Hal ini berguna ketika Anda menampilkan data pada user sehingga ia dapat dengan mudah mencari atau mengevaluasi data secara logis.

LATIHAN
Mengurutkan Array
Latihan ini akan mendemonstrasikan bagaimana mengurutkan array secara alfabetis.

1.   Kembali ke form Design pada projek Demo Array dan tambahkan kontrol Button lain. Tetapkan properti Name menjadi tombolUrutArray dan properti Text menjadi Urut Array.

2. Klik ganda pada tombol dan tambahkan kode yang ditebalkan berikut pada event handler Click:

Private Sub tombolUrutArray_Click(sender As Object, e As EventArgs) Handles tombolUrutArray.Click
    'Membersikan list
    BersihkanList()

    'Mengurutkan array
    Array.Sort(strTeman)

    'Menampilkan teman Anda
    TambahkanItemPadaList(strTeman)
End Sub

3.  Jalankan projek dan klik pada tombol ini. Anda akan melihat kotak list pada form Anda yang diisi dengan nama-nama dari array yang telah diurutkan secara alfabetis.

Penjelasan
Semua array secara internal diimplementasikan di dalam sebuah kelas dengan nama System.Array. Pada kasus ini, Anda menggunakan sebuah metode dengan nama Sort dari kelas itu. Metode Sort mengambil sebuah parameter, yaitu array yang akan diurutkan. Pada kasus ini, Anda menggunakan sebuah array string, jadi Anda mendapatkan pengurutan alfanumeris. Jika Anda menggunakan teknik untuk mengurutkan sebuah array yang memuat nilai-nilai integer atau titik-mengambang, maka array akan diurutkan dengan tatanan numeris.

'Mengurutkan array
Array.Sort(strTeman)




Bergerak Mundur
Loop For Each…Next menjejak array hanya dengan satu arah. Penjejakan di awali dari posisi 0 dan loop menjejak sampai akhir array. Jika Anda bermaksud untuk menjejak mundur array (dari panjang array – 1 sampai 0), Anda memiliki dua opsi.

Satu, Anda dapat menjejak loop secara mundur dengan menggunakan loop For…Next standar untuk memulai penjejakan dari batas indeks atas di dalam array sampai 0 menggunakan katakunci Step – 1, seperti ditunjukkan pada contoh berikut:


For intIndeks As Integer = strTeman.GetUpperBound(0) To 0 Step -1
    ‘Menambahkan item array pada list
    listTeman.Items.Add(strTeman(intIndeks))
Next



Cara lain, Anda dapat memanggil metode Reverse dari kelas Array untuk membalik urutan elemen array dan kemudian menggunakan loop For Each…Next.

LATIHAN
Membalikkan Array
Latihan ini akan mendemonstrasikan bagaimana mengurutkan array secara alfabetis.

1.    Kembali ke form Design pada projek Demo Array dan tambahkan kontrol Button lain. Tetapkan properti Name menjadi tombolBalikArray dan properti Text menjadi Balik Array.

2. Klik ganda pada tombol dan tambahkan kode yang ditebalkan berikut pada event handler Click:

Private Sub tombolBalikArray_Click(sender As Object, e As EventArgs) Handles tombolBalikArray.Click
    'Membersikan list
    BersihkanList()

    'Membalik urutan elemen array sehingga menjadi
    'tatanan menurun
    Array.Reverse(strTeman)

    'Menampilkan teman Anda
    TambahkanItemPadaList(strTeman)
End Sub

3. Jalankan projek dan klik pada tombol ini. Anda akan melihat teman-teman dengan urutan terbalik, seperti ditunjukkan pada Gambar 3.5.


GAMBAR 3.5

Penjelasan
Metode Reverse membalikkan urutan elemen di dalam sebuah array satu-dimensi. Dengan melewatkan array strTeman kepada metode Reverse, Anda meminta metode Reverse untuk membalikkan ulang array dari atas ke bawah:

'Membalik urutan elemen array sehingga menjadi
'tatanan menurun
Array.Reverse(strTeman)


Setelah item-item di dalam array dibalik, Anda hanya perlu memanggil prosedur TambahkanItemPadaList untuk menampilkan item-item tersebut pada list:

'Menampilkan teman Anda
TambahkanItemPadaList(strTeman)




Menginisialisasi Array
Adalah dimungkinkan untuk menciptakan sebuah array dalam Visual Basic dan mengisinya dengan satu baris kode, daripada harus menuliskan sejumlah baris kode untuk mendeklarasikan dan mengisi array, seperti ditunjukkan di sini:

'Mendeklarasikan sebuah array
Dim strTeman(4) As String

'Mengisi array
strTeman(0) = "Widi"
strTeman(1) = "Hari"
strTeman(2) = "Jodi"
strTeman(3) = "Misel"
strTeman(4) = "Rico"


LATIHAN
Membalikkan Array
Latihan ini akan mendemonstrasikan bagaimana mengurutkan array secara alfabetis.

1.   Kembali ke form Design pada projek Demo Array dan tambahkan kontrol Button lain. Tetapkan properti Name menjadi tombolInisialisasiArray dan properti Text menjadi Inisialisasi Array.

2. Klik ganda pada tombol dan tambahkan kode yang ditebalkan berikut pada event handler Click:

Private Sub tombolInisialisasiArray_Click(sender As Object, e As EventArgs)
  Handles tombolInisialisasiArray.Click
    'Membersikan list
    BersihkanList()

    'Mendeklarasikan dan mengisi array
    Dim strTemanKu() As String = {"Widi", "Hari", "Jodi",
                                  "Misel", "Rico"}

    'Menampilkan teman Anda
    TambahkanItemPadaList(strTemanKu)
End Sub

3. Jalankan projek dan klik tombol ini. Kotak list Anda akan diisi dengan teman-teman yang dimuat di dalam array.

Penjelasan
Sepasang kurung kurawl ({}) dapat Anda pakai untuk menetapkan nilai-nilai yang akan dimuat di dalam array secara langsung. Pada kasus ini, Anda memiliki lima nilai yang dimasukkan ke dalam array, yang dipisahkan dengan koma. Perhatikan bahwa ketika Anda melakukan ini, Anda tidak menetapkan batas atas untuk array; tetapi, Anda menggunakan kurung kosong. Visual Basic akan menghitung batas atas array bagi Anda berdasarkan nilai-nilai yang Anda sediakan:

'Mendeklarasikan dan mengisi array
Dim strTemanKu() As String = {"Widi", "Hari", "Jodi",
                          "Misel", "Rico"}

'Menampilkan teman Anda
TambahkanItemPadaList(strTemanKu)


Teknik ini tidak praktis ketika Anda mengisi array yang berukuran besar. Jika program Anda menggunakan array berukuran besar, Anda lebih baik menggunakan metode yang sebelumnya: menetapkan posisi elemen dan nilainya.

MEMAHAMI ENUMERASI
Sejauh ini, variabel-variabel yang telah Anda lihat secara virtual tidak memiliki keterbatasan pada jenis data yang dapat disimpan di dalamnya. Jika Anda memiliki sebuah variabel yang didefinisikan Integer, maka Anda dapat menempatkan sembarang nilai ke dalamnya. Hal yang sama berlaku pada String dan Double. Anda belum pernah melihat tipe variabel lain, yang hanya memiliki dua kemungkinan nilai: variabel Boolean hanya dapat bernilai True atau False.

Sering, ketika menuliskan kode, Anda ingin membatasi nilai-nilai yang mungkin yang dapat disimpan di dalam sebuah variabel. Sebagai contoh, jika Anda memiliki sebuah variabel yang dapat menyimpan banyak pintu yang dapat dimiliki sebuah mobil, apakah Anda ingin menyimpan nilai 1234 ke dalamnya? Tentu, tidak.

Menggunakan Enumerasi
Enumerasi memampukan Anda untuk membangun sebuah tipe variabel baru, berdasarkan salah satu dari tipe data ini: Integer, Long, Short, atau Byte. Variabel ini dapat ditetapkan menjadi salah satu dari sehimpunan nilai yang Anda definisikan, yang secara ideal mencegah seseorang dari pemberian nilai-nilai yang tak valid.

LATIHAN
Menggunakan Enumerasi
Pada latihan ini, Anda akan melihat bagaimana membangun sebuah aplikasi yang memeriksa waktu, dan berdasarkan itu Anda dapat merekam salah satu kegiatan dari sejumlah kegiatan berikut:
a.  Tidur
b.  Bersiap pergi kerja
c.  Berangkat kerja
d.  Bekerja
e.  Makan siang
f.  Berangkat pulang
g.  Bercengkerama dengan teman
h.  Bersiap tidur

1.    Ciptakanlah sebuah aplikasi Windows Forms dengan nama Demo Enum.
2.    Tetapkan properti Text dari Form1 menjadi Apa yang Dilakukan oleh Kristof?
3.    Sekarang tambahkan sebuah kontrol DateTimePicker dan tetapkan properti-properti   berikut:
                  Tetapkan Name menjadi dtpJam.
                  Tetapkan Format menjadi Time
                  Tetapkan ShowUpDown menjadi True.
                  Tetapkan Value menjadi 01:00 am.
                  Tetapkan Size menjadi 90, 20.


GAMBAR 3.6

4. Tambahkan sebuah kontrol Label pada form, tetapkan properti Name menjadi labelStatus dan properti Text-nya menjadi Status Tak Diinisialisasi. Ubah ukuran form Anda sehingga ia tampak seperti pada Gambar 3.6.

5.  Lihat editor kode dari form dengan mengklik kanan pada form dan pilih View Code dari menu konteks. Di atas kelas tambahkan enumerasi berikut:

Public Class Form1
    'Enumerasi AktifitasHari
    Private Enum AktifitasHari As Integer
        Tidur = 0
        BersiapPergiKerja = 1
        BerangkatKerja = 2
        Bekerja = 3
        MakanSiang = 4
        BerangkatPulang = 5
        BercengkeramaDenganTeman = 6
        BersiapTidur = 7
    End Enum

6. Dengan enumerasi didefinisikan, Anda dapat menciptakan variabel-variabel anggota baru yang menggunakan enumerasi sebagai tipe datanya. Tambahkan anggota ini:

'Mendeklarasikan variabel
Private StatusSekarang As AktifitasHari

7.    Tambahkan kode berikut di bawah variabel yang baru saja Anda tambahkan:

'Properti Jam
Private Property Jam() As Integer
    Get
        'Menghasilkan jam sekarang yang ditampilkan
        Return dtpJam.Value.Hour
    End Get

    Set(ByVal nil As Integer)
        'Menetapkan tanggal menggunakan jam yang dilewatkan kepada properti ini
        dtpJam.Value = New Date(Now.Year, Now.Month, Now.Day, nil, 0, 0)

        'Menetapkan teks yang ditampilkan
        labelStatus.Text = "Pada pukul " & nil & ":00, Kristof sedang "
    End Set
End Property

8.    Tambahkan event Load untuk form, dengan mengklik ganda form:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Menetapkan properti Jam menjadi jam sekarang
    Me.Jam = Now.Hour
End Sub

9.  Pilih kontrol dtpJam dan pilih event ValueChanged dari jendela Properties untuk kontrol ini. Tambahkan kode yang ditebalkan berikut pada event handler ini:

Private Sub dtpJam_ValueChanged(sender As Object, e As EventArgs) Handles dtpJam.ValueChanged
    'Memperbarui properti Jam
    Me.Jam = dtpJam.Value.Hour
End Sub

10. Simpan projek Anda dan kemudian jalankan program. Anda akan mengklik anak panah bawah dan atas pada kontrol DateTimePicker dan melihat teks yang diperbarui yang merefleksikan jam terseleksi, seperti ditunjukkan pada Gambar 3.7.


GAMBAR 3.7

Penjelasan
Pada aplikasi ini, user menggunakan kontrol DateTimePicker untuk memilih jam. Program kemudian melihat jam dan menentukan salah satu dari kedelapan status Kristof yang sesuai dengan jam tersebut. Untuk melakukan ini, Anda perlu menjejak jam. Untuk menyimpan jam, Anda menciptakan sebuah properti untuk form selain properti-properti yang dimilikinya, seperti Name dan Text. Properti baru ini dinamakan dengan Jam, dan ia dipakai untuk menetapkan jam terkini pada kontrol DateTimePicker dan kontrol Label. Properti ini didefinisikan dengan statemen Property.End Property:

Private Property Jam() As Integer
    Get
        'Menghasilkan jam sekarang yang ditampilkan
        Return dtpJam.Value.Hour
    End Get

    Set(ByVal nil As Integer)
        'Menetapkan tanggal menggunakan jam yang dilewatkan kepada properti ini
        dtpJam.Value = New Date(Now.Year, Now.Month, Now.Day, nil, 0, 0)

        'Menetapkan teks yang ditampilkan
        labelStatus.Text = "Pada pukul " & nil & ":00, Kristof sedang "
    End Set
End Property

Perhatikan blok Get.End Get dan Set.End Set di dalam statemen Property.End Property. Blok Get memuat sebuah statemen Return dan dipanggil secara otomatis untuk menghasilkan nilai properti ketika nama properti ditampilkan pada sebuah ekspresi. Tipe data yang dihasilkan tidak ditetapkan pada statemen Get karena ia telah dideklarasikan sebagai Integer pada statemen Property. Blok Set dipanggil secara otomatis ketika nilai ditetapkan, seperti dengan menempatkan nama properti di sisi kiri dari tanda sama dengan.

Ketika aplikasi dijalankan, Anda menetapkan properti Jam menjadi jam terkini pada komputer Anda. Anda mendapatkan informasi ini dari Now, sebuah variabel Date yang memuat tanggal dan waktu terkini:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Menetapkan properti Jam menjadi jam sekarang
    Me.Jam = Now.Hour
End Sub

Anda juga menetapkan properti Jam ketika properti Value berubah pada kontrol DateTimePicker:

Private Sub dtpJam_ValueChanged(sender As Object, e As EventArgs) Handles dtpJam.ValueChanged
    'Memperbarui properti Jam
    Me.Jam = dtpJam.Value.Hour
End Sub

Ketika properti Jam ditetapkan, Anda perlu memperbarui nilai dari kontrol DateTimePicker untuk menunjukkan nilai jam yang baru, dan Anda perlu memperbarui label pada form juga. Kode untuk melakukannya ditempatkan di dalam blok Set pada properti Jam.

Pembaruan pertama yang Anda lakukan adalah memperbarui properti Value dari kontrol DateTimePicker. Properti Value dari kontrol ini bertipe data Date; jadi, Anda tidak bisa begitu saja menetapkan jam pada kontrol ini, meskipun Anda bisa membaca jam dari properti ini. Untuk memperbarui properti ini, Anda harus melewatkan kepadanya sebuah tipe data Date.

Anda melakukan ini dengan memanggil New dari kelas Date, melewatkannya bagian tanggal dan waktu yang berbeda seperti ditunjukkan pada kode: tahun, bulan, hari, jam, menit, detik. Anda membaca tahun, bukan, dan hari dengan mengekstraksinya dari variabel Now. Jam dilewatkan menggunakan parameter nil yang sebelumnya dilewatkan kepada properti Jam ini, dan menit dan detik dilewatkan sebagai 0, karena Anda tidak ingin memperbaruinya:

'Menetapkan tanggal menggunakan jam yang dilewatkan kepada properti ini
dtpJam.Value = New Date(Now.Year, Now.Month, Now.Day, nil, 0, 0)

Pembaruan kedua yang dilakukan oleh properti Jam adalah memperbarui label pada form menggunakan teks statis dan jam yang ditetapkan pada properti ini:

'Menetapkan teks yang ditampilkan
labelStatus.Text = "Pada pukul " & nil & ":00, Kristof sedang "

Anda tidak mengevaluasi properti Jam untuk menentukan status menggunakan enumerasi AktifitasHari, tetapi Anda akan melakukannya nanti.

Menentukan Status
Pada latihan ini, Anda akan menentukan statusketipa properti Jam ditetapkan. Anda mengambil jam yang dihasilkan oleh kontrol DateTimePicker dan menggunakannya untuk menentukan nilai mana pada enumerasi yang cocok dengannya.

LATIHAN
Menentukan Status
Latihan ini mendemonstrasikan hal ini dan menampilkan nilai itu pada form Anda.
1.    Buka editor kode untuk Form1 dan modifikasi properti Jam sebagai berikut:

'Properti Jam
Private Property Jam() As Integer
    Get
        'Menghasilkan jam sekarang yang ditampilkan
        Return dtpJam.Value.Hour
    End Get
    Set(ByVal nil As Integer)
        'Menetapkan tanggal menggunakan jam yang dilewatkan kepada properti ini
        dtpJam.Value = New Date(Now.Year, Now.Month, Now.Day, nil, 0, 0)

        'Menentukan status
        If nil >= 6 And nil < 7 Then
            StatusSekarang = AktifitasHari.BersiapPergiKerja
        ElseIf nil >= 7 And nil < 8 Then
            StatusSekarang = AktifitasHari.BerangkatKerja
        ElseIf nil >= 8 And nil < 13 Then
            StatusSekarang = AktifitasHari.Bekerja
        ElseIf nil >= 13 And nil < 14 Then
            StatusSekarang = AktifitasHari.MakanSiang
        ElseIf nil >= 14 And nil < 17 Then
            StatusSekarang = AktifitasHari.Bekerja
        ElseIf nil >= 17 And nil < 18 Then
            StatusSekarang = AktifitasHari.BerangkatPulang
        ElseIf nil >= 18 And nil < 22 Then
            StatusSekarang = AktifitasHari.BercengkeramaDenganTeman
        ElseIf nil >= 22 And nil < 23 Then
            StatusSekarang = AktifitasHari.BersiapTidur
        Else
            StatusSekarang = AktifitasHari.Tidur
        End If

        'Menetapkan teks yang ditampilkan
        labelStatus.Text = "Pada pukul " & nil & ":00, Kristof sedang " _
                           & StatusSekarang
    End Set
End Property

2.    Jalankan projek. Anda akan melihat seperti ditunjukkan pada Gambar 3.8.


GAMBAR 3.8

3.   Berikut masih ada permasalahannya: User tidak mengetahui apa itu 2. Tutup projek dan cari bagian kode di akhir dari properti Jam:

    'Menetapkan teks yang ditampilkan
    labelStatus.Text = "Pada pukul " & nil & ":00, Kristof sedang " _
                       & StatusSekarang
End Set

4.   Ubah baris terakhir sehingga menjadi seperti ini:

    'Menetapkan teks yang ditampilkan
    labelStatus.Text = "Pada pukul " & nil & ":00, Kristof sedang " _
                       & StatusSekarang.ToString()
End Set

5.    Jalankan projek. Anda akan melihat seperti ditunjukkan pada Gambar 3.9.


GAMBAR 3.9

Penjelasan
Ketika Anda mengetik kode pada contoh ini, Anda dapat memerhatikan bahwa kapanpun Anda mencoba untuk menetapkan nilai pada StatusSekarang, Anda akan disajikan sejumlah daftar enumerasi yang mungkin, seperti ditunjukkan pada Gambar 3.10.


GAMBAR 3.10


Visual Studio mengetahui bahwa StatusSekarang adalah bertipe AktifitasHari. Ia juga mengetahui bahwa AktifitasHari adalah sebuah enumerasi dan bahwa ia mendefinisikan delapan kemungkinan nilai, masing-masing ditampilkan pada kotak pop-up IntelliSense. Dengan mengklik salah satu item pada daftar enumerasi tersebut, sebuah ToolTip akan ditampilkan dengan nilai aktual dari item tersebut; sebagai contoh, pengklikan AktifitasHarian.BercengkeramaDenganTeman akan menampilkan sebuah ToolTip dengan nilai 6.

Secara fundamental, karena AktifitasHarian didasarkan pada integer, StatusSekarang juga bernilai integer. Inilah mengapa, pertama kali Anda menjalankan projek dengan kode penentuan status, Anda melihat sebuah integer di akhir string status. Pada 7:00 a.m, Anda mengetahui bahwa Kristof sedang berangkat kerja, atau StatusSekarang sama dengan AktifitasHari.BerangkatKerja. Anda mendefinisikan ini sebagai 2, yang ditampilkan di akhir string.

Menetapkan Nilai Tak Valid
Salah satu keterbatasan atau kekurangan enumerasi adalah bahwa dimungkinkan untuk menyimpan sebuah nilai yang secara teknis bukan merupakan salah satu nilai terdefinisi yang mungkin dari enumerasi. Sebagai contoh, Anda dapat mengubah properti Jam sehingga daripada menetapkan StatusSekarang menjadi Tidur, Anda dapat menetapkannya menjadi 999:

ElseIf nil >= 22 And nil < 23 Then
    StatusSekarang = AktifitasHari.BersiapTidur
Else
    StatusSekarang = 999
End If

Jika Anda membangun projek, Anda akan memerhatikan bahwa Visual Basic tidak memandang ini sebagai error jika opsi Option Strict dimatikan. Ketika Anda menjalankan projek, Anda akan melihat bahwa nilai untuk StatusSekarang ditampilkan pada form sebagai 999.

Jadi, Anda dapat menetapkan sebuah variabel yang mereferensi suatu enumerasi menjadi sebuah nilai yang tidak didefinisikan pada enumerasi dan aplikasi dapat tetap dijalankan (sepanjang nilai tersebut bertipe data sama dengan enumerasi).

MEMAHAMI KONSTANTA
Salah satu teknik pemrograman yang baik adalah kesadaran akan konstanta. Bayangkan Anda memiliki dua metode berikut, masing-masing melakukan sesuatu pada file tertentu:

Public Sub LakukanSesuatu()
   ‘Apa nama file?
   Dim strNamaFile As String = "c:\Temp\Demo.txt"
   ‘Membuka file
   …
End Sub

Public Sub LakukanYangLain()
   ‘Apa nama file?
   Dim strNamaFile As String = "c:\Temp\Demo.txt"
   ‘Lakukan sesuatu lain pada file
   …
End Sub

Menggunakan Konstanta
Kode yang mendefinisikan sebuah literal string memberikan nama file dua kali. Ini merupakan praktek pemrograman yang buruk, karena kedua metode dimaksudkan untuk mengakses file yang sama, dan jika nama file itu berubah, perubahan ini harus dilakukan di dua tempat yang terpisah.
Pada contoh ini, kedua metode berada di sisi satu sama lain dan program itu sendiri berukuran kecil. Namun, bayangkan jika Anda memiliki sebuah program berukuran panjang dimana di dalamnya sebuah literal string terpisah yang menunjuk ke file didefinisikan di 10, 50, atau bahkan 1000 tempat. Jika Anda perlu mengubah nama file, Anda akan mengubahnya di banyak tempat itu. Ini merupakan masalah serius dalam pengembangan piranti lunak.

Apa yang Anda perlu lakukan adalah mendefinisikan nama file secara global dan kemudian menggunakan simbol global untuk nama file pada kode, daripada menggunakan literal string. Inilah yang dikenal dengan konstanta. Konstanta adalah sejenis variabel spesial yang tidak dapat diubah ketika program dijalankan.

LATIHAN
Menggunakan Konstanta
Pada latihan ini, Anda akan belajar menggunakan konstanta.
1.   Ciptakanlah sebuah aplikasi Windows Forms pada Visual Studio dengan nama Demo Konstanta.

2.  Ketika mode Design ditampilkan, tambahkan tiga kontrol Button. Tetapkan properti Name dari tombol pertama menjadi tombolSatu, tombol kedua menjadi tombolDua, dan tombol ketiga menjadi tombolTiga. Ubah program Text dari tiap tombol menjadi Satu, Dua, dan Tiga. Tata kontrol-kontrol pada form Anda sehingga tampak seperti pada Gambar 3.11.


GAMBAR 3.11

3.   Lihat editor kode untuk form ini dengan mengklik kanan pada form dan memilih View Code dari menu konteks. Di atas dari definisi kelas, tambahkan kode yang ditebalkan berikut:

Public Class Form1
    'Konstanta nama file
    Private Const strNamaFile As String = "C:\Temp\Halo.txt"

4.  Klik ganda pada kontrol tombolSatu untuk menghasilkan event handler Click untuk tombol tersebut dan tambahkan kode yang ditebalkan:

Private Sub tombolSatu_Click(sender As Object, e As EventArgs) Handles tombolSatu.Click
    'Menggunakan sebuah konstanta
    MessageBox.Show("1: " & strNamaFile, "Demo Konstanta")
End Sub

5.  Klik ganda pada kontrol tombolDua untuk menghasilkan event handler Click untuk tombol tersebut dan tambahkan kode yang ditebalkan:

Private Sub tombolDua_Click(sender As Object, e As EventArgs) Handles tombolDua.Click
    'Menggunakan konstanta lagi
    MessageBox.Show("2: " & strNamaFile, "Demo Konstanta")
End Sub

6.  Klik ganda pada kontrol tombolTiga untuk menghasilkan event handler Click untuk tombol tersebut dan tambahkan kode yang ditebalkan:

Private Sub tombolTiga_Click(sender As Object, e As EventArgs) Handles tombolTiga.Click
    'Mendaur-ulang konstanta satu kali lagi
    MessageBox.Show("3: " & strNamaFile, "Demo Konstanta")
End Sub

7.  Simpan dan jalankan projek dan klik tombol Satu. Anda akan melihat kotak pesan seperti ditunjukkan pada Gambar 3.12.


GAMBAR 3.12

Sama halnya, Anda akan melihat nama file yang sama ketika Anda mengklik tombol Dua dan Tiga.

Penjelasan
Contoh ini mendemonstrasikan bahwa sebuah konstanta sebenarnya adalah sejenis nilai yang tidak dapat diubah ketika program dijalankan. Konstanta didefinisikan sebagai sebuah variabel, tetapi Anda menambahkan Const pada definisi, yang mengindikasikan bahwa variabel tersebut adalah konstanta dan tidak dapat diubah:

'Konstanta nama file
Private Const strNamaFile As String = "C:\Temp\Halo.txt"

Anda akan memerhatikan bahwa ia memiliki tipe data, sama seperti variabel biasa, dan Anda perlu memberikannya nilai ketika ia didefinisikan.

Ketika Anda ingin menggunakan konstanta itu, Anda mengaksesnya sama seperti ketika Anda mengakses variabel biasa:

Private Sub tombolSatu_Click(sender As Object, e As EventArgs) Handles tombolSatu.Click
'Menggunakan sebuah konstanta
MessageBox.Show("1: " & strNamaFile, "Demo Konstanta")
End Sub

Tipe Konstanta Berbeda
Anda telah melihat bagaimana menggunakan konstanta string, tetapi pada bagian ini, Anda dapat menggunakan tipe variabel lain sebagai konstanta. Pada dasarnya, sebuah konstanta harus tidak bisa diubah, jadi Anda tidak menyimpan sebuah tipe data objek di dalam sebuah konstanta.



Integer adalah tipe konstanta yang sering dijumpai. Ia dapat didefinisikan seperti ini:

Public Const intJamTidurPerHari As Integer = 8

Selain itu, Anda akan sering menjumpai konstanta yang digunakan dengan enumerasi seperti ini:

Public Const intKristofStatus As AktifitasHari = AktifitasHari.Bekerja


STRUKTUR
Aplikasi umumnya perlu menyimpan beberapa potong informasi dengan sejumlah tipe data berbeda yang semuanya berkaitan satu sama lain dan perlu disimpan dalam satu grup, seperti nama dan alamat konsumen (string) dan saldo (nilai). Umumnya, sebuah objek kelas dipakai untuk memuat grup variabel semacam itu. Tetapi, untuk melakukan hal yang sama, Anda bisa menggunakan struktur.

Membangun Struktur
Struktur mirip dengan objek kelas, tetapi lebih sederhana. Ketika Anda merancang aplikasi, Anda perlu memutuskan apakah struktur atau kelas yang diperlukan. Jika Anda memerlukan banyak metode untuk dipakai, maka sebaiknya Anda menggunanakan kelas. Jika tidak, sebaiknya Anda menggunakan struktur.

LATIHAN
Membangun Struktur
Amati bagaimana Anda dapat membangun sebuah struktur.
1.  Ciptakan sebuah aplikasi Windows Forms pada Visual Studio dengan nama Demo Struktur.

2. Ketika mode Design ditampilkan, tambahkan empat kontrol Label, empat kontrol TextBox, dan sebuah kontrol Button. Tata kontrol-kontrol Anda sehingga tampak seperti pada Gambar 3.13.


GAMBAR 3.13

3.    Tetapkan properti Name sebagai berikut:
              Tetapkan Label1 menjadi labelNama.
              Tetapkan TextBox1 menjadi teksNama.
              Tetapkan Label2 menjadi labelNamaDepan.
              Tetapkan TextBox2 menjadi teksNamaDepan.
              Tetapkan Label3 menjadi LabelNamaBelakang.
              Tetapkan TextBox3 menjadi teksNamaBelakang.
              Tetapkan Label4 menjadi labelEmail.
              Tetapkan TextBox4 menjadi teksEmail.
              Tetapkan Button1 menjadi tombolDaftarKonsumen.

4.    Tetapkan properti Text dari kontrol-kontrol berikut:
  •     Tetapkan labelNama menjadi Nama.
  •     Tetapkan labelNamaDepan menjadi Nama Depan.
  •     Tetapkan labelNamaBelakang menjadi Nama Belakang.
  •     Tetapkan labelEmail menjadi Email.
  •     Tetapkan tombolDaftarKonsumen menjadi Daftar Konsumen.

5. Klik kanan pada nama projek pada jendela Solution Explorer, pilih Add dan kemudian New Item dari menu konteks, dan kemudian pilih item submenu Class. Masukkan nama bidang Konsumen dan kemudian klik tombol Add.

6.  Ketika editor kode ditampilkan, ganti kode yang ada dengan kode berikut:

Public Structure Konsumen
    'Anggota publik
    Public NamaDepan As String
    Public NamaBelakang As String
    Public Email As String
End Structure

7.    Lihat editor kode untuk form dan tambahkan prosedur ini:

Public Class Form1
    Public Sub TampilkanKonsumen(ByVal konsumen As Konsumen)
        'Menampilkan detil konsumen pada form
        teksNamaDepan.Text = konsumen.NamaDepan
        teksNamaBelakang.Text = konsumen.NamaBelakang
        teksEmail.Text = konsumen.Email
    End Sub

8. Pilih kontrol tombolDaftarKonsumen, dan klik ganda pada kontrol tersebut. Tambahkan kode yang ditebalkan pada event handler Click:

Private Sub tombolDaftarKonsumen_Click(sender As Object, e As EventArgs)
Handles tombolDaftarKonsumen.Click
    'Menciptakan konsumen baru
    Dim objKonsumen As Konsumen
    objKonsumen.NamaDepan = "John"
    objKonsumen.NamaBelakang = "Kristof"
    objKonsumen.Email = "jKristof@gmail.com"

    'Menampilkan konsumen
    TampilkanKonsumen(objKonsumen)
End Sub

9.  Simpan dan jalankan projek Anda. Ketika form ditampilkan, klik pada tombol Daftar Konsumen dan Anda akan melihat hasil seperti ditunjukkan pada Gambar 3.14.



GAMBAR 3.14

Penjelasan
Pada contoh ini, Anda mendefinisikan sebuah struktur menggunakan statemen Structure.End Structure. Di dalam blok ini, variabel-variabel yang membangun struktur dideklarasikan berdasarkan nama dan tipe datanya: Variabel-variabel ini dinamakan dengan anggota-anggota struktur:


Public Structure Konsumen
    'Anggota publik
    Public NamaDepan As String
    Public NamaBelakang As String
    Public Email As String
End Structure


Perhatikan katakunci Public di depan tiap deklarasi variabel, dan juga di depan statemen Structure. Anda telah sering melihat Private dipakai pada posisi yang sama. Katakunci Public berarti bahwa Anda dapat mengakses anggota struktur (seperti NamaDepan) dari luar struktur.

Pada prosedur tombolDaftarKonsumen_Click, Anda mendefinisikan sebuah variabel dengan tipe Konsumen menggunakan statemen Dim. (Jika Konsumen adalah sebuah kelas, Anda akan perlu menginisialisasi variabel dengan menetapkan objKonsumen sama dengan New Konsumen).


Private Sub tombolDaftarKonsumen_Click(sender As Object, e As EventArgs)
Handles tombolDaftarKonsumen.Click
   'Menciptakan konsumen baru
   Dim objKonsumen As Konsumen


Kemudian Anda dapat mengakses tiap variabel anggota yang ada di dalam struktur Konsumen dengan memberikan nama dari variabel struktur, yang diikuti dengan dot, dan diikuti dengan nama anggota:

objKonsumen.NamaDepan = "John"
objKonsumen.NamaBelakang = "Kristof"
objKonsumen.Email = "jKristof@gmail.com"

'Menampilkan konsumen
TampilkanKonsumen(objKonsumen)


Metode TampilkanKonsumen menerima sebuah struktur Konsumen sebagai parameter masukannya dan kemudian mengakses anggota-anggota struktur untuk menetapkan properti Text dari tiap kotak teks pada form:


Public Sub TampilkanKonsumen(ByVal konsumen As Konsumen)
'Menampilkan detil konsumen pada form
teksNamaDepan.Text = konsumen.NamaDepan
teksNamaBelakang.Text = konsumen.NamaBelakang
teksEmail.Text = konsumen.Email
End Sub


Menambah Properti Pada Struktur
Ketika Anda perlu menyimpan informasi dasar, Anda dapat menambahkan properti-properti pada sebuah struktur seperti ketika Anda melakukannya pada projek Demo Enum sebelumnya. Anda belajar bagaimana ini dilakukan pada latihan berikut.

LATIHAN
Menambahkan Properti Nama
Pada latihan ini, Anda akan menambahkan sebuah properti Nama yang dideklarasikan ReadOnly.

1.   Buka editor kode untuk Konsumen dan tambahkan kode yang ditebalkan berikut untuk menciptakan sebuah properti read-only Nama:

'Anggota publik
Public NamaDepan As String
Public NamaBelakang As String
Public Email As String

'Properti Nama
Public ReadOnly Property Nama() As String
    Get
        Return NamaDepan & " " & NamaBelakang
    End Get
End Property

2.  Buka editor kode untuk Form1. Modifikasi metode TampilkanKonsumen dengan kode yang ditebalkan berikut:

Public Sub TampilkanKonsumen(ByVal konsumen As Konsumen)
    'Menampilkan detil konsumen pada form
    teksNama.Text = konsumen.Nama
    teksNamaDepan.Text = konsumen.NamaDepan
    teksNamaBelakang.Text = konsumen.NamaBelakang
    teksEmail.Text = konsumen.Email
End Sub

3.  Jalankan projek dan klik pada tombol Daftar Konsumen. Anda akan melihat kotak teks Nama, yang sebelumnya kosong pada Gambar 3.14, sekarang diisi dengan nama depan dan nama belakang dari konsumen.

Penjelasan
Pertama-tama, Anda menciptakan properti dan menandainya dengan ReadOnly sehingga ia tidak bisa diubah:

'Properti Nama
Public ReadOnly Property Nama() As String
Get
    Return NamaDepan & " " & NamaBelakang
End Get
End Property


Selanjutnya, Anda menggunakan properti baru tersebut untuk mengisi kotak teks untuk Nama.

teksNama.Text = konsumen.Nama


BEKERJA DENGAN ARRAYLIST
Dimisalkan bahwa Anda ingin menyimpan beberapa struktur Konsumen. Anda dapat menggunakan array, tetapi pada banyak kasus array tidak mudah untuk digunakan.

  • Jika Anda perlu menambahkan sebuah Konsumen baru pada array, maka Anda perlu mengubah ukuran array dan menyisipkan item baru tersebut ke posisi terakhir di dalam array.
  • Jika Anda ingin menghapus sebuah Konsumen dari array, Anda perlu mencari tiap item di dalam array secara bergiliran. Ketika Anda menemukan yang Anda cari, Anda perlu menciptakan versi lain dari array dengan satu elemen lebih kecil dari array semula dan menyalin setiap elemen kecuali elemen yang ingin Anda hapus.
  • Jika Anda ingin mengganti sebuah Konsumen di dalam array dengan konsumen lain, maka Anda perlu melihat setiap item secara bergiliran sampai Anda menemukan elemen yang ingin Anda ganti secara manual.

.
ArrayList menawarkan cara untuk menciptakan array yang dapat dengan mudah dimanipulasi.

Menggunakan ArrayList
ArrayList dapat dipakai untuk menyimpan sekumpulan objek yang berukuran dinamis. Anda dapat menambah dan menghapus item-item pada lokasi manapun. Ketika Anda tidak yakin berapa banyak item yang akan dimuat koleksi Anda, ArrayList merupakan opsi terbaik. Lihat bagaimana menggunakan ArrayList pada latihan berikut.

LATIHAN
Menggunakan ArrayList
Pada latihan ini, Anda melihat bagaimana menggunakan sebuah ArrayList.
1.   Kembali ke projek Demo Struktur. Buat form lebih besar, pindahkan kontrol-kontrol yang ada ke bawah, dan kemudian tambahkan sebuah kontrol ListBox seperti ditunjukkan pada Gambar 3.15. Tetapkan properti Name dari kotak list menjadi listKonsumen dan properti IntegralHeight menjadi False.

2.  Buka editor kode untuk Form1 dan tambahkan kode yang ditebalkan di sini di atas definisi kelas:

Public Class Form1
    'Anggota level form
    Private objKonsumen As New ArrayList

3.  Tambahkan metode ini pada Form1 untuk menciptakan sebuah konsumen baru:

Public Sub CiptakanKonsumen(ByVal namaDepan As String,
  ByVal namaBelakang As String, ByVal email As String)
    'Mendefinisikan sebuah objek Konsumen
    Dim objKonsumenBaru As Konsumen

    'Menciptakan konsumen baru
    objKonsumenBaru.NamaDepan = namaDepan
    objKonsumenBaru.NamaBelakang = namaBelakang
    objKonsumenBaru.Email = email

    'Menambahkan konsumen baru pada list
    objKonsumen.Add(objKonsumenBaru)

    'Menambahkan konsumen barupada kontrol ListBox
    listKonsumen.Items.Add(objKonsumenBaru)
End Sub

4.    Modifikasi metode tombolDaftarKonsumen, dengan perubahan-perubahan berikut:

Private Sub tombolDaftarKonsumen_Click(sender As Object, e As EventArgs)
Handles tombolDaftarKonsumen.Click
    'Menciptakan beberapa konsumen
    CiptakanKonsumen("John", "Kristof",
                     "jKristof@gmail.com")
    CiptakanKonsumen("Vivian", "Siahaan",
                     "vSiahaan@yahoo.com")
    CiptakanKonsumen("Rico", "Chandra",
                     "rChandra@yahoo.co.uk")
End Sub

5.  Jalankan projek dan klik tombol Daftar Konsumen. Anda akan melihat hasil seperti ditunjukkan pada Gambar 3.16.


GAMBAR 3.16

Penjelasan
Anda menambahkan beberapa struktur Konsumen pada list, tetapi ia ditampilkan sebagai Demo_Struktur.Konsumen; ini merupakan nama lengkap dari struktur. Kontrol ListBox menerima nilai-nilai string, jadi dengan menetapkan bahwa Anda ingin menambahkan struktur Konsumen pada kotak list, Visual Basic memanggil metode ToString dari struktur Konsumen. Secara default, metode ToString untuk sebuah struktur menghasilkan nama struktur, bukan isi dari struktur. Oleh karena itu, Anda perlu memodifikasi struktur Konsumen agar yang ditampilkan sesuatu yang ingin Anda lihat.


LATIHAN
Mendefinisikan Ulang Metode ToString
Pada latihan ini, Anda perlu memodifikasi struktur Konsumen.

1. Kembali ke projek Demo Struktur dan buka editor kode untuk Konsumen dan tambahkan metode berikut pada struktur, pastikan bahwa ia ditempatkan di bawah deklarasi-deklarasi anggota. Untuk menyisipkan sebuah komentar dokumen XML, Anda memerlukan tiga tanda kutip di atas nama metode:

    '" <summary>
    '" Mendefinisikan ulang metode ToString default
    '" </summary>
    '" <returns>String</returns>
    '" <remarks>Menghasilkan nama konsumen dan alamat email
    Public Overrides Function ToString() As String
        Return Nama & " (" & Email & ")"
    End Function
End Structure

2. Jalankan projek dan klik pada tombol Daftar Konsumen. Anda akan melihat hasil seperti ditunjukkan pada Gambar 3.17.


GAMBAR 3.17

Penjelasan
Kapanpun sebuah struktur Konsumen ditambahkan pada list, kotak list akan memanggil metode ToString pada struktur tersebut untuk mendapatkan suatu representasi string dari struktur itu. Dengan kode ini, Anda mendefinisikan ulang fungsionalitas default dari metode ToString sehingga Anda tidak mendapatkan nama struktur tetapi representasi dari nama dan alamat email dari struktur.

'" <summary>
'" Mendefinisikan ulang metode ToString default
'" </summary>
'" <returns>String</returns>
'" <remarks>Menghasilkan nama konsumen dan alamat email
Public Overrides Function ToString() As String
    Return Nama & " (" & Email & ")"
End Function

Sebuah ArrayList dapat dipakai untuk menyimpan sejumlah objek/struktur dengan tipe apapun. Pada dasarnya, Anda dapat mencampur tipe-tipe di dalam sebuah ArrayList. Pada contoh ini, Anda menciptakan sebuah metode dengan nama CiptakanKonsumen yang menginisialisasi sebuah struktur Konsumen baru didasarkan parameter-parameter yang dilewatkan:

Public Sub CiptakanKonsumen(ByVal namaDepan As String,
  ByVal namaBelakang As String, ByVal email As String)
    'Mendefinisikan sebuah objek Konsumen
    Dim objKonsumenBaru As Konsumen

    'Menciptakan konsumen baru
    objKonsumenBaru.NamaDepan = namaDepan
    objKonsumenBaru.NamaBelakang = namaBelakang
    objKonsumenBaru.Email = email

Setelah struktur diinisialisasi, Anda menambahkannya pada ArrayList yang disimpan di dalam objKonsumen:

'Menambahkan konsumen baru pada list
objKonsumen.Add(objKonsumenBaru)

Anda juga menambahkannya pada kotak list, seperti ini:

'Menambahkan konsumen barupada kontrol ListBox
listKonsumen.Items.Add(objKonsumenBaru)

Dengan CiptakanKonsumen didefinisikan, Anda dapat memanggilnya untuk menambahkan anggota-anggota baru pada ArrayList dan pada kontrol ListBox ketika user mengklik tombol Daftarkan Konsumen:

Private Sub tombolDaftarKonsumen_Click(sender As Object, e As EventArgs)
Handles tombolDaftarKonsumen.Click
    'Menciptakan beberapa konsumen
    CiptakanKonsumen("John", "Kristof",
                     "jKristof@gmail.com")
    CiptakanKonsumen("Vivian", "Siahaan",
                     "vSiahaan@yahoo.com")
    CiptakanKonsumen("Rico", "Chandra",
                     "rChandra@yahoo.co.uk")
End Sub


Menghapus Dari ArrayList
Sekarang Anda telah mengetahui prinsip di balik sebuah ArrayList. Anda menggunakannya untuk melakukan sesuatu yang secara tradisional sangat sulit dilakukan tetapi hal itu dapat dengan mudah dilakukan dengan ArrayList.

LATIHAN
Menghapus Dari ArrayList
Pada latihan ini, Anda akan ditunjukkan bagaimana penghapusan item dari sebuah ArrayList dapat dengan mudah dilakukan.

1. Kembali ke editor kode pada projek Demo Struktur dan tambahkan properti KonsumenTerseleksi pada form sebagai berikut:

Public ReadOnly Property KonsumenTerseleksi() As Konsumen
    Get
        If listKonsumen.SelectedIndex <> -1 Then
            'Menghasilkan konsumen terseleksi
            Return CType(objKonsumen(listKonsumen.SelectedIndex), Konsumen)
        End If
    End Get
End Property

2.  Sekarang tukar ke mode Design dan tambahkan sebuah kontrol Button di bawah form dan tetapkan properti Name menjadi tombolHapusKonsumen dan properti Text menjadi Hapus Konsumen.

3.    Klik ganda pada tombol tersebut dan tambahkan kode yang ditebalkan berikut:

Private Sub tombolHapusKonsumen_Click(sender As Object, e As EventArgs)
Handles tombolHapusKonsumen.Click
    'Jika tidak ada konsumen yang diseleksi pada ListBox
    If listKonsumen.SelectedIndex = -1 Then
        'Menampilkan sebuah pesan
        MessageBox.Show("Anda harus memilih sebuah konsumen untuk dihapus.",
        "Demo Struktur")
        'Keluar dari metode ini
        Exit Sub
    End If

    'Meminta user untuk menghapus konsumen terseleksi
    If MessageBox.Show("Anda yakin ingin menghapus " &
     KonsumenTerseleksi.Nama & "?", "Demo Struktur",
     MessageBoxButtons.YesNo, MessageBoxIcon.Question) =
     DialogResult.Yes Then
        'Membaca konsumen yang akan dihapus
        Dim objKonsumenHapus As Konsumen = KonsumenTerseleksi

        'Menghapus konsumen dari ArrayList
        objKonsumen.Remove(objKonsumenHapus)

        'Menghapus konsumen dari ListBox
        listKonsumen.Items.Remove(objKonsumenHapus)
    End If
End Sub

4.   Jalankan projek dan klik tombol Daftar Konsumen.

5. Sekarang pilih sebuah konsumen dan klik tombol Hapus Konsumen. Anda akan melihat sebuah kotak konfirmasi yang ditunjukkan seperti pada Gambar 3.18.


GAMBAR 3.18

6.    Klik Yes, dan konsumen yang diseleksi akan dihapus.

Penjelasan
Triknya di sini adalah membangun sebuah properti read-only yang menghasilkan struktur Konsumen yang diseleksi pada kotak list. Properti SelectedIndex dari kotak list menghasilkan sebuah nilai -1 jika tidak ada seleksi yang dilakukan. Sebaliknya, ia menghasilkan indeks berbasis nol. Karena koleksi Items dari kotak list memuat sebuah koleksi yang memuat tipe-tipe data Object, Anda perlu mengkonversi objek yang dihasilkan menjadi objek Konsumen, yang Anda lakukan menggunakan fungsi CType:

Public ReadOnly Property KonsumenTerseleksi() As Konsumen
    Get
        If listKonsumen.SelectedIndex <> -1 Then
            'Menghasilkan konsumen terseleksi
            Return CType(objKonsumen(listKonsumen.SelectedIndex), Konsumen)
        End If
    End Get
End Property

Karena tidak ada statemen Else untuk If, Anda akan melihat peringatan tantang lintasan kode tanpa-hasil. Anda perlu hati-hati ketika menuliskan kode semacam ini. Untuk memperbaikinya, Anda dapat menambahkan statemen Else untuk situasi ini.

Sama seperti properti Nama yang Anda tambahkan pada struktur Konsumen, properti ini diidentifikasi sebagai read-only dengan katakunci ReadOnly. Ia memuat sebuah blok Get, tanpa blok Set. Alasan membuatnay read-only adalah bahwa ia mengkonstruksi nilai yang dihasilkan dari informasi lain (isi dari struktur Konsumen di dalam list).

Di dalam event handle Click untuk tombol Hapus Konsumen, Anda lebih dahulu menguji untuk melihat apakah sebuah konsumen telah diseleksi pada kotak list atau tidak. Jika tidak ada konsumen yang diseleksi, maka Anda menampilkan sebuah kotak pesan yang mengindikasikan bahwa sebuah konsumen perlu diseleksi. Kemudian, Anda keluar dari metode, dan mengijinkan user untuk memilih sebuah konsumen dan mencoba kembali:

'Jika tidak ada konsumen yang diseleksi pada ListBox
If listKonsumen.SelectedIndex = -1 Then
    'Menampilkan sebuah pesan
    MessageBox.Show("Anda harus memilih sebuah konsumen untuk dihapus.",
                    "Demo Struktur")
    'Keluar dari metode ini
    Exit Sub
End If

Jika sebuah konsumen telah diseleksi, Anda meminta user untuk mengkonfirmasi penghapusan:

'Meminta user untuk menghapus konsumen terseleksi
If MessageBox.Show("Anda yakin ingin menghapus " &
     KonsumenTerseleksi.Nama & "?", "Demo Struktur",
     MessageBoxButtons.YesNo, MessageBoxIcon.Question) =  DialogResult.Yes Then

Jika user benar-benar ingin menghapus konsumen, Anda akan mendapatkan sebuah nilai balik dari MessageBox.Show berupa DialogResult.Yes. Kemudian Anda mendeklarasikan sebuah struktur Konsumen untuk menyimpan konsumen yang akan dihapus dan mengisi struktur itu dengan konsumen terseleksi:

'Membaca konsumen yang akan dihapus
Dim objKonsumenHapus As Konsumen = KonsumenTerseleksi

Metode Remove dari ArrayList kemudian dapat dipakai untuk menghapus konsumen terseleksi:

'Menghapus konsumen dari ArrayList
objKonsumen.Remove(objKonsumenHapus)

Anda juga dapat menggunakan teknik yang sama untuk menghapus konsumen dari kotak list:

'Menghapus konsumen dari ListBox
listKonsumen.Items.Remove(objKonsumenHapus)



Menampilkan Item-Item Di Dalam ArrayList
Untuk keutuhan, Anda akan menambahkan satu lagi fungsionalitas untuk meningkatkan kemampuan antarmuka dari aplikasi Anda.

LATIHAN
Menampilkan Detil Dari Item Terseleksi
Pada latihan ini, Anda menambahkan kode pada event SelectedIndexChanged untuk kotak list konsumen. Setiap kali konsumen baru diseleksi, detil konsumen akan ditampilkan pada kotak-kotak teks pada form.

1.  Kembali ke mode Design pada projek Demo Struktur dan klik ganda pada kotak list. Ini akan menciptakan sebuah event handler SelectedIndexChanged. Tambahkan kode yang ditebalkan:

Private Sub listKonsumen_SelectedIndexChanged(sender As Object, e As EventArgs)
  Handles listKonsumen.SelectedIndexChanged
    'Menampilkan detil konsumen
    TampilkanKonsumen(KonsumenTerseleksi)
End Sub

2.  Jalankan projek dan klik tombol Daftar Konsumen untuk mengisi kotak list. Sekarang ketika Anda memilih sebuah konsumen pada kotak list, informasi konsumen akan ditampilkan pada bidang-bidang di bawah form, seperti ditunjukkan pada Gambar 3.19.


GAMBAR 3.19

Penjelasan
Pada contoh ini, Anda mengaitkan event SelectedIndexChanged pada konsumen yang terseleksi sehingga informasinya ditampilkan ketika event dipicu.

'Menampilkan detil konsumen
TampilkanKonsumen(KonsumenTerseleksi)



BEKERJA DENGAN KOLEKSI
ArrayList adalah sejenis koleksi, yang digunakan oleh .NET Framework secara ekstensif. Koleksi adalah cara mudah dalam menciptakan grup yang memuat item-item berelasi. Jika Anda kembali ke kode Demo Struktur dan melihat metode CiptakanKonsumen, Anda akan memerhatikan bahwa penambahan item-item pada ArrayList dan pada kotak list, Anda menggunakan sebuah metode dengan nama Add:

'Menambahkan konsumen baru pada list
objKonsumen.Add(objKonsumenBaru)

'Menambahkan konsumen barupada kontrol ListBox
listKonsumen.Items.Add(objKonsumenBaru)

Kode yang menghapus sebuah konsumen menggunakan suatu metode dengan nama Remove:

'Menghapus konsumen dari ArrayList
objKonsumen.Remove(objKonsumenHapus)

'Menghapus konsumen dari ListBox
listKonsumen.Items.Remove(objKonsumenHapus)

Microsoft sangat ingin melihat para developer menggunakan paradigma koleksi kapanpun mereke bekerja menggunakan list item. Ini lah mengapa Anda menggunakan Add untuk menambah sebuah item dan Remove untuk menghapus sebuah item, meskipun Anda menggunakan objek System.Collections.ArrayList pada satu kasus dan objek System.Windows.Forms.ListBox. ObjectCollection pada kasus lain. Microsoft sangat hati-hati dalam menangani fitur ini ketika membangun .NET Framework.

Konsistensi adalah hal yang baik. Hal itu memampukan para pengembang untuk memetakan pemahaman akan suatu hal dan menggunakan pemahaman yang sama itu pada sesutu yang sama. Ketika merancang struktur data untuk digunakan dalam aplikasi Anda, Anda sebaiknya melakukan langkah-langkah yang dianjurkan Microsoft. Sebagai contoh, jika Anda memiliki sebuah kelas koleksi dan ingin menciptakan sebuah metode yang menghapus sebuah item, Anda sebaiknya menamainya dengan Remove, bukan Delete.

Para pengembang yang menggunakan kelas Anda akan memiliki pemahaman intuisi tentang apa yang dilakukan oleh Remove karena mereka familiar dengan istilah itu.

Salah satu permasalahan pada penggunaan ArrayList adalah bahwa pengembang piranti lunak yang memiliki list tidak dapat menjamin bahwa setiap item di dalam list memiliki tipe data yang sama. Karena alasan ini, setiap kali sebuah item diekstraksi dari ArrayList, tipe data selalu diperiksa untuk menghindari error.

Solusinya adalah menciptakan koleksi dengan aturan tipe data ketat, yang hanya memuat elemen-elemen dengan tipe data tertentu. Koleksi dengan aturan tipe data ketat sangat mudah diciptakan. Sesuai dengan praktek pemrograman .NET yang didefinisikan oleh Microsoft, cara terbaik untuk menciptakannya adalah dengan menderivasi sebuah kelas baru dari System.Collections. CollectionBase dan menambahkan dua metode (Add dan Remove) dan satu properti (Item):

ü  Add menambahkan sebuah item baru pada koleksi.
ü  Remove menghapus sebuah item dari koleksi.
ü  Item menghasilkan item pada indeks tertentu di dalam koleksi.
Menciptakan KonsumenKoleksi
Kadangkala, Anda perlu menyimpan banyak struktur. Anda dapat melakukannya menggunakan sebuah koleksi.

LATIHAN
Menciptakan KonsumenKoleksi
Pada latihan ini, Anda menciptakan sebuah KonsumenKoleksi yang dirancang untuk memuat sebuah koleksi yang memuat struktur-struktur Konsumen.

1.  Kembali ke projek Demo Struktur dan pada jendela Solution Explorer, klik kanan pada projek dan pilih Add dari menu konteks dan kemudian pilih item submenu Class. Pada dialog tersebut, masukkan KonsumenKoleksi pada bidang Name dan kemudian klik tombol Add untuk memiliki kelas tersebut pada projek Anda.

2.  Tambahkan kode yang ditebalkan berikut:

Public Class KonsumenKoleksi
    Inherits CollectionBase
End Class

3.   Anda perlu menambahkan sebuah metode Add untuk menambahkan sebuah konsumen pada koleksi. Tambahkan kode berikut:

'Menambahkan sebuah konsumen pada koleksi
Public Sub Add(ByVal konsumenBaru As Konsumen)
    Me.List.Add(konsumenBaru)
End Sub

4. Anda juga perlu menambahkan sebuah metode Remove untuk menghapus sebuah konsumen dari koleksi:

'Menghapus sebuah konsumen dari koleksi
Public Sub Remove(ByVal konsumenLama As Konsumen)
    Me.List.Remove(konsumenLama)
End Sub

5.  Buka editor kode untuk form dan cari definisi untuk anggota objKonsumen. Ubah tipe datanya dari ArrayList menjadi KonsumenKoleksi seperti yang ditebalkan berikut:

Public Class Form1
    'Anggota level form
    Private objKonsumen As New KonsumenKoleksi

6. Terakhir, jalankan projek. Anda akan memerhatikan bahwa aplikasi dapat dijalankan seperti semula.

Penjelasan
Sekarang, kelas KonsumenKoleksi Anda adalah kelas pertama yang Anda ciptakan secara eksplisit (meskipun Anda telah menggunakannya secara implisit dari awal). Kelas dan objek akan didiskusikan nanti pada bab selanjutnya. Untuk sekarang, perhatikan bahwa, seperti struktur, sebuah kelas merepresentasikan sebuah tipe data yang mengelompokkan satu atau lebih anggota dengan tipe-tipe data yang bisa berbeda, dan kelas juga dapat memiliki properti-properti dan metode-metode yang terkait dengannya. Tidak seperti struktur, kelas dapat diderivasi dari kelas lain, dimana pada kasus itu, kelas tersebut mewarisi anggota-anggota, properti-properti, dan metode-metode dari kelas lain (yang dikenal pula dengan kelas basis). Kelas yang mewarisi juga dapat memiliki anggota-anggota, properti-properti, dan metode-metode sendiri.

Kelas KonsumenKoleksi Anda mewarisi kelas System.Collections.CollectionBase, yang memuat sebuah implementasi dasar atas sebuah koleksi yang dapat memuat sembarang objek. Hal ini sama seperti ArrayList. Tetapi keuntungan lain adalah bahwa Anda dapat menambahkan metode-metode sendiri pada kelas ini.

Karena Anda menyediakan sebuah versi dari metode Add yang memiliki sebuah parameter dengan tipe data Konsumen, ia hanya dapat menerima dan menambahkan sebuah struktur Konsumen. Oleh karena itu, adalah tidak mungkin untuk menempatkan ke dalam koleksi yang bukan merupakan sebuah Konsumen. Anda dapat melihat bahwa IntelliSense memberitahu Anda bahwa satu-satunya yang dapat Anda lewatkan kepada metode Add adalah struktur Demo_Struktur.Konsumen.

Secara internal, CollectionBase menyediakan sebuah properti dengan nama List, yang memiliki metode Add dan Remove yang dapat Anda gunakan:

'Menambahkan sebuah konsumen pada koleksi
Public Sub Add(ByVal konsumenBaru As Konsumen)
    Me.List.Add(konsumenBaru)
End Sub

'Menghapus sebuah konsumen dari koleksi
Public Sub Remove(ByVal konsumenLama As Konsumen)
    Me.List.Remove(konsumenLama)
End Sub

Pembuatan koleksi dengan cara ini adalah praktek pemrograman yang direkomendasikan oleh .NET. Sebagai pendatang baru pada pemrograman .NET, Anda mungkin tidak terlalu mengapresiasi teknik ini, tetapi percayalah, bahwa hal ini akan berguna bagi Anda. Kapanpun Anda perlu menggunakan sebuah koleksi yang memuat kelas-kelas, teknik ini adalah cara yang benar untuk melakukannya.



Menambahkan Sebuah Propery Item
Pada awal bagian ini, Anda membaca bahwa Anda akan menambahkan dua metode dan satu properti. Anda telah melihat kedua metode itu, jadi sekarang saatnya Anda untuk menambahkan properti.

LATIHAN
Menambahkan Properti Item
Pada latihan ini, Anda akan menambahkan sebuah properti Item dan membuatnya sebagai properti default dari kelas.

1. Kembali ke Visual Studio, buka editor kode untuk kelas KonsumenKoleksi, dan tambahkan kode ini:

'Properti Item untuk membaca atau memperbarui sebuah konsumen
'pada posisi tertentu di dalam list
Default Public Property Item(ByVal indeks As Integer) As Konsumen
    Get
        Return CType(Me.List.Item(indeks), Konsumen)
    End Get
    Set(ByVal nil As Konsumen)
        Me.List.Item(indeks) = nil
    End Set
End Property

2. Untuk memverifikasinya, buka editor kode untuk Form1. Modifikasi properti KonsumenTerseleksi dengan kode ini:

Public ReadOnly Property KonsumenTerseleksi() As Konsumen
    Get
        If listKonsumen.SelectedIndex <> -1 Then
            'Menghasilkan konsumen terseleksi
            Return objKonsumen(listKonsumen.SelectedIndex)
        End If
    End Get
End Property

3. Terakhir, jalankan projek. Anda akan memerhatikan bahwa aplikasi dapat dijalankan seperti semula.

Penjelasan
Properti Item sebenarnya sangat pentin; ia memberikan kepada para pengembang akses langsung terhadap data yang disimpan di dalam list tetapi tetap mempertahankan aturan tipe data ketat pada koleksi.

Jika Anda melihat kode kembali untuk KonsumenTerseleksi, Anda akan memerhatikan bahwa ketika Anda ingin menghasilkan item tertentu dari dalam objKonsumen, Anda tidak perlu menyediakan nama properti dari Item. Tetapi, objKonsumen berperilaku seperti layaknya sebuah array:

If listKonsumen.SelectedIndex <> -1 Then
'Menghasilkan konsumen terseleksi
Return objKonsumen(listKonsumen.SelectedIndex)
End If

IntelliSense memberitahu Anda untuk memasukkan indeks dari item yang Anda perlukan dan bahwa Anda akan mendapatkan sebuah struktur Konsumen sebagai nilai baliknya. Anda tidak perlu menetapkan nama properti dari Item karena Anda menandai properti tersebut sebagai properti default menggunakan katakunci Default:

'Properti Item untuk membaca atau memperbarui sebuah konsumen
'pada posisi tertentu di dalam list
Default Public Property Item(ByVal indeks As Integer) As Konsumen
    Get
        Return CType(Me.List.Item(indeks), Konsumen)
    End Get
    Set(ByVal nil As Konsumen)
        Me.List.Item(indeks) = nil
    End Set
End Property

Sebuah kelas hanya dapat memiliki satu properti default, dan bahwa properti tersebut harus mengambil sebuah parameter tertentu. Parameter ini harus berupa indeks atau item yang dicari. Yang digunakan di sini adalah parameter berupa indeks elemen di dalam sebuah list koleksi. Anda dapat memiliki versi-versi terbebani dari properti ini, sehingga Anda bisa menyediakan alamat email, menggantikan indeks.

Apa yang telah Anda capai sampai titik ini adalah:
Cara untuk menyimpan sejumlah struktur Konsumen
Cara untuk menambah item baru pada koleksi
Cara untuk menghapus item dari koleksi
Cara untuk mengakses anggota-anggota di dalam koleksi seperti layaknya sebuah ArrayList


MEMBANGUN TABEL LOOKUP DENGAN HASHTABLE
Sejauh ini, kapanpun Anda ingin mencari sesuatu di dalam sebuah array atau di dalam sebuah koleksi, Anda perlu menyediakan sebuah indeks integer yang merepresentasikan posisi item. Adalah wajar jika Anda memerlukan cara lain untuk mencari sebuah item di dalam suatu koleksi selain menggunakan indeks. Sebagai contoh, Anda bisa saja ingin mencari sebuah konsumen ketika Anda memiliki sebuah alamat email.
Pada bagian ini, Anda akanmenggunakan Hashtable. Ini merupakan koleksi spesial yang dipakai menggunakan prinsip kunci-nilai.

Menggunakan Hashtable
Hashtable adalah sebuah koleksi dimana di dalamnya setiap item diberikan sebuah kunci. Kunci ini dapat dipakai di waktu lain untuk membuka kunci dari nilai. Sebagai contoh, jika Anda menambahkan struktur Konsumen dari Kristof ke dalam Hashtable, Anda akan memberikannya sebuah kunci yang cocok dengan alamat emailnya jKristof@gmail.com.

Kapanpun Anda menambahkan sebuah objek pada Hashtable, ia memanggil sebuah metode dengan nama System.Object.GetHashCode, yang menyediakan sebuah nilai integer unik untuk objek itu yang bernilai sama setiap kali dipanggil, dan secara internal menggunakan ID integer ini sebagai kunci. Sama halnya, kapanpun Anda ingin membaca sebuah objek dari Hashtable, ia memanggil metode GetHashCode pada objek itu untuk mendapatkan sebuah kunci dan mencocokkan kunci itu terhadap kunci-kunci di dalam list. Ketika ditemukan, ia menghasilkan nilai yang berkaitan.

Pencarian pada Hashtable merupakan proses yang sangat cepat. Terlepas dari objek yang dilewatkan, Anda hanya perlu melakukan pencocokan ID integer kecil. Sebuah ID integer hanya memerlukan 4 byte memori. Jadi, jika Anda melewatkan sebuah string 100-karakter (yaitu 200 byte), kode lookup hanya perlu membandingkan 4 byte.

LATIHAN
Menggunakan Hashtable
Anda akan belajar menggunakan sebuah Hashtable pada latihan ini.

1. Kembali ke Visual Studio dan buka editor kode untuk kelas KonsumenKoleksi. Tambahkan anggota yang ditebalkan berikut di bagian atas dari definisi kelas:

Public Class KonsumenKoleksi
    Inherits CollectionBase

    'Anggota Private
    Private objEmailHashtable As New Hashtable

2.    Tambahkan properti read-only berikut pada kelas:

'Properti EmailHashtable untuk menghasilkan the Email Hashtable
Public ReadOnly Property EmailHashtable() As Hashtable
    Get
        Return objEmailHashtable
    End Get
End Property

3.    Sekarang, lakukan perubahan pada metode Add:

'Menambahkan sebuah konsumen pada koleksi
Public Sub Add(ByVal konsumenBaru As Konsumen)
    Me.List.Add(konsumenBaru)

    'Menambahkan alamat email pada the Hashtable
    EmailHashtable.Add(konsumenBaru.Email, konsumenBaru)
End Sub

4. Selanjutnya, tambahkan versi terbebani dari properti Item yang membolehkan Anda untuk menemukan sebuah konsumen berdasarkan alamat email:

    'Membebani properti Item untuk mencari sebuah konsumen berdasarkan alamat email
    Default Public ReadOnly Property Item(ByVal email As String) As Konsumen
        Get
            Return CType(EmailHashtable.Item(email), Konsumen)
        End Get
    End Property

5.  Buka mode Design untuk Form1, ubah ukuran dari kontrol-kontrol pada form Anda, dan tambahkan sebuah kontrol Button baru di samping kotak teks email seperti ditunjukkan pada Gambar 3.20. Tetapkan properti Name dari tombol menjadi tombolLookup dan properti Text menjadi Lookup.

6. Klik ganda pada tombol Lookup dan tambahkan kode yang ditebalkan berikut pada event handler Click-nya:

Private Sub tombolLookup_Click(sender As Object, e As EventArgs) Handles tombolLookup.Click
    'Mendeklarasikan sebuah objek konsumen dan menetapkannya
    'menjadi konsumen dengan alamat email yang akan ditemukan
    Dim objKonsumenDitemukan As Konsumen = objKonsumen(teksEmail.Text)

    If Not IsNothing(objKonsumenDitemukan.Email) Then
        'MEnampilkan nama konsumen
        MessageBox.Show("Nama konsumen adalah: " &
            objKonsumenDitemukan.Nama, "Demo Struktur")
    Else
        'Menampilkan error
        MessageBox.Show("Tidak ada konsumen dengan alamat " &
            " email " & teksEmail.Text & ".", "Demo Struktur")
    End If
End Sub

7. Jalankan projek dan klik pada tombol Daftar Konsumen untuk mengisi daftar konsumen. Jika Anda memasukkan sebuah alamat email yang tidak ada ke dalam kotak Email dan kemudian menekan tombol Lookup, Anda akan melihat sebuah kotak pesan yang sama seperti ditunjukkan pada Gambar 3.21.


GAMBAR 3.21
Penjelasan
Pada contoh ini, Anda menambahkan sebuah anggota baru pada kelas KonsumenKoleksi yang dapat dipakai untuk memuat sebuah Hashtable:

'Anggota Private
Private objEmailHashtable As New Hashtable

Kapanpun Anda menambahkan sebuah Konsumen baru pada koleksi, Anda juga menambahkannya pada Hashtable:

'Menambahkan sebuah konsumen pada koleksi
Public Sub Add(ByVal konsumenBaru As Konsumen)
    Me.List.Add(konsumenBaru)

    'Menambahkan alamat email pada the Hashtable
    EmailHashtable.Add(konsumenBaru.Email, konsumenBaru)
End Sub

Namun, tidak seperti metode-metode Add yang telah ditunjukkan sebelumnya, metode EmailHashtable.Add mengambil dua parameter. Parameter pertama adalah kunci, dan Anda menggunakan alamat email sebagai kunci. Kunci dapat berupa sembarang objek yang Anda suka, tetapi ia harus unik. Anda tidak dapat menyuplai kunci yang sama dua kali. (Jika Anda lakukan, eksepsi akan dilemparkan). Parameter kedua adalah nilai yang ingin Anda hubungkan dengan kunci itu, sehingga kapanpun Anda memberikan kunci itu pada Hashtable, Anda mendapatkan objek itu kembali.

Trik berikutnya adalah menciptakan sebuah versi terbebani dari properti Item default. Properti ini mengambil sebuah string sebagai satu-satunya parameter. IntelliSense menampilkan metode terbebani sebagai item 1 dan 2 ketika Anda mengaksesnya dari kode Anda.

Kali ini Anda dapat menyediakan indeks maupun alamat email. Jika Anda menggunakan alamat email, Anda akan menggunakan versi terbebani dari properti Item. Ini memerlukan sebuah kunci dan menghasilkan item yang berelasi, jika kunci tersebut ditemukan:

'Membebani properti Item untuk mencari sebuah konsumen berdasarkan alamat email
Default Public ReadOnly Property Item(ByVal email As String) As Konsumen
    Get
        Return CType(EmailHashtable.Item(email), Konsumen)
    End Get
End Property

Pada titik ini, Anda memiliki sebuah kelas koleksi yang tidak hanya memampukan Anda untuk mencari item berdasarkan indeks, tetapi juga memampukan Anda untuk mencari item berdasarkan alamat emailnya.



Metode Remove, RemoveAt, dan Clear
Karena tidak dimungkinkan untuk menggunakan kunci yang sama dua kali pada sebuah Hashtable, Anda perlu mengambil langkah-langkah dalam memastikan bahwa apa yang ada di dalam Hashtable cocok dengan apapun yang ada di dalam list.

Meskipun Anda telah mengimplementasikan metode Remove di dalam kelas KonsumenKoleksi, kelas CollectionBase menyediakan metode RemoveAt dan Clear. Bila metode Remove memerlukan sebuah objek, metode RemoveAt memerlukan sebuah indeks.

LATIHAN
Membersihkan List

Pada latihan ini, Anda perlu menyediakan implementasi baru dari metode-metode ini untuk memperbarui Hashtable.

1. Kembali ke Visual Studio dan buka editor kode untuk Form1. Cari metode tombolDaftarKonsumen_Click dan tambahkan kode yang ditebalkan untuk membersihkan dua list:

Private Sub tombolDaftarKonsumen_Click(sender As Object, e As EventArgs)
Handles tombolDaftarKonsumen.Click
    'Membersihkan list-list
    objKonsumen.Clear()
    listKonsumen.Items.Clear()

    'Menciptakan beberapa konsumen
    CiptakanKonsumen("John", "Kristof",
        "jKristof@gmail.com")
    CiptakanKonsumen("Vivian", "Siahaan",
        "vSiahaan@yahoo.com")
    CiptakanKonsumen("Rico", "Chandra",
        "rChandra@yahoo.co.uk")
End Sub

2. Untuk mendemonstrasikan bagaimana sebuah Hashtable tidak dapat menggunakan kunci yang sama dua kali, jalankan projek dan klik pada tombol Daftar Konsumen untuk memuat daftar konsumen. Sekarang klik pada tombol Daftar Konsumen itu lagi dan Anda akan melihat pesan error yang ditunjukkan pada Gambar 3.22.


GAMBAR 3.22

3.    Klik tombol Break untuk menghentikan program.
4.    Tambahkan metode berikut pada kelas KonsumenKelas:

'Menyediakan implementasi baru dari kelas Clear
Public Shadows Sub Clear()
    'Membersihkan CollectionBase
    MyBase.Clear()

    'Membersihkan hashtable
    EmailHashtable.Clear()
End Sub

5.  Modifikasi metode Remove sebagai berikut:

'Menghapus sebuah konsumen dari koleksi
Public Sub Remove(ByVal konsumenLama As Konsumen)
    Me.List.Remove(konsumenLama)

    'Menghapus konsumen dari the Hashtable
    EmailHashtable.Remove(konsumenLama.Email.ToLower)
End Sub

6. Tambahkan metode RemoveAt untuk mendefinisikan ulang metode default yang didefinisikan di dalam kelas CollectionBase:

'Menyediakan implementasi baru dari metode RemoveAt
Public Shadows Sub RemoveAt(ByVal indeks As Integer)
    Remove(Item(indeks))
End Sub

7.  Jalankan projek dan klik pada tombol Daftar Konsumen untuk memuat konsumen-konsumen. Klik pada tombol Daftar Konsumen lagi untuk membersihkan daftar konsumen tersebut sebelum memuat konsumen-konsumen itu lagi. Perhatikan bahwa kali ini tidak ada eksepsi yang dilemparkan.

Penjelasan
Dengan perubahan-perubahan ini, eksepsi tidak dilemparkan kedua kalinya karena Anda telah memastikan bahwa Hashtable dan list internal yang dikelola oleh CollectionBase disinkronisasi dengan tepat. Secara spesifik, kapanpun list KonsumenKoleksi Anda dibersihkan menggunakan metode Clear, Anda memastikan bahwa Hashtable juga dibersihkan.

Untuk membersihkan list internal yang dikelola oleh CollectionBase, Anda meminta kelas basis untuk menggunakan implementasi Clear sendiri daripada harus menyediakan implementasi sendiri. Anda melakukan ini dengan memanggil MyBase.Clear. Setelah itu, Anda memanggil metode Clear pada Hashtable:

'Menyediakan implementasi baru dari kelas Clear
Public Shadows Sub Clear()
    'Membersihkan CollectionBase
    MyBase.Clear()

    'Membersihkan hashtable
    EmailHashtable.Clear()
End Sub

Anda juga menemukan bahwa Anda menghapus item dari koleksi menggunakan Remove, entri terkait juga dihapus dari Hashtable, karena modifikasi pada metode Remove:

'Menyediakan implementasi baru dari metode RemoveAt
Public Shadows Sub RemoveAt(ByVal indeks As Integer)
    Remove(Item(indeks))
End Sub



Sensitifitas Huruf
Jika Anda menjalankan projek dan mengklik tombol Daftar Konsumen dan kemudian memasukkan alamat email yang valid dengan semua huruf besar, Anda akan menerima kotak pesan yang mengindikasikan bahwa tidak ada konsumen dengan alamat email itu.

LATIHAN
Sensitifitas Huruf

Anda menginginkan koleksi untuk mengabaikan sensitifitas kuruf pada kunci. Pada latihan ini, Anda melakukan ini dengan memastikan bahwa kapanpun Anda menyimpan sebuah kunci, Anda mentransformasikan alamat email menjadi semua karakter huruf kecil. Kapanpun Anda melakukan pencarian berbasis kunci, Anda mentransformasikan apapun yang Anda cari menjadi semua karakter huruf kecil juga.

1.  Kembali ke Visual Studio, buka editor kode untuk kelas KonsumenKelas, dan buat perubahan yang ditebalkan berikut pada metode Add:

'Menambahkan sebuah konsumen pada koleksi
Public Sub Add(ByVal konsumenBaru As Konsumen)
    Me.List.Add(konsumenBaru)

    'Menambahkan alamat email pada the Hashtable
    EmailHashtable.Add(konsumenBaru.Email.ToLower, konsumenBaru)
End Sub

2. Cari properti Item terbebani yang mengambil sebuah alamat email dan lakukan modifikasi kode seperti ditunjukkan di sini:

'Membebani properti Item untuk mencari sebuah konsumen berdasarkan alamat email
Default Public ReadOnly Property Item(ByVal email As String) As Konsumen
    Get
        Return CType(EmailHashtable.Item(email.ToLower), Konsumen)
    End Get
End Property

3.    Cari metode Remove dan lakukan modifikasi kode seperti ditunjukkan di sini:

'Menghapus sebuah konsumen dari koleksi
Public Sub Remove(ByVal konsumenLama As Konsumen)
    Me.List.Remove(konsumenLama)

    'Menghapus konsumen dari the Hashtable
    EmailHashtable.Remove(konsumenLama.Email.ToLower)
End Sub

4. Jalankan projek dan klik pada tombol Daftar Konsumen. Sekarang, jika Anda memasukkan sebuah alamat email yang valid dengan semua karakter huruf besar, pencarian akan tetap berhasil dilakukan.

Penjelasan
Pada bab 2, Anda melihat bahwa Anda dapat melakukan pembandingan string dengan insensitifitas huruf menggunakan metode String.Compare. Anda tidak dapat menggunakan teknik ini di sini karena Hashtable yang menangani perbandingan dan Anda tidak ingin menghasilkan versi sendiri dari kode perbandingan yang digunakan oleh Hashtable untuk melakukan pencocokan insensitifitas huruf.

Anda dapat menggunakan metode ToLower yang tersedia untuk string. Ini menciptakan sebuah string baru dimana di dalamnya semua karakter ditransformasikan menjadi huruf kecil ekivalen. Jadi, kapanpun Anda melewatkan JKRISTOF@GMAIL.COM atau JKristof@GMail.Com, Anda akan selalu mendapatkan jkristof@gmail.com.

Ketika Anda menambahkan sebuah item pada koleksi, Anda dapat menggunakan ToLower untuk mengkonversi semua alamat email yang disimpan di dalam struktur Konsumen sehingga ia selalu dengan huruf kecil:

'Menambahkan alamat email pada the Hashtable
EmailHashtable.Add(konsumenBaru.Email.ToLower, konsumenBaru)

Sama halnya, ketika Anda melakukan pencarian, Anda juga mengkonversi apapun nilai yang dilewatkan sebagai parameter menjadi semua karakter huruf kecil:

Return CType(EmailHashtable.Item(email.ToLower), Konsumen)


MANIPULASI ARRAY LANJUT
Kemampuan untuk memanipulasi ukuran array dari kode dan untuk menyimpan himpunan data kompleks di dalam sebuah array merupakan hal penting, tetapi dengan .NET, hal itu dapat lebih mudah dilakukan dengan memanfaatkan fungsionalitas koleksi.

Array Dinamis
Ketika menggunakan array, jika Anda ingin mengubah ukurannya untuk menambahkan item, atau membersihkan ruang ketika Anda menghapus item, Anda perlu menggunakan katakunci ReDim untuk membuat array menjadi array dinamis.

LATIHAN
Menggunakan Katakunci ReDim
Pada latihan ini, Anda akan menggunakan kembali projek Demo Array yang telah Anda ciptakan di awal bab ini dan memanipulasinya sedikit sehingga Anda dapat menambahkan teman-teman baru pada array setelah array awal diciptakan.

1.  Cari dan buka projek Demo Array. Buka editor kode untuk Form1 dan modifikasi kode pada metode TambahkanItemPadaList sehingga ia tampak seperti ini:

Private Sub TambahkanItemPadaList(ByVal arrayList() As String)
    'Mengenumerasi array
    For Each strNama As String In arrayList
        'Menambahkan item array pada list
        listTeman.Items.Add("[" & strNama & "]")
    Next
End Sub

2.  Jalankan projek dan klik tombol Inisialisasi Array. Form Anda akan tampak seperti pada Gambar3.23; perhatikan kurung siku yang mengitari setiap nama.



GAMBAR 3.23

3. Hentikan projek dan lakukan perubahan yang ditebalkan berikut pada metode tombolInisialisasiArray_Click:

Private Sub tombolInisialisasiArray_Click(sender As Object, e As EventArgs) Handles tombolInisialisasiArray.Click
    'Membersikan list
    BersihkanList()

    'Mendeklarasikan dan mengisi array
    Dim strTemanKu() As String = {"Widi", "Hari", "Jodi",
                                  "Misel", "Rico"}

    'Membuat array strTemanKu menjadi lebih besar
    ReDim strTemanKu(6)
    strTemanKu(5) = "Lina"
    strTemanKu(6) = "Tobat"

    'Menampilkan teman Anda
    TambahkanItemPadaList(strTemanKu)
End Sub

4.  Jalankan projek kembali dan klik pada tombol Inisialisasi Array. Form Anda akan tampak seperti ditunjukkan pada Gambar 3.24.


GAMBAR 3.24

Penjelasan
Setelah mendefinisikan sebuah array dengan lima elemen, Anda menggunakan katakunci ReDim untuk mengubah dimensi array dengan batas atas 6, yang memberikannya ukuran 7. Setelah Anda melakukannya, Anda memiliki dua item baru di dalam array, item 5 dan item 6:

'Membuat array strTemanKu menjadi lebih besar
ReDim strTemanKu(6)
strTemanKu(5) = "Lina"
strTemanKu(6) = "Tobat"

Kemudian, Anda melewatkan ukuran dengan ukuran berubah kepada metode TambahkanItemPadaList:

'Menampilkan teman Anda
TambahkanItemPadaList(strTemanKu)

Namun, seperti ditunjukkan pada hasil, nilai-nilai untuk lima item pertama telah hilang. (Inilah mengapa Anda memberikan kurung siku pada hasil, jika nama di dalam array dibiarkan kosong, Anda masih tetap melihat sesuatu di dalam list). ReDim memang mengubah ukuran array, tetapi ketika array diubah ukurannya, secara default semua nilai di dalam array dihapus, menghilangkan semau nilai yang didefinisikan ketika Anda menginisialisasi array.

Anda dapat menyelesaikan permasalahan ini menggunakan katakunci Preserve.

Menggunakan Preserve
Dengan mencantumkan katakunci Preserve dengan katakunci ReDim, Anda dapat menginstruksikan Visual Basic untuk tidak menghapus item-item yang ada. Satu hal yang perlu diingat adalah bahwa jika Anda membuat sebuah array menjadi lebih kecil dari array semula, data akan hilang dari elemen-elemen yang dieliminasi meskipun Anda menggunakan katakunci Preserve.

LATIHAN
Menggunakan Katakunci Preserve
Pada latihan ini, Anda menggunakan katakunci Preserve.

1. Kembali ke Visual Studio, buka editor kode untuk Form1, dan modifikasi metode tombolInisialisasiArray_Click sebagai berikut:

Private Sub tombolInisialisasiArray_Click(sender As Object, e As EventArgs) Handles tombolInisialisasiArray.Click
    'Membersikan list
    BersihkanList()

    'Mendeklarasikan dan mengisi array
    Dim strTemanKu() As String = {"Widi", "Hari", "Jodi",
                                  "Misel", "Rico"}

    'Membuat array strTemanKu menjadi lebih besar
    ReDim Preserve strTemanKu(6)
    strTemanKu(5) = "Lina"
    strTemanKu(6) = "Tobat"

    'Menampilkan teman Anda
    TambahkanItemPadaList(strTemanKu)
End Sub

2.  Jalankan projek kembali dan klik pada tombol Inisialisasi Array.

Penjelasan
Anda sekarang menemukan bahwa item-item yang ada di dalam array tetap dipertahankan, seperti ditunjukkan pada Gambar 3.25.


GAMBAR 3.25





No comments:

Post a Comment