Sunday, December 25, 2016

Bab 14. Visual Basic .NET Belajar Dari Contoh



14. File







Pengantar

Visual Basic memandang setiap file sebagai aliran byte sekuensial. Setiap file diakhiri dengan penanda end-of-file. Ketika file dibuka, Visual Basic menciptakan sebuah objek dan kemudian mengaitkan sebuah aliran dengan objek tersebut. Ada tiga objek aliran, masing-masing dapat diakses lewat properti Console.Out, Console.In, dan Console.Error. Ketiga objek tersebut memfasilitasi komunikasi antara program dan file atau divais tertentu. Properti Console.In menghasilkan objek aliran masukan standar, yang memampukan sebuah program untuk membaca data dari keyboard. Properti Console.Out menghasilkan objek aliran keluaran standar, yang memampukan sebuah program untuk menampilkan data pada monitor. Properti Console.Error menghasilkan objek aliran error standard, yang memampukan sebuah program untuk menampilkan pesan error pada layar. Anda telah menggunakan Console.Out dan Console.In pada beberapa aplikasi konsol sebelumnya, dimana metode-metode Console, Write dan WriteLine menggunakan Console.Out dalam menampilkan keluaran, dan metode-metode Read dan ReadLine menggunakan Console.In dalam membaca masukan.

Untuk melakukan pemrosesan file dalam Visual Basic, namespace System.IO harus direferensi. Namespace ini mencakup beberapa definisi untuk kelas-kelas aliran seperti StreamReader (untuk membaca teks dari sebuah file), StreamWriter (untuk menulis teks ke dalam sebuah file), dan FileStream (untuk kedua pembacaan dan penulisan file). File dibuka dengan menciptakan objek dari kelas aliran tersebut, yang mewarisi kelas MustInherit TextReader, TextWriter, dan Stream. Sebenarnya, Console.In dan Console.Out merupakan properti dari kelas TextReader dan TextWriter. Kedua kelas tersebut adalah MustInherit; StreamReader dan StreamWriter adalah kelas yang diderivasi dari kelas TextReader dan TextWriter.

Visual Basic menyediakan kelas BinaryFormatter, yang digunakan dengan sebuah objek Stream untuk melakukan pembacaan dan penulisan objek. Serialisasi melibatkan konversi sebuah objek menjadi format yang dapat ditulis ke dalam sebuah file tanpa harus kehilangan data objek. Deserialisasi memuat pembacaan format tersebut dari sebuah file dan merekonstruksi objek asli darinya. Sebuah BinaryFormatter dapat menserialisasi objek dan mendeserialisasi objek.

Kelas System.IO.Stream menyediakan fungsionalitas untuk merepresentasikan aliran sebagai byte. Kelas ini adalah MustInherit, jadi objek-objek kelas ini tidak dapat diinstansiasi. Kelas FileStream, MemoryStream, dan BufferedStream (semua dari namespace System.IO) mewarisi kelas Stream.


Kelas File dan Kelas Directory
Informasi pada komputer disimpan dalam file, yang diorganisasi dalam direktori. Kelas File disediakan untuk memanipulasi file, dan kelas Directory disediakan untuk memanipulasi direktori. Kelas File tidak dapat menulis ke atau membaca dari file secara langsung.

Perhatikan bahwa karakter separator \ memisahkan direktori dan file pada sebuah path. Pada sistem UNIX, karakter separator adalah /. Visual Basic dapat memproses kedua karakter tersebut. Ini berarti bahwa, jika Anda menspesifikasi path c:\Visual Basic/README, yang menggunakan kedua karakter separator tersebut, maka Visual Basic masih bisa memproses file itu secara benar.

Gambar 14.1 mencantumkan beberapa metode pada kelas File untuk memanipulasi dan menentukan informasi tentang file tertentu. Kelas File hanya memuat metode-metode Shared, jadi Anda tidak bisa menginstansiasi objek bertipe File. Beberapa dari metode tersebut akan dipakai dalam contoh pada kode 14.1.

Metode Shared
Deskripsi
AppendText



Copy

Create


CreateText

Delete

GetCreationTime


GetLastAccessTime


GetLastWriteTime


Move

Open


OpenRead


OpenText

OpenWrite
Menghasilkan sebuah StreamWriter yang dikaitkan pada sebuah file yang sudah ada atau menciptakan sebuah file jika file yang dimaksud belum ada.

Menyalin sebuah file ke dalam file baru.

Menghasilkan sebuah FileStream yang dikaitkan dengan file yang baru saja diciptakan.

Menghasilkan sebuah StreamWriter yang dikaitkan dengan file teks baru.

Menghapus file yang diinginkan.

Menghasilkan sebuah objek DateTime yang merepresentasikan waktu ketika file diciptakan.

Menghasilkan sebuah objek DateTime yang merepresentasikan waktu ketika file terakhir kali diakses.

Menghasilkan sebuah objek DateTime yang merepresentasikan waktu ketika file terakhir kali dimodifikasi.

Memindahkan file tertentu ke lokasi tertentu.

Menghasilkan sebuah FileStream yang dikaitkan dengan file tertentu dan dilengkapi dengan ijin pembacaan/penulisan.

Menghasilkan sebuah FileStream read-only yang dikaitkan dengan file tertentu.

Menghasilkan sebuah StreamReader yang dikaitkan dengan file tertentu.

Menghasilkan sebuah FileStream read/write yang dikaitkan dengan file tertentu.

Gambar 14.1 Beberapa metode kelas File


Kelas Directory menyediakan beberapa kapabilitas untuk memanipulasi direktori dengan .NET framework. Gambar 14.2 mencantumkan beberapa metode yang dapat dipakai untuk manipulasi direktori. Beberapa dari metode tersebut dipakai dalam contoh pada kode 14.1.

Objek DirectoryInfo yang dijadikan nilai balik oleh metode CreateDirectory memuat informasi tentang sebuah direktori. Informasi yang dimuat pada kelas ini dapat pula diakses via metode-metode Directory.

Metode Shared
Deskripsi
CreateDirectory


Delete

Exists


GetLastWriteTime


GetDirectories


GetFiles


GetCreationTime


GetLastAccessTime


GetLastWriteTime


Move
Menghasilkan objek DirectoryInfo yang dikaitkan dengan direktori yang baru saja diciptakan.

Menghapus direktori tertentu.

Menghasilkan True jika direktori tertentu eksis; sebaliknya, ia menghasilkan False.

Menghasilkan sebuah objek DateTime yang merepresentasikan waktu ketika direktori tertentu terakhir kali dimodifikasi.

Menghasilkan array String yang merepresentasikan nama-nama direktori di dalam direktori tertentu.

Menghasilkan array String yang merepresentasikan nama-nama direktori di dalam file tertentu.

Menghasilkan sebuah objek DateTime yang merepresentasikan waktu ketika direktori tertentu diciptakan.

Menghasilkan sebuah objek DateTime yang merepresentasikan waktu ketika direktori tertentu terakhir kali diakses.

Menghasilkan sebuah objek DateTime yang merepresentasikan waktu ketika item-item terakhir kali dituliskan ke dalam direktori.

Memindahkan direktori tertentu ke lokasi tertentu.

Gambar 14.2 Beberapa metode kelas Directory


Kelas FrmUjiFile (kode 14.1) menggunakan berbagai metode yang dideskripsikan pada Gambar 14.1 dan Gambar 14.2 untuk mengakses file dan informasi direktori. Kelas ini memuat TextBox txtMasukan (baris 15), yang memampukan pengguna untuk memasukkan sebuah file atau nama direktori. Untuk setiap kunci yang ditekan pengguna pada kotak teks, program akan memanggil txtMasukan_KeyDown (baris 20-84). Jika pengguna menekan kunci Enter (baris 25), metode ini akan menampilkan file atau isi direktori, tergantung dari masukan pengguna pada TextBox (Perhatikan bahwa, jika pengguna tidak menekan kunci Enter, maka metode ini tidak akan menampilkan isi apapun). Baris 33 menggunakan metode Exists dari kelas File untuk menentukan apakah teks yang diberikan pengguna adalah sebuah file. Jika pengguna menspesifikasi sebuah file yang sudah ada, maka baris 36 akan memanggil metode Private GetInformasi (baris 87-108), yang memanggil metode GetCreationTime (baris 97), GetLastWriteTime (baris 101), dan GetLastAccessTime (baris 105) dari kelas File untuk mengakses informasi pada file. Ketika metode GetInformasi selesai dieksekusi, baris 42-43 menginstansiasi sebuah StreamReader untuk membaca teks dari file. Konstruktor StreamReader memerlukan sebuah argumen String yang memuat nama file yang akan dibuka. Baris 44 memanggil metode ReadToEnd dari kelas StreamReader untuk membaca isi file dan menampilkannya.

Jika baris 33 menentukan bahwa teks yang dimasukkan pengguna bukanlah sebuah file, maka baris 56 memutuskan bahwa ia adalah sebuah direktori menggunakan metode Exists dari kelas Directory. Jika pengguna memasukkan direktori yang sudah ada, maka baris 62 memanggil metode GetInformasi untuk mengakses informasi direktori. Baris 65 memanggil metode GetDirectories dari kelas Directory untuk mendapatkan array String yang memuat nama-nama subdirektori di dalam direktori yang dispesifikasi. Baris 71-73 menampilkan setiap elemen di dalam array String. Perhatikan bahwa, jika baris 56 menentukan bahwa teks yang dimasukkan pengguna bukanlah file atau direktori, maka baris 77-79 akan memberitahu pengguna (lewat MessageBox) bahwa file atau direktori tidak ada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
' Kode 14.1: UjiFile.vb
' Menggunakan kelas File dan Directory.

Imports System.IO
Imports System.Windows.Forms

Public Class FrmUjiFile
    Inherits Form

    ' label yang memberikan peritah pada pengguna
    Friend WithEvents lblArahan As Label

    ' kotak teks untuk membaca dan menampilkan data
    Friend WithEvents txtKeluaran As TextBox
    Friend WithEvents txtMasukan As TextBox

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' invoked when user presses key
    Protected Sub txtMasukan_KeyDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyEventArgs) Handles _
        txtMasukan.KeyDown

        ' menentukan apakah pengguna menekan kunci Enter
        If e.KeyCode = Keys.Enter Then

            Dim namaFile As String ' nama file atau direktori

            ' mendapatkan masukan pengguna
            namaFile = txtMasukan.Text

            ' menentukan apakah namaFile adalah sebuah file
            If File.Exists(namaFile) Then

                ' mendapatkan tanggal penciptaan, modifikasi, dll atas file
                txtKeluaran.Text = GetInformasi(namaFile)

                ' menampilkan isi file via StreamReader
                Try

                    ' mendapatkan isi file
                    Dim stream As StreamReader
                    stream = New StreamReader(namaFile)
                    txtKeluaran.Text &= stream.ReadToEnd()

                    ' menangani eksepsi jika StreamReader tak tersedia
                Catch exceptionCatch As IOException

                    ' menampilkan error
                    MessageBox.Show("FILE ERROR", "FILE ERROR", _
                    MessageBoxButtons.OK, MessageBoxIcon.Error)

                End Try

                ' menentukan apakah namaFile adalah sebuah direktori
            ElseIf Directory.Exists(namaFile) Then

                Dim arrayDirektori As String() ' array untuk sub-subdirektori
                Dim i As Integer

                ' mendapatkan tanggal penciptaan, modifikasi, dll atas direktori
                txtKeluaran.Text = GetInformasi(namaFile)

                ' mendapatkan daftar direktori di dalam direktori tertentu
                arrayDirektori = Directory.GetDirectories(namaFile)

                txtKeluaran.Text &= vbCrLf & vbCrLf & _
                "Isi direktori:" & vbCrLf

                ' menampilkan isi arrayDirektori
                For i = 0 To arrayDirektori.Length - 1
                    txtKeluaran.Text &= arrayDirektori(i) & vbCrLf
                Next

                ' memberitahu pengguna bahwa baik file atau direktori tidak eksis
            Else
                MessageBox.Show(txtMasukan.Text & " tidak ada", _
                    "FILE ERROR", MessageBoxButtons.OK, _
                    MessageBoxIcon.Error)
            End If

        End If ' menentukan apakah pengguna menekan Enter

    End Sub ' txtMasukan_KeyDown

    ' mendapatkan informasi file atau direktori
    Private Function GetInformasi(ByRef fileName As String) _
        As String

        Dim informasi As String

        ' menampilkan bahwa file atau direktori ada
        informasi = fileName & " ada" & vbCrLf & vbCrLf

        ' menampilkan kapan file atau direktori diciptakan
        informasi &= "Diciptakan : " & _
        File.GetCreationTime(fileName) & vbCrLf

        ' menampilkan kapan file atau direktori terakhir kali dimodifikasi
        informasi &= "Terakhir dimodifikasi: " & _
        File.GetLastWriteTime(fileName) & vbCrLf

        ' menampilkan kapan file atau direktori terakhir kali diakses
        informasi &= "Terakhir diakses: " & _
        File.GetLastAccessTime(fileName) & vbCrLf & vbCrLf

        Return informasi
    End Function ' GetInformasi

End Class  ' FrmUjiFile


Gambar 14.3 Keluaran program pada kode 14.1


Sekarang akan disajikan contoh lain yang menggunakan kapabilitas manipulasi direktori dan file pada Visual Basic. Kelas FrmCariFile (kode 14.2) menggunakan kelas File dan Directory bersama dengan kelas-kelas lain yang melakukan ekspresi reguler untuk melaporkan jumlah file untuk tipe file di dalam path direktori yang dispesifikasi. Program juga berperan untuk utilitas “pembersihan”, ketika program menjumpai sebuah file berekstensi .bak (backup file). Program menampilkan sebuah MessageBox untuk menanyakan apakah file tersebut perlu dihapus dan merespon sesuai masukan pengguna.

Ketika pengguna menekan kunci Enter atau mengklik tombol Cari Direktori, program akan memanggil cmdCari_Click (baris 47-88), yang mencari secara rekursif melalui path direktori yang disediakan pengguna. Jika pengguna memasukkan teks di dalam TextBox, baris 56 akan memanggil metode Exists dari kelas Directory untuk menentukan apakah teks tersebut mengindikasikan direktori yang valid. Jika pengguna menspesifikasi direktori yang tak valid, maka baris 65-66 akan memberitahu pengguna tentang error yang terjadi.

Jika pengguna menspesifikasi direktori yang valid, baris 78 akan melewatkan nama direktori sebagai argumen kepada metode Private CariDirektori (baris 91-181). Metode ini akan mencari lokasi file-file dengan dasar ekspresi reguler yang didefinisikan pada baris 100-101 oleh objek Regex, yang mencocokkan sembarang runtun angka atau huruf yang diikuti dengan sebuah titik dan satu atau lebih huruf. Perhatikan bahwa substring format (?<extension>ekspresi-reguler) yang dimuat  di dalam argumen pada konstruktor Regex (baris 101). Pada program ini, sembarang String yang cocok dengan satu atau lebih karakter akan ditugaskan pada variabel extension.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
' Kode 14.2: CariFile.vb
' Menggunakan ekspresi reguler untuk menentukan tipe file.

Imports System.IO
Imports System.Text.RegularExpressions
Imports System.Collections.Specialized
Imports System.Windows.Forms

Public Class FrmCariFile
    Inherits Form

    ' label yang menampilkan direktori sekarang
    Friend WithEvents lblDirektori As Label

    ' label yang menampilkan arahan kepada pengguna
    Friend WithEvents lblDireksi As Label

    ' tombol yang mengaktivasi pencarian
    Friend WithEvents cmdCari As Button

    ' kotak teks untuk membaca dan menampilkan data
    Friend WithEvents txtMasukan As TextBox
    Friend WithEvents txtKeluaran As TextBox

    ' kode yang dibangkitkan oleh Visual Studio .NET

    Dim direktoriSekarang As String = Directory.GetCurrentDirectory
    Dim daftarDirektori As String() ' sub-subdirektori
    Dim arrayFile As String() ' file-file dalam direktori sekarang

    ' menyimpan ekstensi-ekstensi yang ditemukan dan jumlahnya
    Dim ditemukan As NameValueCollection = New NameValueCollection()

    ' dipanggil ketika pengguna mengetik dalam kotak teks
    Private Sub txtMasukan_KeyDown(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.KeyEventArgs) _
        Handles txtMasukan.KeyDown

        ' menentukan apakah pengguna menekan Enter
        If (e.KeyCode = Keys.Enter) Then
            cmdCari_Click(sender, e)
        End If

    End Sub ' txtMasukan_KeyDown

    ' dipanggil ketika pengguna mengklik tombol "Cari Direktori"
    Private Sub cmdCari_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdCari.Click

        Dim sekarang As String

        ' memeriksa masukan pengguna: default adalah direktori sekarang
        If txtMasukan.Text <> "" Then

            ' verifikasi apakah masukan pengguna adalah nama direktori yang valid
            If Directory.Exists(txtMasukan.Text) Then
                direktoriSekarang = txtMasukan.Text

                ' mereset kotak teks masukan dan memperbarui tampilan
                lblDirektori.Text = "Direktori Sekarang:" & vbCrLf & _
                direktoriSekarang

                ' menampilkan error jika pengguna tidak menspesifikasi direktori yang valid
            Else
                MessageBox.Show("Direktori Tak Valid", "Error", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)

                Return
            End If

        End If

        ' membersihkan kotak teks
        txtMasukan.Text = ""
        txtKeluaran.Text = ""

        ' melakukan pencarian pada direktori
        CariDirektori(direktoriSekarang)

        ' menyimpulkan dan menampilkan hasil
        For Each sekarang In ditemukan
            txtKeluaran.Text &= "* Ditemukan " & ditemukan(sekarang) & " " _
            & sekarang & " file." & vbCrLf
        Next

        ' membersihkan keluaran untuk pencarian baru
        ditemukan.Clear()
    End Sub  ' cmdCari_Click

    ' melakukan pencarian pada direktori menggunakan ekspresi reguler
    Private Sub CariDirektori(ByVal direktoriSekarang As String)

        ' untuk nama file tanpa path direktori
        Try
            Dim namaFile As String = ""
            Dim fileKu As String
            Dim direktoriKu As String

            ' ekspresi reguler untuk ekstensi
            Dim ekspresiReguler As Regex = _
                New Regex("([a-zA-Z0-9]+\.(?<extension>\w+))")

            ' menyimpan hasil ekspresi-reguler-cocok
            Dim hasilCocok As Match

            Dim ekstensiFile As String ' menampung ekstensi-ekstensi file

            ' jumlah file dengan ekstens-ekstensi di dalam direktori
            Dim hitungEkstensi As Integer

            ' mendapatkan direktosi
            daftarDirektori = _
                Directory.GetDirectories(direktoriSekarang)

            ' mendapatkan daftar file dalam direktori sekarang
            arrayFile = Directory.GetFiles(direktoriSekarang)

            ' iterasi melalui daftar file
            For Each fileKu In arrayFile

                ' menghapus path direktori dari nama file
                namaFile = fileKu.Substring( _
                    fileKu.LastIndexOf("\") + 1)

                ' mendapatkan hasil pencarian ekspresi reguler
                hasilCocok = ekspresiReguler.Match(namaFile)

                ' memeriksa kecocokan
                If (hasilCocok.Success) Then
                    ekstensiFile = hasilCocok.Result("${extension}")
                Else
                    ekstensiFile = "[tidak ada ekstensi]"
                End If

                ' menyimpan nilai dari kontainer
                If (ditemukan(ekstensiFile) = Nothing) Then
                    ditemukan.Add(ekstensiFile, "1")
                Else
                    hitungEkstensi = _
                    Convert.ToInt32(ditemukan(ekstensiFile)) + 1

                    ditemukan(ekstensiFile) = hitungEkstensi.ToString()
                End If

                ' mencari file backup(.bak)
                If ekstensiFile = "bak" Then

                    ' meminta pengguna untuk menghapus file (.bak)
                    Dim hasil As DialogResult = _
                        MessageBox.Show("Ditemukan file backup " & _
                        namaFile & ". Hapus?", "Hapus Backup", _
                        MessageBoxButtons.YesNo, _
                        MessageBoxIcon.Question)

                    ' menghapus file jika pengguna mengklik 'yes'
                    If (hasil = DialogResult.Yes) Then
                        File.Delete(fileKu)
                        hitungEkstensi = _
                            Convert.ToInt32(ditemukan("bak")) - 1

                        ditemukan("bak") = hitungEkstensi.ToString()
                    End If

                End If

            Next

            ' pemanggilan rekursif untuk mencari file-file dalam subdirektori
            For Each direktoriKu In daftarDirektori
                CariDirektori(direktoriKu)
            Next

            ' menangani eksepsi jika file memiliki unauthorized access
        Catch unauthorizedAccess As UnauthorizedAccessException
            MessageBox.Show("Beberapa file tidak dapat terlihat karena" _
                & " pengaturan perijinan", "Peringatan", _
                MessageBoxButtons.OK, MessageBoxIcon.Information)

        End Try

    End Sub ' CariDirektori

End Class  ' FrmCariFile


Gambar 14.4 Keluaran program pada kode 14.2


Baris 112-113 memanggil metode GetDirectories dari kelas Directory untuk mendapatkan nama-nama dari semua direktori yang berada di dalam direktori sekarang. Baris 116 memanggil metode GetFiles dari kelas Directory untuk menyimpan semua nama file pada direktori sekarang di dalam array String arrayFile. Loop For Each pada baris 119 mencari semua file berekstensi bak; ia kemudian memanggil CariDirektori secara rekursif untuk setiap subdirektori di dalam direktori sekarang. Baris 122-123 mengeliminasi path direktori, sehingga program hanya dapat menguji nama file ketika menggunakan ekspresi reguler. Baris 126 menggunakan metode Match dari objek Regex untuk mencocokkan ekspresi reguler dengan nama file dan kemudian memberikan hasilnya kepada objek hasilCocok bertipe Match. Jika pencocokan berhasil, maka baris 130 menggunakan metode Result dari objek hasilCocok untuk menyimpan String ekstensi dari objek hasilCocok di dalam ekstensiFile. Jika kecocokan tidak berhasil, maka baris 132 akan menetapkan ekstensiFile untuk menampung sebuah nilai “[tidak ada ekstensi]”.

Kelas FrmCariFile menggunakan sebuah instans dari kelas NameValueCollection (dideklarasikan pada baris 32) untuk menyimpan tiap tipe ekstensi file dan jumlah file untuk tiap tipe. Sebuah NameValueCollection memuat koleksi pasangan-pasangan kunci/nilai, masing-masing adalah sebuah String, dan menyediakan metode Add untuk menambah pasangan kunci/nilai. Indekser untuk pasangan ini dapat mengindeks sesuai dengan urutan ketika item-item ditambahkan atau sesuai dengan kunci entri. Baris 136 menggunakan variabel NameValueCollection, ditemukan, untuk menentukan apakah ini merupakan kemunculan pertama dari ekstensi file. Jika ya, baris 137 akan menambahkan ekstensi tersebut sebagai kunci dengan nilai 1 pada ditemukan. Sebaliknya, baris 139-142 akan menginkremen nilai yang dikaitkan dengan ekstensi di dalam ditemukan.

Baris 146 menentukan apakah ekstensiFile sama dengan “bak”. Baris 149-153 meminta pengguna untuk mengindikasikan apakah file tersebut harus dihapus atau tidak. Jika pengguna mengklik Yes (baris 156), maka baris 157-159 akan menghapus file tersebut dan mendekremen nilai tipe file “bak” di dalam ditemukan.


Menciptakan File Akses-Sekuensial
Visual Basic tidak memaksakan struktur apapun pada sebuah file. Ini berarti bahwa, programer harus menstrukturisasi file untuk memenuhi persyaratan aplikasi. Kelas FrmBankUI (kode 14.3) memuat empat Label (baris 10-13) dan empat TextBox (baris 16-19). Metode BersihTextBox (baris 35-52), SetNilaiTextBox (baris 55-72), dan GetNilaiTextBox (baris 74-86) menghapus, menetapkan nilai-nilai, dan mendapatkan nilai-nilai teks di dalam TextBox.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
' Kode 14.3: BankUI.vb
' Windows form yang dapat didaur-ulang untuk contoh-contoh pada bab ini.

Imports System.Windows.Forms

Public Class FrmBankUI
    Inherits Form

    ' label untuk TextBox
    Public WithEvents lblAkun As Label
    Public WithEvents lblNamaPertama As Label
    Public WithEvents lblNamaAkhir As Label
    Public WithEvents lblSaldo As Label

    ' beberapa kotak teks yang menerima masukan pengguna
    Public WithEvents txtAkun As TextBox
    Public WithEvents txtNamaPertama As TextBox
    Public WithEvents txtNamaAkhir As TextBox
    Public WithEvents txtSaldo As TextBox

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' jumlah TextBox pada Form
    Protected JumlahTextBox As Integer = 4

    ' konstanta-konstanta enumerasi menspesifikasi indeks TextBox
    Public Enum IndeksTextBox
        AKUN
        PERTAMA
        AKHIR
        SALDO
    End Enum

    ' membersihkan semua TextBox
    Public Sub BersihTextBox()
        Dim kontrolKu As Control ' komponen GUI sekarang
        Dim i As Integer

        ' iterasi melalui setiap Control pada form
        For i = 0 To Controls.Count - 1
            kontrolKu = Controls(i) ' mendapatkan Control

            ' menentukan apakah Control adalah TextBox
            If (TypeOf kontrolKu Is TextBox) Then

                ' membersihkan properti Text (ditetapkan menjadi String kosong)
                kontrolKu.Text = ""
            End If

        Next

    End Sub ' BersihTextBox

    ' menetapkan nilai-nilai TextBox menjadi nilai-nilai array String
    Public Sub SetNilaiTextBox(ByVal nilai As String())

        ' menentukan apakah array String memiliki panjang yang tepat
        If (nilai.Length <> JumlahTextBox) Then

            ' melempar eksepsi jika panjang tidak tepat
            Throw New ArgumentException("Terdapat " & _
             JumlahTextBox + 1 & " string di dalam array")

            ' menetapkan nilai-nilai array menjadi nilai-nilai TextBox
        Else
            txtAkun.Text = nilai(IndeksTextBox.AKUN)
            txtNamaPertama.Text = nilai(IndeksTextBox.PERTAMA)
            txtNamaAkhir.Text = nilai(IndeksTextBox.AKHIR)
            txtSaldo.Text = nilai(IndeksTextBox.SALDO)
        End If

    End Sub ' SetNilaiTextBox

    ' menghasilkan nilai-nilai TextBox sebagai array String
    Public Function GetNilaiTextBox() As String()

        Dim nilai(JumlahTextBox) As String

        ' menyalin bidang-bidang TextBox ke dalam array String
        nilai(IndeksTextBox.AKUN) = txtAkun.Text
        nilai(IndeksTextBox.PERTAMA) = txtNamaPertama.Text
        nilai(IndeksTextBox.AKHIR) = txtNamaAkhir.Text
        nilai(IndeksTextBox.SALDO) = txtSaldo.Text

        Return nilai
    End Function ' GetNilaiTextBox

End Class  ' FrmBankUI

Untuk menggunakan kembali FrmBankUI, Anda mengkompilasi GUI menjadi sebuah pustaka DLL dengan menciptakan projek bertipe Windows Control Library (DLL yang diciptakan dinamai dengan PustakaBank).


Gambar 14.5 Keluaran program pada kode 14.3


Kode 14.4 memuat kelas CRekaman yang akan dipakai oleh program pada kode 14.5, kode 14.6, dan kode 14.7 untuk membaca rekaman dari, dan menulis rekaman ke, sebuah file secara sekuensial. Kelas ini ditempatkan di dalam projek yang sama dengan kelas FrmBankUI.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
' Kode 14.4: CRekaman.vb
' Kelas Serializable yang merepresentasikan rekaman data.

<Serializable()> Public Class CRekaman

    Private mAkun As Integer
    Private mNamaPertama As String
    Private mNamaAkhir As String
    Private mSaldo As Double

    ' konstruktor default menetapkan nilai default
    Public Sub New()
        Me.New(0, "", "", 0.0)
    End Sub ' New

    ' konstruktor teroverload menetapkan anggota menjadi nilai parameter
    Public Sub New(ByVal nilaiAkun As Integer, _
        ByVal nilaiNamaPertama As String, _
        ByVal nilaiNamaAkhir As String, _
        ByVal nilaiSaldo As Double)

        Akun = nilaiAkun
        NamaPertama = nilaiNamaPertama
        NamaAkhir = nilaiNamaAkhir
        Saldo = nilaiSaldo
    End Sub ' New

    ' properti Akun
    Public Property Akun() As Integer

        Get
            Return mAkun
        End Get

        Set(ByVal nilaiAkun As Integer)
            mAkun = nilaiAkun
        End Set

    End Property ' Akun

    ' properti NamaPertama
    Public Property NamaPertama() As String

        Get
            Return mNamaPertama
        End Get

        Set(ByVal nilaiNamaPertama As String)
            mNamaPertama = nilaiNamaPertama
        End Set

    End Property ' NamaPertama

    ' properti NamaAkhir
    Public Property NamaAkhir() As String

        Get
            Return mNamaAkhir
        End Get

        Set(ByVal nilaiNamaAkhir As String)
            mNamaAkhir = nilaiNamaAkhir
        End Set

    End Property ' NamaAkhir

    ' properti Saldo
    Public Property Saldo() As Double

        Get
            Return mSaldo
        End Get

        Set(ByVal nilaiSaldo As Double)
            mSaldo = nilaiSaldo
        End Set

    End Property ' Saldo

End Class ' CRekaman

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
' Kode 14.5: BankUI.vb
' Windows form yang dapat didaur-ulang untuk contoh-contoh pada bab ini.

' beberapa namespace Visual Basic
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
Imports System.Windows.Forms

Public Class FrmBankUI
    Inherits Form

    ' label untuk TextBox
    Public WithEvents lblAkun As Label
    Public WithEvents lblNamaPertama As Label
    Public WithEvents lblNamaAkhir As Label
    Public WithEvents lblSaldo As Label

    ' beberapa kotak teks yang menerima masukan pengguna
    Public WithEvents txtAkun As TextBox
    Public WithEvents txtNamaPertama As TextBox
    Public WithEvents txtNamaAkhir As TextBox
    Public WithEvents txtSaldo As TextBox

    ' tombol GUI untuk menyimpan file, memasukkan data, dan keluar program
    Friend WithEvents cmdSimpan As Button
    Friend WithEvents cmdMasukkan As Button
    Friend WithEvents cmdKeluar As Button

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' jumlah TextBox pada Form
    Protected JumlahTextBox As Integer = 4

    ' konstanta-konstanta enumerasi menspesifikasi indeks TextBox
    Public Enum IndeksTextBox
        AKUN
        PERTAMA
        AKHIR
        SALDO
    End Enum

    ' serialisasi CRekaman dalam format biner
    Private formatter As BinaryFormatter = New BinaryFormatter()

    ' aliran pada data terserialkan ditulis ke file
    Private keluaran As FileStream

    ' membersihkan semua TextBox
    Public Sub BersihTextBox()
        Dim kontrolKu As Control ' komponen GUI sekarang
        Dim i As Integer

        ' iterasi melalui setiap Control pada form
        For i = 0 To Controls.Count - 1
            kontrolKu = Controls(i) ' mendapatkan Control

            ' menentukan apakah Control adalah TextBox
            If (TypeOf kontrolKu Is TextBox) Then

                ' membersihkan properti Text (ditetapkan menjadi String kosong)
                kontrolKu.Text = ""
            End If

        Next

    End Sub ' BersihTextBox

    ' menetapkan nilai-nilai TextBox menjadi nilai-nilai array String
    Public Sub SetNilaiTextBox(ByVal nilai As String())

        ' menentukan apakah array String memiliki panjang yang tepat
        If (nilai.Length <> JumlahTextBox) Then

            ' melempar eksepsi jika panjang tidak tepat
            Throw New ArgumentException("Terdapat " & _
             JumlahTextBox + 1 & " string di dalam array")

            ' menetapkan nilai-nilai array menjadi nilai-nilai TextBox
        Else
            txtAkun.Text = nilai(IndeksTextBox.AKUN)
            txtNamaPertama.Text = nilai(IndeksTextBox.PERTAMA)
            txtNamaAkhir.Text = nilai(IndeksTextBox.AKHIR)
            txtSaldo.Text = nilai(IndeksTextBox.SALDO)
        End If

    End Sub ' SetNilaiTextBox

    ' menghasilkan nilai-nilai TextBox sebagai array String
    Public Function GetNilaiTextBox() As String()

        Dim nilai(JumlahTextBox) As String

        ' menyalin bidang-bidang TextBox ke dalam array String
        nilai(IndeksTextBox.AKUN) = txtAkun.Text
        nilai(IndeksTextBox.PERTAMA) = txtNamaPertama.Text
        nilai(IndeksTextBox.AKHIR) = txtNamaAkhir.Text
        nilai(IndeksTextBox.SALDO) = txtSaldo.Text

        Return nilai
    End Function ' GetNilaiTextBox

    ' dipanggil ketika pengguna mengklik tombol Simpan
    Private Sub cmdSimpan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdSimpan.Click

        ' menciptakan kotak dialog agar pengguna bisa menyimpan file
        Dim pemilihFile As SaveFileDialog = New SaveFileDialog()
        Dim hasil As DialogResult = pemilihFile.ShowDialog()
        Dim namaFile As String ' name file untuk disimpan

        ' memampukan pengguna untuk menciptakan file
        pemilihFile.CheckFileExists = False

        ' event handler keluar jika pengguna mengklik "Cancel"
        If hasil = DialogResult.Cancel Then
            Return
        End If

        namaFile = pemilihFile.FileName ' mendapatkan nama file tertentu

        ' menampilkan error jika pengguna menspesifikasi file tak-valid
        If (namaFile = "" OrElse namaFile = Nothing) Then
            MessageBox.Show("Nama File Tak-Valid", "Error", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else

            ' menyimpan fil vie FileStream jika file valid
            Try

                ' membuka file dengan akses write
                keluaran = New FileStream(namaFile, _
                    FileMode.OpenOrCreate, FileAccess.Write)

                cmdSimpan.Enabled = False ' mendisable tombol Simpan
                cmdMasukkan.Enabled = True ' ,mengaktifkan tombol Masukkan Data

                ' memberitahu pengguna jika file tidak ada
            Catch fileException As FileNotFoundException
                MessageBox.Show("File Tidak Ada", "Error", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

        End If

    End Sub  ' cmdSimpan_Click

    ' dipanggil ketika pengguna mengklik tombol Masukkan Data
    Private Sub cmdMasukkan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdMasukkan.Click

        ' nilai nomor-akun dari TextBox
        Dim nomorAkun As Integer

        ' menyimpan nilai-nilai TextBox String array
        Dim nilai As String() = GetNilaiTextBox()

        ' CRekaman memuat nilai-nilai TextBox untuk serialisasi
        Dim rekaman As New CRekaman()

        ' menentukan apakah bidang akun TextBox kosong
        If nilai(IndeksTextBox.AKUN) <> "" Then

            ' menyimpan nilai-nilai TextBox di dalam CRekaman dan menserialkan CRekaman
            Try

                ' mendapatkan nilai nomor-akun dari TextBox
                nomorAkun = _
                Convert.ToInt32(nilai(IndeksTextBox.AKUN))

                ' menentukan apakah nomorAkun valid
                If nomorAkun > 0 Then

                    ' menyimpan bidang-bidang TextBox dalam CRekaman
                    rekaman.Akun = nomorAkun
                    rekaman.NamaPertama = nilai(IndeksTextBox.PERTAMA)
                    rekaman.NamaAkhir = nilai(IndeksTextBox.AKHIR)
                    rekaman.Saldo = Convert.ToDouble( _
                        nilai(IndeksTextBox.SALDO))

                    ' menulis CRekaman ke FileStream
                    formatter.Serialize(keluaran, rekaman)

                    ' memberitahu pengguna jika nomor akun tak-valid
                Else
                    MessageBox.Show("Nomor Akun Tak-Valid", _
                    "Error", MessageBoxButtons.OK, _
                    MessageBoxIcon.Error)
                End If

                ' memberitahu pengguna jika error terjadi dalam serialisasi
            Catch serializableException As SerializationException
                MessageBox.Show("Error Penulisan ke File", "Error", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)

                ' memberitahu pengguna jika error terjadi, kaitannya dengan format parameter
            Catch formattingException As FormatException
                MessageBox.Show("Format Tak-Valid", "Error", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

        End If

        BersihTextBox() ' membersihkan nilai-nilai TextBox

    End Sub  ' cmdMasukkan_Click

    ' dipanggil ketika pengguna menekan tombol Keluar
    Private Sub cmdKeluar_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdKeluar.Click

        ' menentukan apakah file eksis
        If (keluaran Is Nothing) = False Then

            ' menutup file
            Try
                keluaran.Close()

                ' memberitahu pengguna akan error penutupan file
            Catch fileException As IOException
                MessageBox.Show("Tidak dapat menutup file", "Error", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

        End If

        Application.Exit()
    End Sub  ' cmdKeluar_Click

End Class  ' FrmBankUI


Gambar 14.6 Keluaran program pada kode 14.5  (bagian 1)
  


Gambar 14.6 Keluaran program pada kode 14.5  (bagian 2)


Ketika pengguna mengklik tombol Simpan, program memanggil metode cmdSimpan_Click (baris 103-147). Baris 108 mengistansiasi sebuah objek dari kelas SaveFileDialog, yang berada dalam namespace System.Windows.Forms. Objek dari kelas ini dipakai untuk memilih file. Baris 109 memanggil metode ShowDialog dari objek SaveFileDialog untuk menampilkan SaveFile-Dialog. Ketika ditampilkan, SaveFileDialog mencegah pengguna dari interaksi dengan jendela lain pada program sampai pengguna menutup SaveFileDialog dengan mengklik Save atau Cancel. Dialog yang berperilaku semacam ini dikenal dengan dialog modal. Pengguna menyeleksi drive, direktori, dan nama file dan kemudian mengklik Save. Metode SaveDialog menghasilkan sebuah integer yang menspesifikasi tombol mana (Save atau Cancel) yang diklik pengguna untuk menutup dialog. Pada contoh ini, properti DialogResult menerima integer tersebut. Baris 116 menguji apakah pengguna mengklik Cancel dengan membandingkan nilai yang dijadikan nilai balik oleh properti DialogResult kepada Const DialogResult.Cancel. Jika nilainya sama, maka metode cmdSimpan_Click selesai dieksekusi (baris 117). Jika nilainya tidak sama (pengguna mengklik Save, bukan Cancel), maka 120 menggunakan properti FileName dari kelas SaveFileDialog untuk mendapatkan file yang dipilih pengguna.

Seperti disebutkan sebelumnya pada bab ini, Anda dapat membuka file untuk melakukan pemanipulasian teks dengan menciptakan objek dari kelas FileStream. Pada contoh ini, diinginkan bahwa file dibuka untuk ditampilkan, jadi baris 132-133 menginstansiasi sebuah objek FileStream. Konstruktor FileStream yang dipakai menerima tiga argumen, yaitu sebuah String yang memuat nama file yang akan dibuka, sebuah Const yang mendeskripsikan bagaimana membuka file, dan sebuah Const yang mendeskripsikan ijin file. Baris 133 melewatkan ConstFileMode.OpenOr-Create kepada konstruktor FileStream sebagai argumen kedua. Konstanta ini mengindikasikan bahwa objek FileStream harus membuka file, jika file ada, atau menciptakan file jika file tidak ada. Visual Basic menawarkan beberapa konstanta FileMode lain yang mendeskripsikan bagaimana membuka file. Baris 133 melewatkan ConsFileAccess.Write kepada konstruktor FileStream sebagai argumen ketiga. Konstanta ini memastikan bahwa program dapat melakukan operasi write-only pada objek FileStream. Visual Basic menyediakan dua konstanta lain untuk parameter ini, yaitu FileAccess.Read untuk akses read-only dan FileAccess.ReadWrite untuk akses read/write.

Setelah pengguna mengetikkan informasi pada tiap TextBox, pengguna mengklik tombol Masukkan, yang memanggil metode cmdMasukkan_Click (baris 149-208) untuk menyimpan data TextBox pada file yang ditentukan pengguna. Jika pengguna memasukkan nomor akun yang valid (sebuah integer lebih besar dari 0), maka baris 176-180 akan menyimpan nilai-nilai TextBox ke dalam sebuah objek bertipe CRekaman. Jika pengguna memasukkan data yang tak-valid pada salah satu TextBox (seperti memasukkan sebuah String pada bidang Saldo), maka program akan melemparkan sebuah FormatException. Statemen Catch pada baris 198 akan menangani eksepsi semacam itu dengan memberitahu pengguna (melalui sebuah MessageBox) bahwa format tidak tepat. Jika pengguna memasukkan data yang valid, baris 183 akan menuliskan rekaman ke dalam file dengan memanggil metode Serialize dari objek BinaryFormatter. Kelas BinaryFormatter menggunakan metode Serialize dan Deserialize untuk menulis dan membaca objek ke dalam aliran. Metode Serialize menuliskan representasi objek ke dalam sebuah file. Metode Deserialize membaca representasi tersebut dari sebuah file dan merekonstruksi objek asli. Kedua metode akan melemparkan SerializationException jika sebuah error terjadi selama serialisasi atau deserialisasi. Kedua metode Serialize dan Deserialize memerlukan sebuah objek Stream (misalnya, FileStream) sebagai parameter sehingga BinaryFormatter dapat mengakses file yang tepat; BinaryFormatter harus meneriman sebuah instans dari kelas yang diderivasi dari kelas Stream, karena Stream adalah MustInherit. Kelas BinaryFormatter berada di dalam namespace System.Runtime.Serialization.Formatters.Binary.


Membaca Data dari File Akses-Sekuensial
Data disimpan di dalam file sehingga dapat dibaca atau diproses ketika dibutuhkan. Pada bagian sebelumnya, telah didemonstrasikan bagaimana menciptakan sebuah file untuk akses sekuensial. Pada bagian ini, akan didiskusikan bagaiman membaca (atau mengambil) data secara sekuensial dari sebuah file.

Kelas FrmBacaFileAksesSekuensial (kode 14.6) membaca rekaman dari file yang diciptakan oleh program pada kode 14.5 dan kemudian menampilkan isi setiap rekaman. Sebagian besar kode pada contoh ini sama dengan kode 14.5, sehingga yang akan didiskusikan hanya beberapa aspek unik pada aplikasi.

Ketika pengguna mengklik tombol Buka File, program akan memanggil cmdBuka_Click (baris 102-134). Baris 109 menginstansiasi sebuah objek dari kelas OpenFileDialog, dan baris 110 memanggil metode ShowDialog untuk menampilkan dialog Open. Jika pengguna memasukkan sebuah nama file yang valid, maka baris 128-129 akan menciptakan sebuah objek FileStream dan menugaskannya kepada referensi masukan. Kemudian, ConstFileMode.Open akan dilewatkan sebagai argumen kedua kepada konstruktor FileStream. Konstanta ini mengindikasikan bahwa FileStream harus membuka file jika file tersebut ada dan melemparkan sebuah FileNotFoundException jika file tidak ada. (Pada contoh ini, konstruktor FileStream tidak akan melempat sebuah FileNotFoundException, karena OpenFileDialog meminta pengguna untuk memasukkan file yang sudah ada). Pada contoh sebelumnya (kode 14.5), teks dituliskan ke dalam file menggunakan sebuah objek FileStream dengan akses write-only. Pada kode 14.6, dispesifikasi akses read-only pada file dengan melewatkan ConstFileAccess.Read sebagai argumen ketiga kepada konstruktor FileStream.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
' Kode 14.6: BacaFileAksesSekuensial.vb
' Windows form yang dapat didaur-ulang untuk contoh-contoh pada bab ini.

' beberapa namespace Visual Basic
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
Imports System.Windows.Forms

Public Class FrmBacaFileAksesSekuensial
    Inherits Form

    ' label untuk TextBox
    Public WithEvents lblAkun As Label
    Public WithEvents lblNamaPertama As Label
    Public WithEvents lblNamaAkhir As Label
    Public WithEvents lblSaldo As Label

    ' beberapa kotak teks yang menerima masukan pengguna
    Public WithEvents txtAkun As TextBox
    Public WithEvents txtNamaPertama As TextBox
    Public WithEvents txtNamaAkhir As TextBox
    Public WithEvents txtSaldo As TextBox

    ' tombol GUI untuk membuka file dan membaca rekaman
    Friend WithEvents cmdBuka As Button
    Friend WithEvents cmdBerikutnya As Button

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' jumlah TextBox pada Form
    Protected JumlahTextBox As Integer = 4

    ' konstanta-konstanta enumerasi menspesifikasi indeks TextBox
    Public Enum IndeksTextBox
        AKUN
        PERTAMA
        AKHIR
        SALDO
    End Enum

    ' aliran yang dibaca dari file
    Private masukan As FileStream

    ' deserialisasi CRekaman dalam format biner
    Private reader As BinaryFormatter = New BinaryFormatter()

    ' membersihkan semua TextBox
    Public Sub BersihTextBox()
        Dim kontrolKu As Control ' komponen GUI sekarang
        Dim i As Integer

        ' iterasi melalui setiap Control pada form
        For i = 0 To Controls.Count - 1
            kontrolKu = Controls(i) ' mendapatkan Control

            ' menentukan apakah Control adalah TextBox
            If (TypeOf kontrolKu Is TextBox) Then

                ' membersihkan properti Text (ditetapkan menjadi String kosong)
                kontrolKu.Text = ""
            End If

        Next

    End Sub ' BersihTextBox

    ' menetapkan nilai-nilai TextBox menjadi nilai-nilai array String
    Public Sub SetNilaiTextBox(ByVal nilai As String())

        ' menentukan apakah array String memiliki panjang yang tepat
        If (nilai.Length <> JumlahTextBox) Then

            ' melempar eksepsi jika panjang tidak tepat
            Throw New ArgumentException("Terdapat " & _
             JumlahTextBox + 1 & " string di dalam array")

            ' menetapkan nilai-nilai array menjadi nilai-nilai TextBox
        Else
            txtAkun.Text = nilai(IndeksTextBox.AKUN)
            txtNamaPertama.Text = nilai(IndeksTextBox.PERTAMA)
            txtNamaAkhir.Text = nilai(IndeksTextBox.AKHIR)
            txtSaldo.Text = nilai(IndeksTextBox.SALDO)
        End If

    End Sub ' SetNilaiTextBox

    ' menghasilkan nilai-nilai TextBox sebagai array String
    Public Function GetNilaiTextBox() As String()

        Dim nilai(JumlahTextBox) As String

        ' menyalin bidang-bidang TextBox ke dalam array String
        nilai(IndeksTextBox.AKUN) = txtAkun.Text
        nilai(IndeksTextBox.PERTAMA) = txtNamaPertama.Text
        nilai(IndeksTextBox.AKHIR) = txtNamaAkhir.Text
        nilai(IndeksTextBox.SALDO) = txtSaldo.Text

        Return nilai
    End Function ' GetNilaiTextBox

    ' dipanggil ketika pengguna mengklik tombol Buka
    Private Sub cmdBuka_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdBuka.Click

        cmdBerikutnya.Enabled = False ' menon-aktifkan tombol Rekaman Berikutnya

        ' menciptakan kotak dialog untuk membuka file
        Dim pemilihFile As OpenFileDialog = New OpenFileDialog()
        Dim hasil As DialogResult = pemilihFile.ShowDialog()
        Dim namaFile As String ' nama file yang memuat data

        ' event handler keluar jika pengguna mengklik Cancel
        If hasil = DialogResult.Cancel Then
            Return
        End If

        namaFile = pemilihFile.FileName ' mendapatkan nama file
        BersihTextBox()

        ' menampilkan error jika pengguna memasukkan file tak-valid
        If (namaFile = "" OrElse namaFile = Nothing) Then
            MessageBox.Show("Nama File Tak-Valid", "Error", _
             MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else ' membuka file jika mengguna memberika file yang valid

            ' menciptakan FileStream untuk mendapatkan akses baca terhadap file
            masukan = New FileStream(namaFile, FileMode.Open, _
                FileAccess.Read)

            cmdBerikutnya.Enabled = True ' mengaktifkan tombol Rekaman Berikutnya

        End If
    End Sub  ' cmdBuka_Click

    ' dipanggil ketika pengguna mengklik tombol Rekaman Berikutnya
    Private Sub cmdBerikutnya_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdBerikutnya.Click

        ' deserialisasi CRekaman dan menyimpan data dalam TextBox
        Try

            ' mendapatkan CRekaman berikutnya di dalam file
            Dim rekaman As CRekaman = CType(reader.Deserialize(masukan), CRekaman)

            ' menyimpan nilai-nilai CRekaman di dalam array String sementara
            Dim nilai As String() = New String() { _
                rekaman.Akun.ToString(), _
                rekaman.NamaPertama.ToString(), _
                rekaman.NamaAkhir.ToString(), _
                rekaman.Saldo.ToString()}

            ' menyalin nilai-nilai array String ke TextBox
            SetNilaiTextBox(nilai)

            ' menangani eksepsi ketika tidak ada CRekaman di dalam file
            Catch serializableException As SerializationException

            masukan.Close() ' menutup FileStream jika tidak ada CRekaman dalam file

            cmdBuka.Enabled = True ' mengaktifkan tombol Buka File
            cmdBerikutnya.Enabled = False ' menon-aktifkan tombol Rekaman Berikutnya

            BersihTextBox()

            ' memberitahu pengguna jika tidak ada CRekaman di dalam file file
            MessageBox.Show("Tidak ada rekaman lagi di dalam file", "", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try

    End Sub  ' cmdBerikutnya_Click

End Class  ' FrmBacaFileAksesSekuensial


Gambar 14.7 Keluaran program pada kode 14.6 


Sekarang akan disajikan kelas FrmSeputarKredit (kode 14.7) yang memampukan seorang manajer kredit untuk menampilkan informasi akun dari semua konsumen dengan saldo kredit, saldo nol, dan saldo debit. Perhatikan bahwa sebuah RichTextBox akan menampilkan informasi akun. RichTextBox menyediakan fungsionalitas yang lebih daripada TextBox biasa. Misalnya, RichTextBox menawarkan metode Find untuk melakukan pencarian terhadap String secara individual dan metode LoadFile untuk menampilkan isi file. Kelas RichTextBox tidak mewarisi kelas TextBox; tetapi, keduanya mewarisi secara langsung kelas System.Windows.Forms.Text-BoxBase. Pada contoh ini, digunakan sebuah RichTextBox, karena, secara default, RichTextBox menampilkan beberapa baris teks, sedangkan TextBox biasa hanya menampilkan satu baris.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
' Kode 14.7: SeputarKredit.vb
' Membaca file secara sekuensial dan menampilkan isinya
' berdasarkan tipe akun yang dimasukkan pengguna.

' beberapa namespace Visual Basic
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
Imports System.Windows.Forms

Public Class FrmSeputarKredit
    Inherits Form

    ' menampilkan beberapa baris keluaran
    Friend WithEvents txtTampil As RichTextBox

    ' tombol untuk membuka file, membaca rekaman, dan keluar program
    Friend WithEvents cmdBuka As Button
    Friend WithEvents cmdKredit As Button
    Friend WithEvents cmdDebit As Button
    Friend WithEvents cmdNol As Button
    Friend WithEvents cmdSelesai As Button

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' aliran untuk pembacaan file
    Private masukan As FileStream

    ' objek untuk deserialisasi CRekaman dalam format biner
    Dim reader As BinaryFormatter = New BinaryFormatter()

    ' namle yang menyimpan saldo kredit, debit, dan nol
    Private namaFile As String

    ' dipanggil ketika pengguna mengklik tombol Buka File
    Private Sub cmdBuka_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdBuka.Click

        ' menciptakan kotak dialog untuk membuka file
        Dim pemilihFile As OpenFileDialog = New OpenFileDialog()
        Dim hasil As DialogResult = pemilihFile.ShowDialog()

        ' event handler keluar jika pengguna mengklik Cancel
        If hasil = DialogResult.Cancel Then
            Return
        End If

        namaFile = pemilihFile.FileName ' mendapatkan nama file dari pengguna

        ' mengaktifkan tombol
        cmdKredit.Enabled = True
        cmdDebit.Enabled = True
        cmdNol.Enabled = True

        ' menampilkan error jika pengguna memasukkan file tak-valid
        If (namaFile = "" OrElse namaFile = Nothing) Then
            MessageBox.Show("Nama File Tak-Valid", "Error", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)

            ' mengaktifkan semua tombol GUI, kecuali tombol Buka File
        Else
            cmdBuka.Enabled = False
            cmdKredit.Enabled = True
            cmdDebit.Enabled = True
            cmdNol.Enabled = True
        End If

    End Sub  ' cmdBuka_Click

    ' dipanggil ketika pengguna mengklik tombol Saldo Kredit, Saldo Debit
    ' atau tombol Saldo Nol
    Protected Sub cmdGet_Click(ByVal senderObject As Object, _
        ByVal e As System.EventArgs) Handles cmdKredit.Click, _
        cmdNol.Click, cmdDebit.Click

        ' mengkonversi senderObject secara eksplisit menjadi objek bertipe Button
        Dim senderButton As Button = CType(senderObject, Button)

        ' mendapatkan teks dari tombol yang diklik, menyimpan tipe akun
        Dim tipeAkun As String = senderButton.Text

        ' digunakan untuk menyimpan tiap rekaman dibaca dari file
        Dim rekaman As CRekaman

        ' membaca dan menampilkan semua informasi file
        Try

            ' menutup file dari operasi sebelumnya
            If (masukan Is Nothing) = False Then
                masukan.Close()
            End If

            ' menciptakan FileStream untuk mendapatkan akses read pada file
            masukan = New FileStream(namaFile, FileMode.Open, _
                FileAccess.Read)

            txtTampil.Text = "Akun-akun adalah:" & vbCrLf

            ' membaca file sampai end of file
            While True

                ' mendapatkan CRekaman berikutnya yang tersedia di dalam file
                rekaman = CType(reader.Deserialize(masukan), CRekaman)

                ' menyimpan bidang saldo
                Dim saldo As Double = rekaman.Saldo

                ' menentukan apakan harus menampilkan saldo
                If HarusTampil(saldo, tipeAkun) = True Then

                    ' menampilkan rekaman
                    Dim keluaran As String = rekaman.Akun & vbTab & _
                    rekaman.NamaPertama & vbTab & rekaman.NamaAkhir & _
                    Space(6) & vbTab

                    ' menampilkan saldo dengan format moneter yang tepat
                    keluaran &= _
                    String.Format("{0:F}", saldo) & vbCrLf

                    txtTampil.Text &= keluaran ' menyalin keluaran pada monitor
                End If

            End While

            ' menangani eksepsi ketika file tidak bisa ditutup
        Catch fileException As IOException
            MessageBox.Show("Tidak Dapat Menutup File", "Error", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)

            ' menangani eksepsi ketika tidak ada lagi rekaman
        Catch serializableException As SerializationException
            masukan.Close() ' menutup FileStream jika tidak ada lagi CRekaman

        End Try

    End Sub ' cmdGet_Click

    ' menentukan apakah harus menampilkan rekaman
    Private Function HarusTampil(ByVal saldo As Double, _
        ByVal tipeAkun As String) As Boolean

        If saldo > 0 Then

            ' menampilkan Saldo Kredit
            If tipeAkun = "Saldo Kredit" Then
                Return True
            End If

        ElseIf saldo < 0 Then

            ' menampilkan Saldo Debit
            If tipeAkun = "Saldo Debit" Then
                Return True
            End If

        Else ' saldo = 0

            ' menampilkan Saldo Nol
            If tipeAkun = "Saldo Nol" Then
                Return True
            End If

        End If

        Return False
    End Function ' HarusTampil

    ' dipanggil ketika pengguna mengklik tombol Selesai
    Private Sub cmdSelesai_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdSelesai.Click

        ' menentukan apakah file ada
        If masukan Is Nothing = False Then

            ' menutup file
            Try
                masukan.Close()

                ' memberitahu pengguna tentang error penutupan file
            Catch fileException As IOException
                MessageBox.Show("Tidak Bisa Menutup File", "Error", _
                    MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

        End If

        Application.Exit()
    End Sub  ' cmdSelesai_Click

End Class  ' FrmSeputarKredit


Gambar 14.8 Keluaran program pada kode 14.7


Latihan
1.       Ciptakanlah sebuah program yang menyimpan beberapa nilai mahasiswa dalam sebuah file teks. File harus memuat nama, NIM, matakuliah, dan nilai. Program dapat membuka file dan menampilkan isinya dalam sebuah kotak teks read-only. Entri harus ditampilkan sebagai berikut:


NamaAkhir, NamaPertama: NIM#  MataKuliah   Nilai

No comments:

Post a Comment