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