BAB 3 PERANCANGAN PROGRAM APLIKASI 3.1. Gambaran Umum Perancangan Program aplikasi yang dirancang ini akan menggunakan database sebagai sumber data yang dibutuhkan. Database tersebut akan berisi data pintu tol yang ada, data user yang terdaftar, dan data transaksi yang terjadi. Sedangkan untuk program aplikasinya siri akan terbagi menjadi dua, yaitu server dan client. Aplikasi Server akan bertugas untuk me-routing data yang diterima untuk dicatat ke dalam database ataupun mengecek data user. Aplikasi ini hanya akan mempunyai dua tombol utama yaitu untuk mengaktifkan dan menon-aktifkan kondisi server. Aplikasi Client bertugas untuk mengambil data dari user, mengolahnya dan kemudian mengirimkan data tersebut ke aplikasi Server. Aplikasi ini harus dikenali dahulu oleh server untuk dapat menjalankan fungsinya. Untuk itu disediakan dua tombol, yaitu untuk menjalin koneksi ke server dan memutuskan koneksi tersebut. Selain itu terdapat pula satu tombol lain yang berguna untuk mengolah data user dan mengirimkan data tersebut ke server. 29
30 3.2. Perancangan 3.2.1. Perancangan Database Perancangan database pada skripsi ini menggunakan Microsoft Access 2000 yang bernama dbtol. Pada database ini akan terdapat tabel sebagai berikut: a. Tabel Biaya Fungsi : sebagai acuan nilai yang harus dibayarkan pada pintu tol yang bersangkutan. Primary key : Pintu_Tol, Key_Gol. Tabel 3.1. Tabel Biaya Nama field Tipe data Size Keterangan Pintu_Tol Text 50 Nama pintu tol Key_Gol Number Integer Tipe golongan karaan Biaya Number Integer Biaya pada pintu tol b. Tabel Golongan Fungsi Primary key : sebagai acuan tipe golongan karaan. : Key_Gol. Tabel 3.2. Tabel Golongan Nama field Tipe data Size Keterangan Key_Gol Number Integer Tipe golongan karaan Gol_Karaan Text 5 Tipe golongan karaan aktual c. Tabel Loket Fungsi : sebagai acuan nama pintu tol dan jumlah loket yang tersedia di setiap lokasi. Primary key : Pintu_Tol.
31 Tabel 3.3. Tabel Loket Nama field Tipe data Size Keterangan Pintu_Tol Text 50 Nama pintu tol Max_Loket Number Integer Jumlah loket yang tersedia d. Tabel Total Transaksi Fungsi Primary key : untuk mencatat total tansaksi setiap user. : ID_User. Tabel 3.4. Tabel Total Transaksi Nama field Tipe data Size Keterangan ID_User Text 15 Nomor ID user Total_Biaya Number Double Total biaya transaksi user e. Tabel Total Transaksi per Bulan Fungsi Primary key : untuk mencatat total tansaksi per user setiap bulannya. : ID_User. Tabel 3.5. Tabel Total Transaksi per Bulan Nama field Tipe data Size Keterangan ID_User Text 15 Nomor ID user Bulan_Transaksi Text 10 Bulan transaksi Total_Biaya Number Double Total biaya per bulan f. Tabel Transaksi Fungsi untuk mencatat transaksi-transaksi yang terjadi. Primary key : ID_User,Tanggal,Waktu,Pintu_Tol,Loket.
32 Tabel 3.6. Tabel Transaksi Nama field Tipe data Size Keterangan ID_User Text 15 Nomor ID user Tanggal Date/time Short date Tanggal transaksi Waktu Date/time Long time Waktu transaksi Pintu_Tol Text 50 Tempat transaksi Loket Number Integer Loket transaksi g. Tabel User Fungsi Primary key : sebagai acuan data user-user yang telah terdaftar. : ID_User Tabel 3.7. Tabel user Nama field Tipe data Size Keterangan ID_User Text 15 Nomor ID user Nama Text 50 Nama user Alamat Text 20 Alamat user Kota Text 20 Kota user Key_Gol Number Integer Tipe golongan karaan user Gambar 3.1. Entity Relation Diagram Database Tol
33 3.2.2. Perancangan Layar 3.2.2.1. Perancangan Layar Server Aplikasi server memiliki dua tombol dan dua menu. Dua tombol itu adalah tombol [Activate] untuk mengaktifkan server dan untuk [Deactivate] menonaktifkan server. Sedangkan kedua menu tersebut adalah menu [Exit] untuk keluar dari program, dan menu [About] yang menunjukkan sekilas informasi mengenai program. Pada aplikasi ini terdapat pula suatu listbox yang berisi client-client mana saja yang telah aktif. Aplikasi server ini terhubung langsung pada database sehingga setiap data yang dikirimkan oleh client dapat langsung diolah oleh aplikasi ini dan sekaligus berdampak pada isi database yang bersangkutan. Contohnya untuk database transaksi dan sejenisnya. Gambar 3.2. Rancangan layar aplikasi Server
34 3.2.2.2. Perancangan Layar Client Pada aplikasi ini pertama-tama client (petugas tol) diminta untuk memasukkan data nama pintu tol dan loket ke berapa dari pintu tol tersebut yang hak diaktifkan. Selain itu client (petugas tol) juga harus memasukkan alamat (tcp/ip) dari server host yang dituju, yang dalam skripsi ini alamat yang digunakan ialah localhost dan mengirimkannya ke server dengan menekan tombol [Connect]. Pada penggunaannya, setelah client ini diaktifkan maka setiap pelanggan jalan tol yang ingin menggunakan fasilitas ini tinggal memasukkan kode kartu, maka transaksi akan diproses secara langsung oleh client dan data hasil proses tersebut akan dikirimkan ke server. Setiap kode yang dimasukkan akan diurai (didekripsi) menjadi data yang dapat digunakan oleh server, dan kemudian dikirimkan kepada server untuk diolah dan dicatat kedalam database. Setelah penggunaan aplikasi client ini selesai untuk memutuskan koneksi disediakan tombol [Disconnect]. Selain itu terdapat pula menu [Exit] dan [About] yang berfungsi sama seperti yang terdapat pada aplikasi server.
35 Gambar 3.3. Rancangan layar aplikasi Client 3.2.2.3. Perancangan layar form About Form ini dapat diakses dari klik-menu About yang tersedia pada aplikasi server dan client. Form about ini berfungsi untuk memberikan sekilas informasi mengenai program. Untuk menutup form about ini cukup dengan menekan tombol [OK] di bagian bawah form.
36 About Keterangan Ok Gambar 3.4. Rancangan layar Form About 3.3. State Transition Diagram 3.3.1. State Transition Diagram Server Modul formutama_server Klik Activate Panggil modul aktifasi_server Modul Activate Klik Deactivate Panggil modul de-aktifasi_server Klik Activate Panggil modul aktifasi_server Modul de-activate Klik menu Panggil modul menu_click Modul menu_click Gambar 3.5. State transition Diagram aplikasi Server
37 3.3.2. State Transition Diagram Client Modul formutama_client Klik Connect Panggil modul connect Modul Connect Modul dis-connect Klik S Panggil modul dekrip-kirim_pesan Modul S Klik Disconnect Panggil modul disconnect Modul menu_click Klik menu Panggil modul menu_click Gambar 3.6. State transition Diagram aplikasi Client 3.3.3. State Transition Diagram Modul menu_click Modul menu_click Modul Exit Modul About Akhir Program Klik Exit Keluar dari program Klik About Tampil Form About Klik Ok / Tutup Form About Tampil Layar Aktif Form About Layar Aktif Gambar 3.7. State transition Diagram modul menu_click
38 3.4. Pseudocode 3.4.1. Pseudocode Aplikasi Server Modul formutama_server Fungsi: inisialisasi kondisi awal server procedure TForm1.FormCreate Button_aktifkan_server.Enabled := True Button_nonaktifkan_server.Enabled := False Modul aktivasi_server Fungsi: mengaktifkan server dan menginisialisasi variabel-variabel terkait procedure TForm1.Button_activeClick var i : integer for i := 0 to 99 do nick[i] := '' cetaknick set socket port set server aktif true inisialisasi jumlah koneksi awal = 0 tampilkan jumlah koneksi aktif inisialisasi jumlah user awal = 0 button_active.enabled := False button_deactive.enabled := True
39 Modul de-aktifasi _server Fungsi: menon-aktifkan server procedure TForm1.Button_deactiveClick set server aktif false kosongkan isi data client edit1.text:= '' list_active_client.items.clear label_active_client.caption:='0' button_active.enabled := False button_deactive.enabled := True Modul client_error Fungsi: mengirimkan pesan kesalahan client procedure TForm1.ServerSocket1ClientError ErrorCode := 0 Modul koneksi_client
40 Fungsi: untuk menampilkan jumlah koneksi yang aktif bila ada tambahan koneksi procedure TForm1.ServerSocket1ClientConnect Inc(n_koneksi) tampilkan jumlah koneksi yang aktif Modul dis-koneksi_client Fungsi: untuk menampilkan jumlah koneksi yang aktif bila ada permintaan diskoneksi dari client procedure TForm1.ServerSocket1ClientDisconnect Dec(n_koneksi) tampilkan jumlah koneksi aktif Modul cetak_nick Fungsi: menampilkan nama-nama client yang aktif procedure TForm1.CetakNick() var i: integer list_active_client.clear for i := 0 to max_user - 1 do
41 cetak nick di listbox Modul terima_pesan_client Fungsi: untuk menerima pesan dari client, permintaan koneksi, diskoneksi ataupun pengiriman data procedure TForm1.ServerSocket1ClientRead terima pesan dari client id := pos('ô',pesan); temp_nk := -1; case strtoint(copy(pesan,1,id-1)) of //client meminta koneksi 1: ambil nama pintu tol dari pesan ambil nomor loket dari pesan cek apakah nick sudah ada atau belum jika sudah ada maka beri pesan ke client bahwa nick tersebut sudah aktif jika belum dipakai maka cek ke data base apakah pintu tol tersebut ada jika ada maka cek jumlah pintu tol maksimal
42 bila belum maksimal, aktifkan koneksi dari client tersebut tambahkan jumlah max_user cetaknick; bila sudah maksimal tolak client else tolak client // client memutuskan koneksi 2: ambil nama pintu tol cari posisi nama pintu tol pada listbox hapus nama pada posisi itu Dec(max_user) CetakNick End //pengiriman data dari client 3: ambil nama pintu tol ambil nomor loket pisahkan pesan menjadi data user cek apakah nomor user ada dalam database if ada then
43 if (Nama = nama_user) and (gol = Key_Gol) then balas := 1; with tbtransaksi do tambahkan transaksi ke dalam database else balas := 2; else balas := 0; if balas = 0 then kirim pesan ke client ( Data tidak terdapat dalam database') if balas = 1 then kirim pesan ke client ( Transaksi Berhasil') if balas = 2 then kirim pesan ke client ( Data tidak sesuai dengan data dalam database') Modul exit_server Fungsi: untuk keluar dari program server procedure TForm1.Exit2Click set server aktif false Application.Terminate
44 3.4.2. Pseudocode Aplikasi Client Modul subbyte Fungsi: mengambil nilai result dari s_box function TForm1.ByteSub(nilai : integer) : integer result := s_box[nilai] Modul subbyte_invers Fungsi: mengambil nilai result dari s_box function TForm1.ByteSubInv(nilai : integer) : integer result := s_box_inv[nilai] Modul kali Fungsi: digunakan untuk perkalian pada tahap mixcolums function TForm1.Kali(nilai1, nilai2 : integer) : integer var i,j : integer temp1, temp2 : array [0..7] of integer temp : array [0..15] of integer for i := 0 to 7 do
45 temp1[i] := 0 temp2[i] := 0 //rubah nilai1 ke bentuk biner simpan ke temp1 i := 0 repeat temp1[i] := nilai1 mod 2 nilai1 := nilai1 div 2 Inc(i) until nilai1 = 0 //rubah nilai2 ke dalam bentuk biner simpan ke temp2 i := 0 repeat temp2[i] := nilai2 mod 2 nilai2 := nilai2 div 2 Inc(i) until nilai2 = 0 for i := 0 to 15 do temp[i] := 0 //kalikan temp1 dan temp2 simpan di temp for i := 0 to 7 do if temp1[i] = 1 then for j := 0 to 7 do
46 if temp2[j] = 1 then temp[i+j] := (temp[i+j] + 1) mod 2 //cari nilai desimal temp dan simpan ke result Result := 0 for i := 0 to 15 do Result := Result + temp[i] * Round(Power(2,i)) if Result > $FF then Result := Modulo(Result) Modul modulo Fungsi: mencari nilai modulo setelah di xor dengan 100011011 function TForm1.Modulo(nilai : integer) : integer var i : integer temp : array [0..15] of integer
47 for i := 0 to 15 do temp[i] := 0 i := 0 //rubah nilai ke biner simpan ke temp repeat temp[i] := nilai mod 2 nilai := nilai div 2 Inc(i) until nilai = 0 //nilai temp di modulo dengan 100011011 for i := 15 downto 8 do if temp[i] = 1 then // di xor 100011011 temp[i] := 0; //temp[i] xor 1 temp[i-4] := temp[i-4] xor 1 temp[i-5] := temp[i-5] xor 1 temp[i-7] := temp[i-7] xor 1 temp[i-8] := temp[i-8] xor 1 //kembalikan temp ke dalam bentuk desimal Result := 0 for i := 0 to 7 do
48 Result := Result + temp[i] * Round(Power(2,i)) Modul KeySchedule Fungsi: mencari nilai keyschedule untuk digunakan pada tahap addroundkey procedure TForm1.KeySchedule() var i,j,k,temp : integer //masukkan nilai awal chiper_key dari chip_key for i := 0 to 3 do for j := 0 to 3 do chiper_key[0,i,j] := chip_key[i,j] //masukkan nilai-nilai awal chipher_key pada tiap kolom pertama for i := 1 to 10 do for j := 0 to 3 do chiper_key[i,j,0] := chiper_key[i-1,j,3] //tentukan nilai rotword nya temp := chiper_key[i,0,0]
49 chiper_key[i,0,0] := chiper_key[i,1,0] chiper_key[i,1,0] := chiper_key[i,2,0] chiper_key[i,2,0] := chiper_key[i,3,0] chiper_key[i,3,0] := temp //bytesub for j := 0 to 3 do chiper_key[i,j,0] := ByteSub(chiper_key[i,j,0]) //kali [0*key*Rcon] for j := 0 to 3 do if j <> 0 then chiper_key[i,j,0] := chiper_key[i,j,0] xor chiper_key[i-1,j,0] else temp := Round( Power(2, i-1) ) if temp > $FF then temp := Modulo(temp) chiper_key[i,j,0] := chiper_key[i,j,0] xor chiper_key[i-1,j,0] xor temp for j := 1 to 3 do for k := 0 to 3 do
50 chiper_key[i,k,j] := chiper_key[i,k,j-1] xor chiper_key[i-1,k,j] Modul connect Fungsi: untuk mengaktifkan koneksi dengan server procedure TForm1.Button1Click(Ser: TObject) if (length(edit1.text)=0) then messagedlg('pintu Tol Kosong',mtWarning,[mbOK],0) edit1.setfocus else if (length(edit2.text)=0) then messagedlg('no Loket Kosong',mtWarning,[mbOK],0) edit2.setfocus else if (length(edit3.text)=0) then
51 messagedlg('server Host Kosong',mtWarning,[mbOK],0) edit3.setfocus else ClientSocket1.Port :=8080 ClientSocket1.Host := Edit3.Text ClientSocket1.Active := True Modul koneksi_aktif Fungsi: mengeset kondisi-kondisi form pada saat telah terjadi koneksi procedure TForm1.ClientSocket1Connect Edit1.Enabled := False Edit2.Enabled := False Edit3.Enabled := False Button1.Enabled := False Button2.Enabled := True Edit4.Enabled := True Edit5.Enabled := True Button3.Enabled := True ClientSocket1.socket.stext('1' + 'ô' + edit1.text + ' ' + edit2.text)
52 Modul interupsi_error Fungsi: melakukan interrupt agar tidak terjadi program error pada saat ada kesalahan procedure TForm1.ClientSocket1Error if ErrorEvent = eeconnect then messagedlg('connection failed',mtwarning,[mbok],0) if ErrorEvent = eedisconnect then messagedlg('disconnection failed',mtwarning,[mbok],0) if ErrorEvent = ees then messagedlg('s Data failed',mtwarning,[mbok],0) if ErrorEvent = eereceive then messagedlg('receive Data failed',mtwarning,[mbok],0) errorcode:=0 Modul diskoneksi Fungsi: melakukan diskoneksi ke server procedure TForm1.Button2Click(Ser: TObject) ClientSocket1.socket.stext('2' + 'ô' + edit1.text + ' ' + edit2.text) ClientSocket1.Active := False
53 Modul terima_pesan_server Fungsi: menerima pesan dari server berupa pemutusan koneksi atau reply dari pengiriman data procedure TForm1.ClientSocket1Read var pesan : string id : integer pesan := socket.receivetext Memo1.Lines.Add(pesan) id := pos('ô',pesan) case strtoint(copy(pesan,1,id-1)) of 1: {kick from server} messagedlg(copy(pesan,id+1,length(pesan)-id),mtwarning,[mbok],0) ClientSocket1.Active := False 2: {recieve reply from server} messagedlg(copy(pesan,id+1,length(pesan)-id),mtwarning,[mbok],0)
54 Modul dekrip-kirim_pesan Fungsi: mekripsi pesan yang diterima dari user dan mengirimkannya ke server procedure TForm1.Button3Click() var i,j, ulang, flag : integer state, temp_state : array [0..3, 0..3] of integer hasil_str : string Kode, nama, gol : string if Length(Edit4.Text) <> 64 then messagedlg('input yang dikirim harus 64 karakter',mtwarning,[mbok],0) edit4.setfocus Exit //decrypt data //blok - I for i := 0 to 15 do state[i mod 4, i div 4] := strtoint('$' + copy(edit4.text,i*2+1,2)) //mulai decrypt for ulang := 10 downto 1 do
55 //add round key - chiperkey[ulang] for i := 0 to 3 do for j := 0 to 3 do state[i,j] := state[i,j] xor chiper_key[ulang,i,j] if ulang <> 10 then //mixcolomns for i := 0 to 3 do for j := 0 to 3 do temp_state[i,j] := state[i,j] for i := 0 to 3 do state[0,i] := Kali($0e, temp_state[0,i]) xor Kali($0b, temp_state[1,i]) xor Kali($0d, temp_state[2,i]) xor Kali($09, temp_state[3,i]) state[1,i] := Kali($09, temp_state[0,i]) xor Kali($0e, temp_state[1,i]) xor Kali($0b, temp_state[2,i]) xor Kali($0d, temp_state[3,i]) state[2,i] := Kali($0d, temp_state[0,i]) xor Kali($09, temp_state[1,i]) xor Kali($0e, temp_state[2,i]) xor Kali($0b, temp_state[3,i]) state[3,i] := Kali($0b, temp_state[0,i]) xor Kali($0d, temp_state[1,i]) xor Kali($09, temp_state[2,i]) xor Kali($0e, temp_state[3,i]) //shiftrow for i := 0 to 3 do
56 for j := 0 to 3 do temp_state[i,j] := state[i,j] for i := 0 to 3 do for j := 0 to 3 do state[i,j] := temp_state[i, (j+4-i) mod 4] //subbytes for i := 0 to 3 do for j := 0 to 3 do state[i,j] := ByteSubInv(state[i,j]) //add round key - chiperkey[0] for i := 0 to 3 do for j := 0 to 3 do state[i,j] := state[i,j] xor chiper_key[0,i,j] Hasil_str := '' for i := 0 to 3 do for j := 0 to 3 do Hasil_str := Hasil_str + char(state[j,i]) //blok - II for i := 0 to 15 do state[i mod 4, i div 4] := strtoint('$' + copy(edit4.text,i*2+33,2)) //mulai decrypt
57 for ulang := 10 downto 1 do //add round key - chiperkey[ulang] for i := 0 to 3 do for j := 0 to 3 do state[i,j] := state[i,j] xor chiper_key[ulang,i,j] if ulang <> 10 then //mixcolomns for i := 0 to 3 do for j := 0 to 3 do temp_state[i,j] := state[i,j] for i := 0 to 3 do state[0,i] := Kali($0e, temp_state[0,i]) xor Kali($0b, temp_state[1,i]) xor Kali($0d, temp_state[2,i]) xor Kali($09, temp_state[3,i]) state[1,i] := Kali($09, temp_state[0,i]) xor Kali($0e, temp_state[1,i]) xor Kali($0b, temp_state[2,i]) xor Kali($0d, temp_state[3,i]) state[2,i] := Kali($0d, temp_state[0,i]) xor Kali($09, temp_state[1,i]) xor Kali($0e, temp_state[2,i]) xor Kali($0b, temp_state[3,i]) state[3,i] := Kali($0b, temp_state[0,i]) xor Kali($0d, temp_state[1,i]) xor Kali($09, temp_state[2,i]) xor Kali($0e, temp_state[3,i])
58 //shiftrow for i := 0 to 3 do for j := 0 to 3 do temp_state[i,j] := state[i,j] for i := 0 to 3 do for j := 0 to 3 do state[i,j] := temp_state[i, (j+4-i) mod 4] //subbytes for i := 0 to 3 do for j := 0 to 3 do state[i,j] := ByteSubInv(state[i,j]) ; //add round key - chiperkey[0] for i := 0 to 3 do for j := 0 to 3 do state[i,j] := state[i,j] xor chiper_key[0,i,j] for i := 0 to 3 do for j := 0 to 3 do Hasil_str := Hasil_str + char(state[j,i]) //pengecekan signature data flag := 1 if pos('#',hasil_str) <> 16 then flag := 0 if pos('$',hasil_str) = 0 then flag := 0 if pos('?',hasil_str) = 0 then flag := 0
59 if pos('@',hasil_str) <> 32 then flag := 0 for i := 1 to 15 do if ((hasil_str[i] < '0') or (hasil_str[i] > '9')) then flag := 0 if pos('$',hasil_str) > 17 then for i := 17 to pos('$',hasil_str) - 1 do if ((hasil_str[i] < 'A') or (hasil_str[i] > 'Z')) and ((hasil_str[i] < 'a') or (hasil_str[i] > 'z')) and (hasil_str[i] <> ' ') then flag := 0 if pos('?',hasil_str) > pos('$',hasil_str) then for i := pos('$',hasil_str) to pos('?',hasil_str) - 1 do if (hasil_str[i] <> '$') then flag := 0; else flag := 0
60 else flag := 0 if ((hasil_str[31] < '0') or (hasil_str[31] > '9')) then flag := 0 if flag = 1 then kode := copy(hasil_str,1,15) nama := copy(hasil_str,17,13) nama := copy(nama,1,pos('$',nama) - 1) gol := copy(hasil_str,31,1) if gol = edit5.text then ClientSocket1.socket.stext('3' + 'ô' + edit1.text + ' ' + edit2.text + ' ' + kode + 'æ' + nama + '»' + gol) else messagedlg('tipe karaan tidak sesuai dengan data pada kartu',mtwarning,[mbok],0) edit4.setfocus else messagedlg('data "'+ edit4.text +'" tidak valid',mtwarning,[mbok],0)
61 edit4.setfocus Modul init_client Fungsi: mengeset kondisi awal form pada saat program baru berjalan procedure TForm1.FormCreate(Ser: TObject) KeySchedule Edit1.Enabled := True Edit2.Enabled := True Edit3.Enabled := True Button1.Enabled := True Button2.Enabled := False Edit4.Enabled := False Edit5.Enabled := False Button3.Enabled := False Modul koneksi_putus Fungsi: mengeset kondisi form setelah terjadi diskoneksi procedure TForm1.ClientSocket1Disconnect Edit1.Enabled := True
62 Edit2.Enabled := True Edit3.Enabled := True Button1.Enabled := True Button2.Enabled := False Edit4.Enabled := False Edit5.Enabled := False Button3.Enabled := False Modul val _pintutol Fungsi: mengecek kevalidan input data nama pintu tol procedure TForm1.Edit1KeyPress(Ser: TObject; var Key: Char) if ((key < 'A') or (key > 'Z')) and ((key < 'a') or (key > 'z')) and (key <> char(8)) and (key <> ' ') then key := char(0) Modul val _loket Fungsi: mengecek kevalidan input data nomor loket procedure TForm1.Edit2KeyPress(Ser: TObject; var Key: Char) if ((key < '0') or (key > '9')) and (key <> char(8)) then key := char(0)
63 Modul val _datauser Fungsi: mengecek kevalidan input enkripsi data user procedure TForm1.Edit4KeyPress(Ser: TObject; var Key: Char) if ((key < 'A') or (key > 'F')) and ((key < 'a') or (key > 'f')) and ((key < '0') or (key > '9')) and (key <> char(8)) then key := char(0) Modul val _golk Fungsi: mengecek kevalidan input data golongan karaan procedure TForm1.Edit5KeyPress(Ser: TObject; var Key: Char) if ((key < '0') or (key > '9')) and (key <> char(8)) then key := char(0) Modul exit_client Fungsi: memutuskan koneksi ke server dan keluar dari program procedure TForm1.Exit2Click ClientSocket1.socket.stext('2' + 'ô' + edit1.text + ' ' + edit2.text) ClientSocket1.Active := False Application.Terminate
64 Modul about Fungsi: menampilkan informasi mengenai program procedure TForm1.About1Click(Ser: TObject) AboutBox.ShowModal