Hendra Suprayogi, S.Kom. Ronny Susetyo Irfan Hartono
Winner vs. Looser
Modul Praktikum
PEMROGRAMAN DELPHI
Winner is always a part of solutions Looser is always a part of problems
Antarmuka Borland Delphi 7
Winner sees answer in every problem Looser sees problem in every answer Winner always has a program Looser always has an excuse Winner always says, “It’s difficult, but it’s possible.” Looser always says, “It’s possible, but it’s difficult.”
Se k o l a h Ti n g g i I n f o r m a t i k a d a n Ko m p u t e r I n d o n e s i a 2008
Kata Pengantar
P
ascal merupakan salah satu bahasa pemrograman yang terkenal dengan kekuatan strukturnya. Selain itu didukung pula dengan kemudahannya untuk digunakan, sehingga menjadi pilihan yang patut diperhitungkan dalam dunia pemrograman. Kecepatan penjalanan program yang dihasilkannya juga menjadi salah satu daya saing mengapa Pascal terus berkembang hingga saat ini dengan berbagai bentuk, sampai terakhir pada bentuk OOP (object oriented programming) dan visual. Delphi merupakan versi visual dari Pascal, yang mana merupakan topik utama yang dibahas dalam modul praktikum ini. Modul praktikum ini merupakan yang pertama disusun karena pertama kali ini pulalah mata kuliah Pemrograman Delphi diadakan di Sekolah Tinggi Informatika dan Komputer Indonesia. Pada terbitan ini penyusun telah memperbaiki susunan, bahasa, gaya, dan jenis huruf yang dipakai sehingga meningkatkan derajat keterbacaan modul praktikum ini. Modul praktikum ini dihadirkan kembali pada tahun 2008, dengan bantuan dua asisten dosen di laboratorium STIKI, yaitu Ronny Susetyo dan Irfan Hartono. Penyusun berharap semoga Modul Praktikum Pemrograman Delphi ini dapat bermanfaat bagi semua pihak, terutama bagi yang mengambil mata kuliah Pemrograman Delphi di Sekolah Tinggi Informatika dan Komputer Indonesia. Namun begitu tidaklah masuk akal bila menganggap modul ini sudah sempurna—terutama karena memang tidak ada satupun yang sempurna. Tinjauan dan saran yang bersifat membangun tetaplah sangat diharapkan demi peningkatan kesempurnaan modul praktikum ini, bukannya kesempurnaan itu sendiri. Malang, Maret 2008 Penyusun
Daftar Isi Winner vs. Looser ............................................................................... ii Kata Pengantar ................................................................................... iii Daftar Isi.............................................................................................. iv Pengenalan Borland Delphi dan Penyuntingan Form........................ 1 Borland Delphi ................................................................................... 1 IDE Borland Delphi............................................................................. 2 Main Window ........................................................................................3 Main Menu .........................................................................................3 Speed Buttons.....................................................................................3 Component Palette.............................................................................4 Code Editor ............................................................................................4 Form Designer........................................................................................5 Object Inspector .....................................................................................6 Pengenalan Organisasi Program Borland Delphi ................................ 7 Project Files (*.DPR) dan Unit Files (*.PAS) .........................................8 Form Units..........................................................................................8 Component Units...............................................................................8 Common Units ...................................................................................9 Form Files (*.DFM) ................................................................................9 Resource Files (*.RES)............................................................................9 Project Options Files (*.DOF) dan Desktop Settings Files (*.DSK)....................................................................................................9 Backup Files (*.~DP, *.~DF, *.~PA).....................................................10 Berkas Jenis Lain..................................................................................10 Executable Files (*.EXE)...................................................................10 Object Unit Files (*.DCU).................................................................10 Dynamic Link Library Files (*.DLL) ...............................................10 Help Files (*.HLP) ............................................................................11
Image Files (*.WMF, *.BMP, *.ICO).................................................11 Perancangan Form .......................................................................... 11
Microsoft Access.............................................................................. 51 Membuat Tabel ....................................................................................52
Penambahan Komponen .....................................................................12 Contoh Aplikasi ................................................................................ 12 Tugas Aplikasi ................................................................................. 14
Mendefinisikan Hubungan .................................................................54 Open Database Connectivity............................................................ 56 Membuat Data Source .........................................................................57
Tugas 1.1...............................................................................................14
Membuat Berkas DSN .........................................................................59 Datasets (Koneksi ADO) .................................................................. 61 TADOConnection ................................................................................62
Tugas 1.2...............................................................................................15 Events dan Event-Handlers............................................................... 16 Event yang dimiliki Komponen.......................................................... 17 Contoh Aplikasi ................................................................................ 18 Hal-hal yang harus Diperhatikan ...................................................... 22 Tugas Aplikasi ................................................................................. 24 Tugas 2.1...............................................................................................24
ConnectionString .............................................................................62 LoginPrompt ....................................................................................64 TADOTable ..........................................................................................65 Connection........................................................................................65 TableName .......................................................................................65
Tugas 2.2...............................................................................................25
Active................................................................................................65
Tugas 2.3...............................................................................................25
TADOQuery.........................................................................................65
Exceptions ......................................................................................... 26 Try-except........................................................................................ 26 Try..finally ........................................................................................ 27 Contoh Aplikasi ................................................................................ 28 Properti Tag..................................................................................... 33 Tugas Aplikasi ................................................................................. 36
Connection........................................................................................66
Tugas 3.1...............................................................................................36 Tugas 3.2...............................................................................................38 Tugas 3.3...............................................................................................38 VCL Standar dan Timer ..................................................................... 39 Contoh Aplikasi ................................................................................ 41 Tugas Aplikasi ................................................................................. 47 Tugas 4.1...............................................................................................47
SQL....................................................................................................66 Parameters........................................................................................66 Active................................................................................................66 Data Sources ................................................................................... 66 TDataSource .........................................................................................66 DataSet..............................................................................................67 Data Controls................................................................................... 67 DataSource........................................................................................67 DataField ..........................................................................................67 TDBGrid ...............................................................................................68 TDBNavigator......................................................................................68 TDBText................................................................................................68
Tugas 4.2...............................................................................................47
TDBEdit ................................................................................................68
Tugas 4.3...............................................................................................48
Contoh Aplikasi ................................................................................ 68 Tugas Aplikasi ................................................................................. 70
Koneksi Database menggunakan ADO ............................................ 49 Arsitektur Database pada Delphi menggunakan ADO....................... 50
Tugas 5.1...............................................................................................70
Medan-medan Semu dan Pengesahan Data..................................... 71 Jenis-jenis Medan dalam Datasets ................................................... 71
TDBComboBox ....................................................................................85
Medan Data (Data Fields)................................................................72
TDBLookupComboBox .......................................................................86
Medan Pengunjung (Lookup Fields) ..............................................72
TDBMemo ............................................................................................86
Medan Terhitung (Calculated Fields).............................................72 Fields Editor .........................................................................................72 Menghitung Medan Terhitung........................................................... 75 OnCalcFields ....................................................................................75
TDBImage.............................................................................................86 Contoh Aplikasi ................................................................................ 86 Tugas Aplikasi ................................................................................. 87 Tugas 7.1...............................................................................................87
Rekayasa Tampilan Medan.............................................................. 75 DisplayLabel.....................................................................................76
Query.................................................................................................. 89 Structured Query Language ............................................................. 89
DisplayFormat..................................................................................76
Data Manipulation Language .............................................................90
DisplayWidth ...................................................................................76 Visible ...............................................................................................76 Pengesahan Data ............................................................................ 76
TDBLookupListBox .............................................................................85
Query yang Menampilkan Hasil (SELECT) ...................................90 Query yang Mengubah Data pada Tabel (INSERT, UPDATE, dan DELETE)..................................................................92
BeforePost.........................................................................................77
Perintah INSERT ..........................................................................93
OnPostError......................................................................................77
Perintah UPDATE ........................................................................93
OnDeleteError ..................................................................................77 Referensi Tambahan........................................................................ 77
Perintah DELETE .........................................................................94
First, Prior, Next, dan Last...............................................................78
Data Definition Language ...................................................................94
EnableControls dan DisableControls..............................................78
Menggunakan TADOQuery.............................................................. 95 SQL .......................................................................................................95
Eof dan Bof .......................................................................................78
Parameters............................................................................................95
RecordCount ....................................................................................78
DataType ..........................................................................................96
FieldByName....................................................................................79 Contoh Aplikasi ................................................................................ 79 Tugas Aplikasi ................................................................................. 81 Tugas 6.1...............................................................................................81
Value.................................................................................................96
Hubungan Master-Detail dan Data Controls Tambahan .................. 82 Mendefinisikan Hubungan Master-Detail .......................................... 82 Data Controls Tambahan ................................................................. 84 TDBRadioGroup ..................................................................................84
Menjalankan Query .............................................................................96 Open..................................................................................................96 ExecSQL............................................................................................96 Mengakses Hasil Query ......................................................................97
TDBCheckBox ......................................................................................85
FieldByName....................................................................................97 Contoh Aplikasi ................................................................................ 98 Tugas Aplikasi ................................................................................. 99 Tugas 8.1...............................................................................................99
TDBListBox ..........................................................................................85
Daftar Pustaka ................................................................................. 100
Modul I - Pengenalan Borland Delphi
Modul
1
1-2
Gambar 1.1: Contoh tampilan IDE Delphi.
Pengenalan Borland Delphi dan Penyuntingan Form Borland Delphi
D
elphi adalah versi visual dari Pascal. Berbagai kemudahan ditawarkan oleh Delphi, mulai dari perancangan aplikasi berbasis form, kemudahan pemberian komponen visual, rekayasa property dan event yang tergabung melalui object inspector, sampai code insight (ada pada Delphi 3 ke atas).
Selain itu, dukungan penuh diberikan kepada struktur bahasa pemrograman yang digunakan, dengan memberikan migrasi dari Bahasa Pascal menjadi Bahasa Pascal Objek (Object Pascal Language). Dengan demikian, cara pemrograman sudah lain bila dibandingkan dengan Pascal yang lama. Migrasi struktur bahasa pemrograman tersebut dimaksudkan untuk lebih mendekatkan kepada konsep pemrograman berorientasi objek, yang telah lama dimiliki oleh Bahasa Pemrograman C++. Namun ciri khas bahasa Pascal yang mudah dipahami—terutama oleh pemula—tetap merupakan kelebihan Pascal yang utama. Paduan ini membuat Delphi lebih mudah dipelajari (dari segi struktur bahasanya) daripada kompiler-kompiler lainnya.
Dengan cara perancangan aplikasi secara visual, maka aplikasi-aplikasi Delphi mudah sekali dikembangkan, karena segala yang akan ingin ditampilkan dapat terlihat secara visual pada saat merancang aplikasi tersebut. Salah satu lagi kelebihan Delphi adalah kemampuan database-nya yang mendukung hampir semua jenis database, mulai dari yang bersifat local hingga client/server. Ditambah lagi dengan kelengkapan koneksi ADO (ActiveX Data Object) yang merupakan standar dari Microsoft, menambah integrasi aplikasi yang dikembangkan oleh Delphi dengan sistem operasi Microsoft Windows. Selain itu disediakan pula versi Delphi khusus untuk sistem operasi Linux, yaitu Borland Kylix.
IDE Borland Delphi
S
ebagai bahasa pemrograman yang bersifat visual, terdapat beberapa peningkatan IDE Delphi dari IDE Turbo Pascal. Bila
Modul I - Pengenalan Borland Delphi
1-3
Modul I - Pengenalan Borland Delphi
1-4
dalam IDE Turbo Pascal, pemrogram dapat melakukan coding, kompilasi, menjalankan program, dan debugging hanya dalam satu lingkungan terpadu, maka terdapat beberapa tambahan pada IDE Delphi.
masuk berkali-kali dalam sub-menu, tetapi untuk beberapa perintah tertentu yang sering dipakai akan dapat dieksekusi dengan cepat menggunakan speed buttons tersebut, yaitu dengan klik pada salah satunya.
Tambahan utama yang ada meliputi tempat untuk form designer dan object inspector.
Speed buttons berada pada posisi kiri bawah dari main window.
Ada empat bagian utama pada IDE Delphi, yaitu main window, code editor, form designer, dan object inspector.
Component Palette
Main Window Main window (window utama) adalah sebuah window yang terdapat pada bagian atas setiap kali Delphi dijalankan. Main window berisi menu-menu utama dari IDE Delphi, selain juga berisi komponen-komponen yang digunakan dalam membuat sebuah project.
Component palette adalah sebuah palet yang berisi daftar komponen yang bisa digunakan dalam form aplikasi Delphi. Ada beberapa tab pada component palette, dan pemrogram harus memilihnya terlebih dahulu sebelum menggunakan komponen yang ada di dalam setiap tab tersebut. Component palette berada pada bagian kanan bawah dari main window. Semua komponen yang ada pada Delphi ataupun tambahan yang bisa di-download dari internet disebut dengan VCL (visual component library). Meskipun begitu, ada beberapa yang benarbenar visual maupun yang non-visual.
Gambar 1.3: Contoh Main Window.
Code Editor Pada main window masih terdapat beberapa elemen yang digunakan untuk melakukan pemrograman pada Delphi. Beberapa elemen tersebut antara lain main menu, speed buttons, dan component pallete.
Main Menu Main menu merupakan menu utama yang digunakan untuk memilih perintah-perintah dalam IDE Delphi. Main menu berada pada posisi teratas dalam main window.
Speed Buttons Speed buttons merupakan tombol-tombol yang gunanya sama dengan main menu. Hanya saja bila dengan main menu diperlukan
Code editor adalah sebuah window yang digunakan untuk menyunting kode program, di mana pemrogram melakukan coding. Code editor juga terdapat pada IDE Turbo Pascal.
Modul I - Pengenalan Borland Delphi
1-5
Gambar 1.4: Contoh Code Editor.
Form Designer Inti perancangan aplikasi secara visual terdapat pada form designer. Dalam form designer, pemrogram dapat merancang bagaimana sebuah form nantinya akan tampil dan berinteraksi dengan pemakai.
Modul I - Pengenalan Borland Delphi
1-6
Gambar 1.5: Contoh Form Designer.
Sebuah form dapat berisi beberapa komponen yang diambil dari tab-tab komponen yang terdapat pada main window. Beberapa komponen visual dapat langsung ditentukan posisi dan ukurannya hanya dengan melakukan drag-drop mouse pada komponen yang bersangkutan.
Object Inspector Dalam Delphi, komponen-komponen yang ada pada form (baik komponen visual maupun non-visual) memiliki beberapa properti (property) dan event. Properti menggambarkan sifat dari komponen tersebut. Sebagai contoh, properti Width menunjukkan lebar dari komponen tersebut. Sedangkan event merupakan kejadian-kejadian yang terjadi dan nantinya ditanggapi oleh pemrogram. Kode-kode untuk menaggapi kejadian tersebut dinamakan event-handler.
Modul I - Pengenalan Borland Delphi
1-7
Gambar 1.6: Contoh Object Inspector.
Object inspector merupakan sebuah window untuk merekayasa properti dan event dari beberapa komponen tersebut. Terdapat dua tab pada object inspector, yaitu tab properties dan tab events.
Pengenalan Organisasi Program Borland Delphi
D
elphi tidak hanya menyimpan berkas kode dengan ekstensi PAS, tetapi karena pada Delphi juga terdapat form beserta parameternya, maka ada beberapa berkas yang akan disimpan. Untuk memudahkan, sebuah program disebut dengan sebuah project. Project tersebut akan berisi form, source code untuk form, dan source code untuk project. Untuk sebuah form akan diberi sebuah unit, yang akan berisi kode-kode program untuk merekayasa form tersebut, terutama untuk events yang dimiliki oleh form tersebut. Berikut ini berkas-berkas yang dihasilkan dan disimpan oleh Delphi:
Modul I - Pengenalan Borland Delphi
1-8
Project files (*.DPR), yaitu source code sebuah project pada Delphi. Setiap kali aplikasi pada Delphi dirancang, maka akan terdapat satu project.
Form files (*.DFM), yaitu text files atau binary files yang berisi informasi tentang sebuah form.
Unit files (*.PAS), yaitu source code untuk unit. Setiap kali sebuah form dirancang maka akan diberikan sebuah berkas unit—nama berkas keduanya sama, hanya ekstensinya berbeda. Tetapi berkas unit dapat berdiri sendiri seperti halnya pada Turbo Pascal tanpa korespondensi sebuah form.
Ada beberapa berkas lain yang ada pada sebuah project, semacam resource files (*.RES), berkas konfigurasi (*.CFG), berkas untuk options (*.DOF), hasil kompilasi unit (*.DCU), dan lainlain. Bila sebuah project akan disalin antar media, maka semua berkas yang ada pada project directory harus disertakan.
Project Files (*.DPR) dan Unit Files (*.PAS) Project files dipakai untuk menyimpan informasi mengenai form dan unit. Berkas tersebut berisikan inisialisasi form utama dan form-form lain yang dibuat secara otomatis. Sedangkan unit files dipakai untuk menyimpan program. Ada 3 jenis unit yaitu form units, component units dan common units.
Form Units Form units dibuat secara otomatis oleh Delphi, yaitu satu unit untuk setiap form yang dibuat. Sebuah unit tidak dapat mempunyai lebih dari satu form yang didefinisikan di dalamnya.
Component Units Component units dibentuk pada saat mulai membuat sebuah komponen baru. Biasanya pembuatan komponen baru ini meru-
Modul I - Pengenalan Borland Delphi
1-9
Modul I - Pengenalan Borland Delphi
1-10
pakan pekerjaan ahli dan jarang dilakukan oleh pemrogram biasa.
Project options files dimiliki oleh setiap project sedangkan desktop settings files dipakai untuk lingkungan Delphi.
Pembuatan komponen baru bukan berarti membuat yang benar-benar baru, karena sifat dari OOP itu sendiri. Pembuatannya adalah dengan cara menurunkan komponen yang sudah ada.
Kerusakan yang terjadi pada kedua jenis berkas tersebut dapat mengganggu proses kompilasi. Untuk menangani gangguan tersebut adalah dengan menghapus kedua jenis berkas tersebut.
Common Units Common units dibuat untuk tipe data, peubah, prosedur, fungsi, atau kelas yang dapat digunakan dan diaplikasikan. Unit ini adalah unit seperti pada Turbo Pascal.
Form Files (*.DFM) Form files adalah berkas biner yang dibuat Delphi untuk menyimpan informasi yang berkaitan dengan form dan setiap form mempunyai sebuah unit file (*.PAS).
Resource Files (*.RES) Resource files merupakan berkas biner yang berisi icons yang digunakan oleh project. Berkas ini secara terus menerus diubah oleh Delphi setiap kali pemrogram melakukan perubahan pada project-nya (termasuk mengubah form, unit, atau options dalam project tersebut).
Project Options Files (*.DOF) dan Desktop Settings Files (*.DSK) Project options files dan desktop settings files terbentuk secara otomatis pada saat menyimpan project. Project options files merupakan berkas yang berisi options dari suatu project yang dinyatakan melalui pilihan Project|Options. Berkas ini tersimpan pada saat menyimpan project. Sedangkan desktop setting files berisi options yang dinyatakan melalui pilihan Tools|Environment Options.
Backup Files (*.~DP, *.~DF, *.~PA) Berkas dengan ekstensi ~DP, ~DF, dan ~PA merupakan berkas cadangan (backup) dari sebuah project yang berisi salinan terakhir dari berkas utama sebelum disimpan lebih lanjut.
Berkas Jenis Lain Selain berkas-berkas tersebut di atas, masih ada beberapa berkas yang dikelompokkan sebagai berkas-berkas lain karena tidak dibutuhkan secara langsung oleh project.
Executable Files (*.EXE) Executable files (*.EXE) dibentuk oleh kompiler dan merupakan berkas eksekusi dari program aplikasi. Berkas inilah yang bisa dijalankan dari lingkungan Windows secara langsung sebagai aplikasi.
Object Unit Files (*.DCU) Object unit files (*.DCU) merupakan berkas unit yang telah dikompilasi oleh kompiler yang akan dihubungkan dengan berkas eksekusi. berkas ini analog dengan TPU pada Turbo Pascal. DCU merupakan singkatan dari Delphi Compiled Unit.
Dynamic Link Library Files (*.DLL) Dynamic link library files (*.DLL) dibentuk oleh kompiler apabila merancang sebuah library. Sebuah library merupakan kepustakaan yang dapat digunakan oleh semua aplikasi yang berjalan di bawah sistem operasi Microsoft Windows.
Modul I - Pengenalan Borland Delphi
1-11
Dengan menggunakan library, maka program Windows dapat diubah tampilan atau di-update fungsi-fungsinya tanpa harus mengkompilasi program itu sendiri, tapi cukup mengganti berkas library tersebut pada sistem Windows.
Help Files (*.HLP) Help files (*.HLP) merupakan berkas Windows dan merupakan berkas pertolongan standar yang dapat dipakai di program aplikasi Delphi.
Image Files (*.WMF, *.BMP, *.ICO) Image files (*.WMF, *.BMP, *.ICO) merupakan berkas Windows dari program aplikasi selain Delphi yang menyimpan gambar-gambar untuk mendukung program aplikasi yang dirancang agar tampak lebih informatif dengan pemakai.
Perancangan Form
F
orm pada Delphi dapat dirancang dengan cara mengubah properti-properti pada form tersebut, semisal properti Width untuk menyatakan lebar form, properti Caption untuk menyatakan judul dari form tersebut, dan lain-lain.
Modul I - Pengenalan Borland Delphi
1-12
Penambahan Komponen
U
ntuk melakukan penambahan komponen, dapat dilakukan dengan cara memilih (klik) pada salah satu komponen pada component palette, kemudian klik pada tempat yang diinginkan pada form. Selain itu, bisa juga dilakukan dengan cara klik pada salah satu komponen pada component palette dan melakukan drag pada tempat tertentu pada form yang berfungsi sekaligus untuk menentukan tempat dan ukuran dari komponen tersebut.
Contoh Aplikasi Berikut ini pada gambar 1.7 merupakan form yang telah terisi beberapa komponen. Gambar 1.7: Perancangan form untuk contoh aplikasi.
Untuk mengetahui properti-properti yang ada dan sekaligus mengubah nilainya, tekan tombol F11. Tombol tersebut akan melakukan switching antara form designer dengan object inspector. Sedangkan untuk melakukan switching form designer dengan code editor dapat dilakukan dengan menekan tombol F12. Selain itu, untuk beberapa properti dapat diubah dengan cara drag-drop mouse pada beberapa posisi form tersebut. Sebagai contoh, pemrogram dapat memindahkan posisi form tersebut dengan drag pada bagian Caption. Selain itu, pemrogram juga dapat mengubah ukuran form tersebut dengan melakukan drag pada sisi-sisi form tersebut.
Semua VCL yang ada pada form tersebut diambil dari tab standard. Komponen TLabel, TEdit, TButton, TCheckBox, TRadioButton, TGroupBox, dan TComboBox merupakan komponen visual yang telah diambil dari tab standard. Sedangkan TMainMenu dan TPopupMenu merupakan komponen non-visual.
Modul I - Pengenalan Borland Delphi
1-13
Ubahlah beberapa properti dari beberapa komponen yang ada di form tersebut, sehingga menghasilkan tampilan seperti pada gambar 1.7. Selanjutnya, pada folder kerja Anda (ingat untuk mengganti folder sebelum melakukan penyimpanan) simpanlah unit tersebut dengan nama UnitDataCalonTKI, dan simpan project tersebut dengan nama LatihanPertama.
Modul I - Pengenalan Borland Delphi
1-14
Tugas Aplikasi Tugas 1.1 Rancanglah sebuah form seperti pada gambar 1.8. Komponenkomponen yang diperlukan semuanya masih berada pada tab standard, dan di antaranya adalah TLabel, TEdit, TButton, dan TPanel. Gambar 1.8: Perancangan form untuk tugas 1.1.
Berilah nama (ubah properti Name) komponen-komponen tersebut sebagai berikut:
Ketiga komponen TEdit dengan nama (urut dari atas) EditNRP, EditNama, dan EditAlamat.
Komponen TButton yang memiliki Caption “OK” dengan nama ButtonOK, dan yang memiliki Caption “Cancel” dengan nama ButtonCancel.
Komponen TPanel yang ada di bawah dengan nama PanelTampil.
Selanjutnya, pada folder kerja Anda (ingat untuk mengganti folder sebelum melakukan penyimpanan) simpanlah unit tersebut dengan nama UnitPertama, dan simpan project tersebut dengan nama TugasPertama.
Modul I - Pengenalan Borland Delphi
1-15
Tugas 1.2
Modul
2
Rancanglah sebuah form seperti pada gambar 1.9. Kali ini dengan hanya melihat sekilas dari form tersebut, tentukanlah sendiri komponen yang harus dipilih, sekaligus properti tiap komponen dalam form tersebut. Gambar 1.9: Perancangan form untuk tugas 1.2.
Events dan Event-Handlers
D
elphi merupakan sebuah bahasa pemrograman dengan sifat event-driven. Berbeda dengan Pascal yang memiliki sifat prosedural, Delphi tidak menjalankan program secara berurutan dari awal hingga akhir, melainkan menunggu terjadinya event (kejadian). Event itu sendiri akan terpacu oleh beberapa macam keadaan, sesuai dengan nama dan tujuan dari event tersebut. Event sendiri merupakan suatu properti yang memiliki nilai sebuah pointer yang menunjuk ke sebuah prosedur. Sedangkan prosedur yang ditunjuk tadi disebut dengan event-handler. Tugas pemrogram yang sifatnya mengetik—atau sering juga disebut dengan coding—dilakukan untuk mengisi event-handler tersebut. Untuk melihat event yang ada pada sebuah komponen, dapat dilihat pada object inspector pada tab events (ada dua tab pada object inspector, yang pertama adalah tab properties dan yang kedua tab events). Semua komponen merupakan komponen visual yang berada pada tab standard.
Karena salah satu sifat dari Delphi adalah event-driven, maka pemrogram, terutama pemrogram yang terbiasa memakai Turbo Pascal, harus meninggalkan kebiasaannya merancang program yang bersifat prosedural menjadi event-driven. Bila gaya pemrograman prosedural adalah melakukan pemrograman mulai dari awal hingga akhir secara berturutan, maka gaya pemrograman event-driven adalah hanya menulis kode program untuk memerintahkan komputer mengerjakan suatu hal tertentu bila terjadi suatu event tertentu.
Modul II – Events dan Event-Handlers
2-17
Modul II – Events dan Event-Handlers
Semisal bila suatu komponen TButton diklik dengan mouse, maka event OnClick akan timbul. Dan bila event tersebut berisi dengan event-handler yang diketik oleh pemrogram, maka eventhandler yang diketik pemrogram tadi akan dijalankan. Tetapi bila event tersebut kosong (bernilai nil) maka tidak akan dikerjakan apapun.
Sebagai contoh, berikut ini beberapa nama event dan artinya: 1.
OnClick, timbul ketika komponen diklik dengan mouse.
2.
OnDblClick, timbul ketika komponen diklik ganda dengan mouse.
3.
OnChange, timbul ketika sebuah komponen yang memiliki properti Text (seperti TEdit) diubah isinya (baik oleh pemakai atau oleh program).
4.
OnEnter, timbul ketika sebuah komponen menerima fokus.
5.
OnExit, timbul ketika sebuah komponen kehilangan fokus.
6.
OnKeyDown, timbul ketika sebuah komponen menerima penekanan tombol papan ketik.
7.
OnKeyUp, timbul ketika sebuah komponen yang telah menerima penekanan tombol papan ketik, di mana tombol tersebut sedang dilepaskan oleh pemakai.
OnKeyPress, timbul ketika sebuah komponen menerima sebuah karakter dari penekanan dan pelepasan sebuah tombol papan ketik.
9.
OnMouseDown, timbul ketika tombol mouse ditekan (dan ditahan) pada sebuah komponen.
11. OnMouseMove, timbul ketika kursor mouse berpindah posisi pada sebuah komponen.
Event yang dimiliki Komponen
H
8.
10. OnMouseUp, timbul ketika tombol mouse dilepas (setelah ditekan) pada sebuah komponen.
Satu contoh lain, bila sebuah komponen TEdit diubah isinya (properti Text-nya berubah) maka akan timbul event OnChange.
ampir semua komponen—yang tergabung dalam VCL (visual component library)—memiliki event. Event tersebut timbul dalam kejadian yang berbeda-beda. Nama dari event tersebut menggambarkan kejadian yang timbul.
2-18
Contoh Aplikasi
S
ebagai contoh, buka kembali TugasPertama yang telah dibuat. Buka project tersebut dan akan muncul tampilan (kirakira) sebagai berikut:
Gambar 2.1: Tampilan ProjectPertama.
Tujuan dari TugasPertama ini adalah bila komponen ButtonOK diklik, maka akan menampilkan NRP, nama, dan alamat
Modul II – Events dan Event-Handlers
2-19
(isi dari ketiga komponen TEdit) sekaligus pada PanelTampil yang ada di bawahnya. Untuk itu, klik pada ButtonOK, dan tekan F11. akan muncul object inspector, kemudian pilih pada halaman events, dan cari event OnClick. Lakukan klik ganda pada tempat kosong di sebelah kanan tulisan “OnClick”. Maka pemrogram akan dihadapkan langsung pada code editor dengan tampilan sebagai berikut: Gambar 2.2: Event-handler ButtonOKClick.
Modul II – Events dan Event-Handlers
2-20
procedure TForm1.ButtonCloseClick(Sender: TObject); begin Close; end; Cobalah jalankan program tersebut dengan salah satu cara berikut ini:
Pilih pilihan Run|Run, atau
Klik pada toolbar yang bertanda
Tekan F9.
, atau
Maka akan tampil: Gambar 2.3: Hasil eksekusi program ProjectPertama.
Secara otomatis akan disediakan event-handler seperti pada gambar di atas. Maka pemrogram akan dapat langsung menulis kode program untuk memerintahkan komputer melakukan sesuatu bila ButtonOK tadi diklik. Isilah baris di antara begin dan end tersebut dengan perintah sehingga keseluruhan event-handler tadi menjadi sebagai berikut: procedure TForm1.ButtonOKClick(Sender: TObject); begin PanelTampil.Caption := EditNRP.Text + ', ' + EditNama.Text + ', ' + EditAlamat.Text; end; Kemudian bila ButtonCancel diklik, maka aplikasi akan menutup. Caranya sama dengan tadi, hanya saja event OnClick yang diisi adalah milik komponen ButtonCancel. Isilah event-handler-nya sehingga menjadi seperti:
Coba isi ketiga komponen TEdit dengan NRP, nama, dan alamat seseorang (disarankan yang pendek saja agar tulisannya tampil semua pada PanelTampil), kemudian klik ButtonOK.
Modul II – Events dan Event-Handlers
2-21
Gambar 2.3: Setelah TEdit diisi dan ButtonOK diklik.
Modul II – Events dan Event-Handlers
2-22
Gambar 2.5: Yang tampil bila TButton dengan Caption “OK” diklik.
Bila ButtonCancel diklik, maka aplikasi tersebut akan menutup. Bila sudah selesai, cobalah untuk membuat project baru yang mirip, dan nantinya akan tampil form-nya seperti gambar 2.4. Gambar 2.4: Contoh form designer untuk project yang baru.
Simpanlah unit-nya sebagai UnitUtama, dan project-nya sebagai TugasDua.
Hal-hal yang harus Diperhatikan Beberapa hal berikut ini harus Anda perhatikan di saat melakukan coding. Bila Anda melanggar hal-hal berikut ini, maka akan terjadi masalah pada waktu kompilasi.
Tentukan sendiri properti dari semua komponen yang ada. Tujuannya adalah bila diisi dan diklik TButton yang memiliki Caption “OK” akan tampil seperti pada gambar 2.5.
1.
Jangan ubah baris antara deklarasi kelas form (TForm1 = class(TForm)) sampai dengan klausa private, karena bagian tersebut secara otomatis akan diubah oleh Delphi sesuai dengan korespondensi form yang disunting.
2.
Bila ingin menambahkan metode pada kelas form Anda, lakukan hanya pada bagian private atau public.
3.
Anda juga bisa menambahkan bagian protected dan published pada kelas form Anda.
Modul II – Events dan Event-Handlers
2-23
4.
Jangan mengubah deklarasi peubah global form Anda (var Form1: TForm1;).
5.
Sebelum Anda melakukan kompilasi, pada waktu melakukan coding, ingat jumlah blok yang ada. Semua blok harus berakhir dengan benar.
Selain itu beberapa tip berikut bisa dilakukan untuk mempermudah: 1.
Lakukan penyimpanan secara berkala untuk menghindari kehilangan data kalau sewaktu-waktu aliran listrik terganggu.
3.
Untuk sekedar memeriksa kesahihan kode program, bisa dilakukan syntax check dengan memilih pilihan Project|Syntax check. Untuk mengkompilasi bisa dilakukan dengan pilihan Project|Compile atau Project|Build. Perbedaan compile dengan build adalah jika compile hanya mengkompilasi baris-baris yang diubah, sedangkan build mengkompilasi seluruh project.
2-24
Tugas Aplikasi Tugas 2.1 Ubahlah TugasPertama sebagai berikut:
Anda bisa memberikan hanya satu event-handler untuk lebih dari satu event. Hanya saja jenis event harus sama. Caranya bisa dengan memilih beberapa komponen sekaligus (dengan menggunakan shift+click) kemudian mendefinisikan event-handler-nya. Cara lainnya adalah dengan mendefinisikan event-handler untuk satu event, kemudian mengisikan event lain secara manual nama event-handler-nya.
2.
4.
Modul II – Events dan Event-Handlers
Kosongkan event-handler ButtonOKClick. Ingat, hanya kosongkan isinya dengan hanya meninggalkan barisbaris:
procedure TForm1.ButtonOKClick(Sender: TObject); begin end;
Simpan project Anda, event-handler yang kosong tersebut akan secara otomatis terhapus.
Hapus komponen ButtonOK.
Buat sedemikian sehingga bila isi dari ketiga TEdit diubah, maka akan menampilkan NRP, nama, dan alamat pada PanelTampil.
Simpan dan jalankan project tersebut.
Form tersebut akan tampil sebagai berikut: Gambar 2.6: Rekayasa TugasPertama.
Modul II – Events dan Event-Handlers
2-25
Tugas 2.2
Modul
3
Seperti pada tugas 2.1, lakukan hal yang sama pada contoh aplikasi kedua pada modul ini, yaitu isikan string pada TMemo berubah sesuai isi pada komponen TEdit, TSpinEdit, dan TComboBox tanpa melakukan klik pada TButton yang memiliki Caption “OK”.
Tugas 2.3 Buatlah sebuah permainan dengan menggunakan event OnMouseMove pada sebuah TButton. Apabila didekati oleh pointer mouse maka TButton tersebut akan berpindah menjahui posisi pointer mouse.
Exceptions
S
alah satu kelebihan yang dimiliki oleh Delphi adalah kemampuannya untuk menangani exception. Exception adalah sebuah istilah pemrograman yang mengacu pada perkecualian yang diakibatkan kesalahan pada waktu menjalankan program dan tidak dapat diketahui atau didefinisikan pada waktu kompilasi.
Exception sendiri dapat diatasi dengan suatu cara yang disebut dengan resource protection, yaitu suatu metode untuk melindungi sumber daya program. Lebih jauh lagi cara tersebut dinamakan dengan exception handling (penanganan pengecualian). Ada dua macam resource protection dalam Delphi, yaitu dengan blok try-except dan blok tr-.finally.
Try-except
B
lok try-except digunakan untuk menjalankan suatu blok pernyataan dan mencegah Delphi agar tidak menampilkan pesan kesalahannya. Sebagai gantinya, pemrogram dapat menampilkan pesan kesalahannya sendiri.
Bila tidak terjadi exception, maka semua baris pada bagian try akan dijalankan, namun bagian except tidak akan dijalankan. Bila terjadi exception, maka baris setelah baris di mana terjadi exception tadi (pada bagian try) tidak akan dijalankan, namun proses eksekusi program dilanjutkan ke bagian except.
Modul III – Exceptions
3-27
Perhatikan blok program berikut ini: try X := Y / Z; except on EZeroDivide do MessageDlg('Terjadi pembagian dengan nol.', mtError, [mbOK], 0); end; Pada contoh program tersebut, bagian try akan mencoba dieksekusi. Di sini ada kemungkinan terjadi exception bila Z bernilai nol, karena akan mengakibatkan pembagian dengan nol. Bila nilai Z tidak sama dengan nol—karenanya, bila tidak terjadi exception—maka bagian except tidak akan dijalankan. Bila nilai Z bernilai nol, maka bagian except akan dijalankan.
Try..finally
B
lok try-finally digunakan untuk menjalankan suatu blok pernyataan, dan selalu menjalankan bagian finally, apapun yang terjadi (terjadi exception ataupun tidak). Hal ini biasanya berguna untuk memberikan finalisasi (pemberian nilai akhir, atau yang harus selalu dikerjakan terakhir kali). Blok ini sebenarnya tidak menangani exception, hanya menangani alur program agar apapun yang terjadi, bagian finally selalu dikerjakan. Perhatikan blok program berikut ini: try A := B / C; D := B + C; finally C := 5; end; Pernyataan A := B / C; akan dieksekusi. Bila terjadi exception (bila C bernilai nol) maka D := B + C; tidak akan dikerjakan. Sebaliknya bila tidak terjadi exception (bila C tidak bernilai nol) maka pernyataan D := B + C; akan dikerjakan. Namun, terjadi
Modul III – Exceptions
3-28
atau tidak exception tersebut, pernyataan C := 5; tetap akan dieksekusi. Untuk menangani exception sepenuhnya yang digabung dengan try-finally dapat dilakukan dengan meletakkan blok tryfinally di dalam bagian try dari try-except. Sebagai contoh: try try A := B / C; D := B + C; finally C := 5; end; except on EZeroDivide do MessageDlg('Terjadi pembagian dengan nol.', mtError, [mbOK], 0); end; Pada contoh di atas, apapun yang terjadi, baris C := 5; tetap akan dijalankan. Tetapi bila terjadi exception, bagian except akan dijalankan. Bagian except akan dijalankan setelah menjalankan bagian finally. Perlu diketahui, agar kedua penanganan exception tadi bekerja semestinya, maka perlu menonaktifkan pilihan “Stop on Delphi Exceptions” dengan cara: 1.
Masuklah ke menu Tools|Debugger Options.
2.
Pilihlah tab Language Exceptions.
3.
Pastikan pilihan combo box “Stop on Delphi Exceptions” dinonaktifkan.
Contoh Aplikasi
A
gar lebih jelas, akan dicoba membuat sebuah aplikasi yang menerapkan penggunaan keduanya. Langkah pertama, rancanglah sebuah form seperti pada gambar 3.1.
Modul III – Exceptions
3-29
Ubahlah nama dari komponen TEdit yang pertama menjadi EditNilaiA, TEdit yang kedua menjadi EditNilaiB, dan TEdit yang ketiga menjadi EditHasil. Kemudian nama komponen TButton mulai dari yang pertama (yang teratas, mulai dari kiri ke kanan) diubah masing-masing menjadi ButtonPlus, ButtonMinus, ButtonMultiply, dan ButtonDivide. Sedangkan kedua TButton berikutnya (yang berada di bawahnya) diubah namanya masing-masing menjadi ButtonDiv dan ButtonMod. Terakhir, ubahlah nama komponen TButton terbawah menjadi ButtonClose. Kemudian ubahlah properti ReadOnly pada EditHasil menjadi True. Gambar 3.1: Tampilan form Kalkulator.
Buatlah event-handler untuk masing-masing event OnClick pada keenam TButton pertama masing-masing sesuai dengan Caption-nya, yaitu untuk menjumlah, mengurangi, mengalikan, membagi, melakukan pembagian bulat, dan mengetahui sisa hasil bagi bilangan bulat. Masing-masing akan memiliki eventhandler seperti di bawah ini: procedure TForm1.ButtonPlusClick(Sender: TObject); var NilaiA, NilaiB, Hasil: Real; begin
Modul III – Exceptions
3-30
try NilaiA := StrToFloat(EditNilaiA.Text); NilaiB := StrToFloat(EditNilaiB.Text); Hasil := NilaiA + NilaiB; EditHasil.Text := FloatToStr(Hasil); except on EConvertError do EditHasil.Text := 'A atau B salah!'; on EOverflow do EditHasil.Text := 'Overflow!'; on EUnderflow do EditHasil.Text := 'Underflow!'; end; end; procedure TForm1.ButtonMinusClick(Sender: TObject); var NilaiA, NilaiB, Hasil: Real; begin try NilaiA := StrToFloat(EditNilaiA.Text); NilaiB := StrToFloat(EditNilaiB.Text); Hasil := NilaiA - NilaiB; EditHasil.Text := FloatToStr(Hasil); except on EConvertError do EditHasil.Text := 'A atau B salah!'; on EOverflow do EditHasil.Text := 'Overflow!'; on EUnderflow do EditHasil.Text := 'Underflow!'; end; end; procedure TForm1.ButtonMultiplyClick(Sender: TObject); var NilaiA, NilaiB, Hasil: Real; begin try NilaiA := StrToFloat(EditNilaiA.Text); NilaiB := StrToFloat(EditNilaiB.Text); Hasil := NilaiA * NilaiB; EditHasil.Text := FloatToStr(Hasil);
Modul III – Exceptions
except on EConvertError EditHasil.Text on EOverflow do EditHasil.Text on EUnderflow do EditHasil.Text end; end;
3-31
do := 'A atau B salah!'; := 'Overflow!'; := 'Underflow!';
procedure TForm1.ButtonDivideClick(Sender: TObject); var NilaiA, NilaiB, Hasil: Real; begin try NilaiA := StrToFloat(EditNilaiA.Text); NilaiB := StrToFloat(EditNilaiB.Text); Hasil := NilaiA / NilaiB; EditHasil.Text := FloatToStr(Hasil); except on EConvertError do EditHasil.Text := 'A atau B salah!'; on EOverflow do EditHasil.Text := 'Overflow!'; on EUnderflow do EditHasil.Text := 'Underflow!'; on EZeroDivide do EditHasil.Text := 'Pembagian dengan nol!'; end; end; procedure TForm1.ButtonDivClick(Sender: TObject); var NilaiA, NilaiB, Hasil: Integer; begin try NilaiA := StrToInt(EditNilaiA.Text); NilaiB := StrToInt(EditNilaiB.Text); Hasil := NilaiA div NilaiB; EditHasil.Text := IntToStr(Hasil); except on EConvertError do EditHasil.Text := 'A atau B salah!';
Modul III – Exceptions
3-32
on EOverflow do EditHasil.Text := 'Overflow!'; on EUnderflow do EditHasil.Text := 'Underflow!'; on EDivByZero do EditHasil.Text := 'Pembagian dengan nol!'; end; end; procedure TForm1.ButtonModClick(Sender: TObject); var NilaiA, NilaiB, Hasil: Integer; begin try NilaiA := StrToInt(EditNilaiA.Text); NilaiB := StrToInt(EditNilaiB.Text); Hasil := NilaiA mod NilaiB; EditHasil.Text := IntToStr(Hasil); except on EConvertError do EditHasil.Text := 'A atau B salah!'; on EOverflow do EditHasil.Text := 'Overflow!'; on EUnderflow do EditHasil.Text := 'Underflow!'; on EDivByZero do EditHasil.Text := 'Pembagian dengan nol!'; end; end; Perhatikan, masing-masing bila terjadi kesalahan maka kesalahan tersebut tidak ditampilkan pada dialog pesan kesalahan (message dialog), tetapi langsung ditampilkan pada EditHasil. Pada kode program tersebut terdapat perbedaan antara exception EDivByZero dan EZeroDivide, yaitu EDivByZero terjadi bila ada pembagian dengan nol untuk bilangan bulat, sedangkan EZeroDivide terjadi bila ada pembagian dengan nol untuk bilangan nyata. Sekarang untuk masing-masing EditNilaiA dan EditNilaiB, buatlah event-handler pada event OnChange (dengan nama Edit-
Modul III – Exceptions
3-33
NilaiChange) sedemikian sehingga bila EditNilaiA ataupun EditNilaiB diubah, maka akan mengosongkan EditHasil. procedure TForm1.EditNilaiChange(Sender: TObject); begin EditHasil.Clear; end; Terakhir, buatlah agar jika ButtonClose diklik, aplikasi akan ditutup. procedure TForm1.ButtonCloseClick(Sender: TObject); begin Close; end; Simpan unitnya dengan nama MainUnit, dan project-nya dengan nama Kalkulator. Jangan lupa untuk menyediakan folder tersendiri untuk menyimpannya. Kemudian cobalah jalankan aplikasi tersebut. Jangan lupa untuk menonaktifkan pilihan “Stop on Delphi Exceptions”.
Properti Tag
B
erikut ini ada sebuah tip kecil. VCL Delphi menyediakan sebuah properti yang dinamakan properti Tag. Properti ini ada pada kelas TComponent. Properti ini merupakan properti bertipe Integer, yang tidak memiliki arti sama sekali dalam Delphi. Namun, properti ini khusus disediakan bagi pemrogram.
Properti ini bisa diisi berapa saja dan digunakan bebas oleh pemrogram untuk menandai atau sebagai label. Salah satu kegunaannya adalah dipakai untuk membuat satu event-handler untuk banyak komponen sekaligus, dengan memanfaatkan parameter Sender yang ada pada setiap event-handler dan menyeleksi Tag dari setiap Sender tersebut dengan struktur kendali case. Sebagai contoh, event-handler untuk setiap TButton pada Kalkulator kecuali ButtonClose dapat dijadikan satu dengan nama ButtonOperationClick dan isinya:
Modul III – Exceptions
3-34
procedure TForm1.ButtonOperationClick(Sender: TObject); var NilaiA, NilaiB, Hasil: Real; ComponentTag: Integer; begin ComponentTag := TComponent(Sender).Tag; try if ComponentTag in [1..4] then begin // ubah menjadi nilai bilangan nyata NilaiA := StrToFloat(EditNilaiA.Text); NilaiB := StrToFloat(EditNilaiB.Text); end else begin // ubah menjadi nilai bilangan bulat NilaiA := StrToInt(EditNilaiA.Text); NilaiB := StrToInt(EditNilaiB.Text); end; case ComponentTag of 1 : Hasil := NilaiA + NilaiB; 2 : Hasil := NilaiA - NilaiB; 3 : Hasil := NilaiA * NilaiB; 4 : Hasil := NilaiA / NilaiB; 5 : Hasil := Trunc(NilaiA) div Trunc(NilaiB); 6 : Hasil := Trunc(NilaiA) mod Trunc(NilaiB); end; EditHasil.Text := FloatToStr(Hasil); except on EConvertError do EditHasil.Text := 'A atau B salah!'; on EOverflow do EditHasil.Text := 'Overflow!'; on EUnderflow do EditHasil.Text := 'Underflow!'; on EDivByZero do EditHasil.Text := 'Pembagian dengan nol!'; on EZeroDivide do EditHasil.Text := 'Pembagian dengan nol!'; end; end;
Modul III – Exceptions
3-35
Kemudian komponen TButton mulai dari yang pertama hingga yang keenam (ButtonPlus, ButtonMinus, ButtonMultiply, ButtonDivide, ButtonDiv, dan ButtonMod) masing-masing diubah properti Tag-nya menjadi 1, 2, 3, 4, 5, dan 6. Jangan lupa untuk menghapus semua event-handler yang lama seperti cara yang telah ditunjukkan pada praktikum kedua. Dengan demikian, maka kode program akan menjadi jauh lebih ringkas karena hanya satu event-handler yang harus ditulis untuk keenam events dari keenam komponen TButton.
Modul III – Exceptions
3-36
Tugas Aplikasi Tugas 3.1 Rekayasalah Kalkulator dengan ketentuan: 1.
Tambahkan satu komponen TPanel bernama PanelOperasi yang menampilkan jenis operasi yang dikerjakan pada nilai A terhadap nilai B (sesuai dengan Caption dari TButton yang diklik). Letakkan TPanel tersebut di atas EditHasil seperti pada gambar 3.2.
2.
Tambahkan kode program pada event-handler yang ada untuk menampilkan jenis operasi pada PanelOperasi.
3.
Bila terjadi kesalahan dan ditampilkan pesan kesalahan pada EditHasil, warna Font pada EditHasil menjadi merah.
4.
Bila tidak terjadi kesalahan dan hasilnya ditampilkan pada EditHasil, warna Font pada EditHasil menjadi biru.
5.
Bila isi dari EditNilaiA atau EditNilaiB diubah, selain mengosongkan EditHasil juga mengosongkan Caption pada PanelOperasi.
6.
Buatlah kode program yang ada menjadi seringkas mungkin.
Jalankan aplikasi tersebut dan amati hasilnya.
Modul III – Exceptions
3-37
Gambar 3.2: Tampilan form rekayasa Kalkulator.
Modul III – Exceptions
3-38
Tugas 3.2 Rekayasalah Kalkulator sehingga bisa melakukan operasi pemangkatan bilangan nyata dan operasi-operasi trigonometri.
Tugas 3.3 Tambahkan beberapa komponen dan event-handler pada Kalkulator, sehingga mampu bekerja pada bilangan kompleks.
Kemudian jalankan program tersebut. Hasil dari eksekusi aplikasi tersebut salah satunya seperti pada gambar 3.3. Gambar 3.3: Salah satu kemungkinan hasil eksekusi Kalkulator.
Modul IV – VCL Standar dan Timer
Modul
4
6.
TCheckBox, yaitu komponen untuk menyatakan aktif atau tidaknya sebuah pilihan (options). Bentuknya kotak yang di dalamnya terdapat sebuah tanda silang yang menandakan bahwa pilihannya aktif. Bila diklik, maka tanda silangnya bisa muncul atau hilang, yang menandakan keaktifannya.
7.
TRadioButton, yaitu komponen yang sama seperti TCheckBox, hanya saja bila terdapat lebih dari satu TRadioGroup dalam satu grup, maka hanya satu dari banyak TRadioButton yang dapat aktif. Bentuknya bulat dengan bulatan hitam di dalamnya yang menandakan keaktifannya.
8.
TListBox, yaitu komponen yang hampir sama dengan TMemo, hanya saja isinya tidak dapat diubah oleh pemakai, dan hanya bisa dipilih per baris. Properti ItemIndex menyatakan item yang sedang terpilih.
9.
TComboBox, merupakan komponen gabungan TEdit dan TListBox. Isi dari TComboBox (yang sama seperti TEdit) dapat diubah oleh pemakai, tetapi bila tanda drop-down di sebelah kanannya diklik maka akan muncul listbox yang berupa drop-down.
VCL Standar dan Timer
D
alam praktikum ini akan dibahas beberapa komponen yang sering dipakai pada tab Standard. Sebuah aplikasi Windows sederhana umumnya dikembangkan dengan memakai komponen-komponen standar tersebut. Berikut ini komponen pada tab standard yang sering dipakai: 1.
TMainMenu dan TPopupMenu, yaitu komponen yang merepresentasikan menu utama dan menu popup. Menu utama adalah menu yang muncul pada bagian atas sebuah form, tepat di bawah title bar. Sedangkan menu popup adalah menu yang muncul bila pemakai melakukan klik kanan pada sebuah kontrol.
2.
TLabel, yaitu komponen untuk menampilkan tulisan pada form.
3.
TEdit, yaitu komponen berbentuk kotak untuk menerima masukan dari pemakai. Pada beberapa pemrograman visual sering disebut dengan Edit Box.
4.
TMemo, yaitu komponen seperti TEdit, tetapi bisa menerima masukan lebih dari satu baris. Properti Lines menunjukkan string-list yang berisi baris-baris string yang terdapat pada TMemo.
5.
TButton, yaitu komponen berbentuk tombol, yang bisa menampilkan tulisan dan bisa diklik.
4-40
10. TGroupBox dan TPanel, yaitu komponen yang bersifat sebagai kontainer untuk komponen lainnya. 11. TRadioGroup, yaitu komponen seperti TGroupBox yang berisi komponen TRadioButton yang dapat dikontrol secara terpusat. Selain komponen-komponen standar yang paling sering dipakai di atas, masih ada satu komponen lagi yang sering dipakai di luar komponen database dan additional, khususnya untuk melakukan suatu proses yang berulang-ulang dengan sela waktu tertentu tanpa harus mengganggu proses lainnya. Komponen tersebut adalah komponen TTimer, yaitu sebuah komponen yang akan menghasilkan event OnTimer setiap selang waktu tertentu yang ditentukan pemrogram melalui properti Interval. Properti Interval ini bertipe Cardinal dan menyatakan selang waktu dalam milidetik.
Modul IV – VCL Standar dan Timer
4-41
Contoh Aplikasi
B
erikut ini akan diberikan sebuah contoh program yang akan menggunakan beberapa komponen standar tersebut. Beberapa dari komponen yang akan dibahas sudah pernah diberikan pada praktikum sebelumnya. Oleh karena itu hanya yang belum dipakai yang akan dijelaskan secara lebih rinci. Pertama, buat form seperti pada gambar 4.1. Beri nama form tersebut menjadi MainForm.
Gambar 4.1: Perancangan form ProjectKetiga.
Berilah nama pada ketiga TEdit pertama mulai dari atas masing-masing EditNama, EditAlamat, dan EditTempatLahir. Tiga komponen tepat di bawah EditTempatLahir adalah TComboBox. Dari kiri ke kanan, masing-masing berilah nama ComboBoxTanggal, ComboBoxBulan, dan ComboBoxTahun. Isilah properti Items dari ComboBoxTanggal dengan tulisan 1 sampai 31, yang masing-masing dipisahkan oleh Enter (seperti pada gambar 4.2). Kemudian isilah properti Items dari ComboBoxBulan dengan nama-nama bulan mulai dari Januari hingga Desember. Setelah itu, isilah properti Items dari ComboBoxTahun dengan tahun mulai 1970 hingga 2002. Berilah nama dua komponen TButton di bawah ketiga TComboBox tersebut dengan nama ButtonResetEditor dan ButtonTampilkan.
Modul IV – VCL Standar dan Timer
4-42
Kemudian, beri nama komponen TMemo yang terdapat dalam sebuah TPanel di sebelah kanan dengan nama MemoTampil. Kemudian jangan lupa mengubah properti ScrollBars dari MemoTampil menjadi ssBoth. Kosongilah properti Lines-nya, dan ubah properti ReadOnly menjadi True. Gambar 4.2: String-list Editor yang muncul ketika mengisi properti Items dari TListBox atau TComboBox, atau properti Lines dari TMemo.
Berilah nama TPanel yang berada di sebelah kiri bawah dari MainForm dengan nama PanelWaktu, dan TButton di sebelah kanannya dengan nama ButtonHapusMemo. Terakhir, berilah nama komponen TTimer yang berada di sudut kanan atas dengan nama TimerWaktu, dan ubah properti Interval menjadi 100, serta properti Enabled menjadi True. Tujuan dari aplikasi ini adalah menampilkan nama, alamat, tempat lahir, dan usia (terhitung mulai tanggal lahir hingga saat ini) pada MemoTampil bila ButtonTampil diklik. Tetapi tanggal lahir harus divalidasi terlebih dahulu. Bila tidak valid akan menampilkan pesan kesalahan. Begitu pula bila data tidak lengkap, semisal nama, alamat, atau tempat lahir kosong. Kemudian bila ButtonResetEditor diklik akan mengosongkan isi dari ketiga TEdit sekaligus membuat tanggal lahir menjadi 1 Januari 1970. Bila ButtonHapusMemo diklik akan mengakibatkan isi MemoTampil terhapus. PanelWaktu akan menampilkan waktu saat ini, termasuk tanggalnya.
Modul IV – VCL Standar dan Timer
4-43
Langkah pertama adalah membuat fungsi validasi untuk tanggal. Semisal, jangan sampai tanggal menunjukkan tanggal 31 Pebruari, dan juga harus diperhitungkan tahun kabisat. Buatlah sebuah deklarasi field FTanggal yang bertipe TDateTime dan deklarasi fungsi yang berada pada bagian private dari tipe kelas TMainForm yang bernama TanggalSah yang bertipe Boolean, seperti pada contoh berikut: ... type TMainForm = class(TForm) Panel1: TPanel; PanelWaktu: TPanel; Label1: TLabel; EditNama: TEdit; Label2: TLabel; EditAlamat: TEdit; Label3: TLabel; EditTempatLahir: TEdit; Label4: TLabel; ComboBoxTanggal: TComboBox; ComboBoxBulan: TComboBox; ComboBoxTahun: TComboBox; ButtonTampilkan: TButton; Panel3: TPanel; MemoTampil: TMemo; ButtonResetEditor: TButton; Label5: TLabel; Label6: TLabel; ButtonHapusMemo: TButton; TimerWaktu: TTimer; private { Private declarations } FTanggal: TDateTime; function TanggalSah: Boolean; public { Public declarations } end; ... Perhatikan bahwa fungsi yang Anda ketikkan berada pada bagian private (kode yang digarisbawahi). Untuk menulis kodenya, setelah menulis deklarasi tersebut di atas dengan benar, te-
Modul IV – VCL Standar dan Timer
4-44
kan Shift+Ctrl+C. maka Anda akan dihadapkan pada implementasi fungsi tersebut seperti halnya pada gambar 4.3. Penekanan Shift+Ctrl+C tersebut yang menghasilkan implementasi metode merupakan fasilitas code completion dalam Delphi. Gambar 4.3: Code completion yang terjadi setelah ditekan Shift+Ctrl+C.
Setelah itu isilah implementasinya dengan kode sebagai berikut: function TMainForm.TanggalSah: Boolean; var Y, M, D: Word; begin Y := ComboBoxTahun.ItemIndex + 1970; M := ComboBoxBulan.ItemIndex + 1; D := ComboBoxTanggal.ItemIndex + 1; try FTanggal := EncodeDate(Y, M, D); Result := True; except MessageDlg('Tanggal masih belum sah.', mtError, [mbOK], 0); Result := False; ComboBoxTanggal.SetFocus; end; end;
Modul IV – VCL Standar dan Timer
4-45
Dengan cara yang sama, deklarasikan dan implementasikan pada bagian private, sebuah fungsi untuk mengetahui usia dengan nama GetUsia yang bertipe Integer. Berikut ini contoh deklarasi dan implementasinya: ... private { Private declarations } FTanggal: TDateTime; function TanggalSah: Boolean; function GetUsia: Integer; public { Public declarations } end; ... function TMainForm.GetUsia: Integer; begin Result := Round((Now - FTanggal) / 365.25); end; Langkah berikutnya adalah memberikan event-handler untuk event OnClick pada ButtonResetEditor: procedure TMainForm.ButtonResetEditorClick( Sender: TObject); begin EditNama.Clear; EditAlamat.Clear; EditTempatLahir.Clear; ComboBoxTanggal.ItemIndex := 0; ComboBoxBulan.ItemIndex := 0; ComboBoxTahun.ItemIndex := 0; end; Kemudian event-handler untuk event OnClick pada ButtonTampilkan, event OnClick dari ButtonHapusMemo, dan event OnTimer dari TimerWaktu: procedure TMainForm.ButtonTampilkanClick( Sender: TObject); begin if (EditNama.Text = '') or
Modul IV – VCL Standar dan Timer
4-46
(EditAlamat.Text = '') or (EditTempatLahir.Text = '') then begin MessageDlg('Nama, alamat, atau tempat lahir ' + 'tidak boleh kosong.', mtError, [mbOK], 0); EditNama.SetFocus; Exit; end; if not TanggalSah then Exit; MemoTampil.Lines.Clear; MemoTampil.Lines.Add('Nama saya ' + EditNama.Text); MemoTampil.Lines.Add('Saya tinggal di ' + EditAlamat.Text); MemoTampil.Lines.Add('Saya lahir di ' + EditTempatLahir.Text); MemoTampil.Lines.Add('Dan usia saya adalah ' + IntToStr(GetUsia) + ' tahun.'); end; procedure TMainForm.ButtonHapusMemoClick( Sender: TObject); begin MemoTampil.Lines.Clear; end; procedure TMainForm.TimerWaktuTimer(Sender: TObject); begin PanelWaktu.Caption := FormatDateTime('d mmmm yyyy"," h:nn:ss', Now); end; Simpan unit dengan nama MainUnit dan project-nya dengan nama ProjectKetiga. Jalankan dan amati hasilnya.
Modul IV – VCL Standar dan Timer
4-47
Tugas Aplikasi Tugas 4.1 Buatlah sebuah aplikasi untuk menampilkan dua macam timer, yaitu timer biasa (menghitung maju, stopwatch) dan timer mundur (menghitung mundur, count-down timer). Khusus count-down timer tersebut harus bisa diatur selang waktunya, misalkan satu menit, atau dua puluh detik, dan sebagainya. Tampilannya bebas, tetapi sebagai gambaran dapat memakai tampilan seperti pada gambar 4.4. Berilah nama project Anda tersebut dengan nama ProjectTimer. Gambar 4.4: Gambaran tampilan untuk program ProjectTimer.
Tugas 4.2 Buatlah project yang serupa dengan ProjectTimer, namun bisa menampilkan tiga bagian sekaligus, yaitu:
Waktu saat ini.
Timer maju.
Modul IV – VCL Standar dan Timer
4-48
Count-down timer. Simpan dengan nama ProjectMultiTimer.
Tugas 4.3 Buatlah project untuk menampilkan stopwatch, dengan fasilitas lap-time yang bisa tercetak pada sebuah TListBox dan bisa disimpan datanya untuk ditampilkan lagi kemudian. Simpan dengan nama ProjectLap.
Modul V – Koneksi Database menggunakan ADO
Modul
5
Gambar 5.1: Struktur database yang akan digunakan pada kasus ini.
Nilai NoNilai (AutoNumber) NRP (Text, 8) KodeMK (Text, 6) Tugas (Number, Double) UTS (Number, Double) UAS (Number, Double)
U
ntuk melakukan akses database, Delphi memiliki beberapa cara. Borland Delphi 16-bit masih menggunakan BDE (Borland Database Engine). Sedangkan pengembang Borland Delphi versi 32-bit sudah memikirkan koneksi dengan beragam teknologi. Ada koneksi dengan menggunakan InterBase, dbExpress, dan ADO (ActiveX Data Object).
Dalam kasus ini, akan dicoba untuk membuat sebuah database dengan tiga tabel dan hubungannya seperti pada gambar 5.1, kemudian dibuat aplikasinya. Database tersebut akan dinamakan DatabaseContoh.mdb, sedangkan alias koneksinya akan dinamakan DBContohPrak5 (atau DBContohPrak5.dsn kalau menggunakan berkas DSN).
Mahasiswa NRP (Text, 8) Nama (Text, 20) Alamat (Text, 30) JenisKelamin (Yes/No) TempatLahir (Text, 15) TanggalLahir (Date/Time) MataKuliah KodeMK (Text, 6) Nama (Text, 15) SKS (Number, Long Integer)
Koneksi Database menggunakan ADO
ADO merupakan teknologi Microsoft, sehingga sewaktu menggunakannya, tidak diperlukan lagi instalasi driver yang diperlukan, karena sudah otomatis ada ketika Microsoft Windows diinstal. Karena itulah akan digunakan teknologi koneksi database dengan menggunakan ADO dan mesin database-nya menggunakan Microsoft Access.
5-50
Arsitektur Database pada Delphi menggunakan ADO
A
rsitektur database pada Delphi yang menggunakan ADO sangat sederhana dan mudah diterapkan. ADO merupakan sebuah objek yang melakukan koneksi ke semua jenis database, dengan menggunakan data source yang didefinisikan oleh ODBC (Open Database Connectivity).
Modul V – Koneksi Database menggunakan ADO
Modul V – Koneksi Database menggunakan ADO
5-52
Setelah itu akan muncul sebuah Database window dengan judul DatabaseContoh.
Aplikasi Delphi
Datasets (ADO)
Data Sources
Data Controls
Gambar 5.2: Gambaran arsitektur koneksi database dengan mengunakan ADO.
5-51
Gambar 5.3: Jendela utama pada Microsoft Access.
ODBC
Database Server
Microsoft Access
D
alam praktikum ini, digunakan Microsoft Access untuk membuat database. Di dalam database tersebut akan dibuat tabel-tabel yang diperlukan serta akan didefinisikan hubungan antar tabel tersebut (relationship).
Untuk itu, jalankan Microsoft Access terlebih dahulu. Setelah itu, bila database belum ada, maka buatlah database baru dengan memilih Blank Database (bila menggunakan wizard), atau pilih File|New Database (bila menggunakan menu utama). Simpan database tersebut dengan nama tertentu pada lokasi tertentu pula. Disarankan untuk menyimpannya pada folder di mana project Delphi yang dibuat akan diletakkan.
Membuat Tabel Pada saat muncul window utama, klik pada tombol New, kemudian pilih Design View. Segera akan muncul sebuah Table window. Window ini terbagi dalam dua bagian, bagian atas untuk mendefinisikan nama-nama medan (field names) dan tipe datanya (data types) dan bagian bawah untuk mendefinisikan rincian lebih lengkap dari tipe data tersebut.
Modul V – Koneksi Database menggunakan ADO
5-53
Gambar 5.4: Table Window pada Microsoft Access.
Modul V – Koneksi Database menggunakan ADO
5-54
apakah akan disimpan atau tidak, dan bila ya akan ditanyakan namanya). Ulangi langkah tersebut untuk tabel-tabel lainnya.
Mendefinisikan Hubungan Untuk mendefinisikan hubungan antar tabel (relationship) dapat dilakukan dengan memilih menu Tools|Relationship. Bila hubungan belum didefinisikan, maka akan muncul Show Table window. Pilih semuanya dan klik Add (ingat untuk tidak melakukan klik ganda dan tidak melakukan klik pada Add lebih dari sekali, karena akan membuat tabel sama yang ditampilkan lebih dari sekali. Gambar 5.5: Jendela Relationships.
Isilah nama-nama medan dan tipe datanya seperti pada gambar 5.4 (sesuai dengan strukturnya pada gambar 5.1). Pada jendela bagian bawah, setiap kali baris di window atas dipilih, akan muncul rincian dari tipe data yang ada. Field Size menunjukkan ukuran dari tipe data (akan muncul pilihan jenis-jenis sub tipe data pada tipe data Number). Required menunjukkan apakah medan tersebut harus diisi atau tidak. Allow Zero Length menunjukkan apakah diperbolehkan mengisi medan dengan panjang nol atau tidak. Indexed menunjukkan jenis indeks yang akan diimplementasikan pada medan tersebut. Jangan lupa untuk mendefinisikan kunci utama (primary key) untuk tabel tersebut. Kunci utama adalah kunci yang digunakan untuk menyatakan keunikan dari setiap rekaman pada sebuah tabel. Untuk mendefinisikannya, klik pada medan yang teratas (medan NRP pada gambar 5.4) dan bila tanda kunci di samping kiri belum muncul, carilah tombol toolbar yang bergambar kunci dan klik pada tombol tersebut. Setelah selesai, simpanlah tabel tersebut sesuai dengan namanya pada gambar 5.1 (bila diklik Close, akan ditanyakan
Definisikan hubungan dengan melakukan drag-drop dari satu medan pada sebuah tabel ke medan pada tabel lainnya yang berhubungan. Bila muncul dialog Edit Relationships, maka akan terdapat tiga pilihan.
Modul V – Koneksi Database menggunakan ADO
5-55
Gambar 5.6: Dialog Edit Relationships.
Modul V – Koneksi Database menggunakan ADO
5-56
Gambar 5.7: Relationship pada tabel-tabel DatabaseContoh.
1.
Enforce Referential Integrity, menunjukkan pemaksaan keutuhan hubungan, sehingga apapun yang terjadi pada waktu pengisian, penyuntingan, ataupun penghapusan data yang melibatkan medan-medan yang berhubungan, tidak akan merusak hubungan tersebut.
2.
Cascade Update Related Fields, merupakan sebuah metode untuk mempertahankan keutuhan dengan cara mengubah semua data pada medan transaksi yang berhubungan bila medan master diubah.
3.
Cascade Delete Related Records, merupakan sebuah metode untuk mempertahankan keutuhan dengan cara menghapus semua rekaman transaksi bila rekaman master dihapus dan yang dihapus merupakan medanmedan yang berhubungan.
Dalam kasus ini, aktifkan Enforce Referential Integrity dan Cascade Update Related Fields. Kemudian klik Create. Ulangi untuk hubungan lainnya.
Open Database Connectivity
O
DBC adalah singkatan dari Open Database Connectivity, yang berarti koneksi database terbuka. Maksudnya terbuka adalah kemampuannya untuk koneksi pada segala jenis database, dengan syarat tersedia driver yang diperlukan.
Bukalah ODBC dengan cara membuka Control Panel dan membuka ODBC Data Source (membuka Control Panel|Administrative Tools|Data Sources (ODBC) pada Windows XP). Akan muncul ODBC Data Source Administrator window. Pada window tersebut ada berbagai halaman, tapi yang akan digunakan hanyalah User DSN dan File DSN.
Modul V – Koneksi Database menggunakan ADO
5-57
Gambar 5.8: ODBC Data Source Administrator window.
Membuat Data Source Untuk membuat data source—lebih tepat kalau disebut “alias”— yang menghubungkan aplikasi dengan database, pilih tab User DSN. Kemudian bila pada User Data Sources window nama alias database yang dimaksud belum ada, maka klik Add.
Modul V – Koneksi Database menggunakan ADO
5-58
Gambar 5.9: Dialog Create New Data Source.
Setelah itu akan muncul dialog Create New Data Source, dan pilih driver yang diinginkan (karena kita memakai Microsoft Access, maka pilih Microsoft Access Driver (*.mdb) dan klik Finish. Kemudian akan muncul dialog ODBC Microsoft Access Setup, dan isilah Data Source Name dengan nama aliasnya (dalam kasus ini, DBContohPrak5). Klik Select, dan isilah dengan database yang telah disimpan tadi (dalam kasus ini DatabaseContoh.mdb). Jika telah selesai mendefinisikan database tersebut, maka di atas tombol Select akan tertera nama database yang telah didefinisikan tersebut. Klik OK, maka nama “alias” telah ditambahkan pada User DSN.
Modul V – Koneksi Database menggunakan ADO
5-59
Gambar 5.10: Dialog ODBC Microsoft Access Setup.
Modul V – Koneksi Database menggunakan ADO
5-60
Gambar 5.11: Tampilan tab File DSN.
Membuat Berkas DSN Cara lainnya adalah dengan membuat berkas DSN, yaitu sebuah berkas yang berisi definisi koneksi dengan database. Cara ini sedikit lebih rumit, tetapi dengan adanya berkas DSN, maka bila menyalin aplikasi database ke komputer lain tidak perlu melakukan konfigurasi ulang pada ODBC, namun cukup dengan menyertakan berkas ini.
Untuk membuat berkas DSN, klik tab File DSN, kemudian klik Add. Setelah itu akan muncul dialog Create New Data Source. Seperti halnya yang tadi, pilih pada Microsoft Access Driver (*.mdb), kemudian klik Next. Setelah itu akan muncul sebuah editbox, isilah dengan nama berkas DSN yang akan disimpan (dalam kasus ini, DBContohPrak5.dsn) lengkap dengan jejak folder-nya. Klik Browse untuk membantu menentukan nama berkas dan tempatnya. Klik Next dan bila ditampilkan informasi nama berkas dan driver-nya, klik Finish.
Modul V – Koneksi Database menggunakan ADO
5-61
Gambar 5.12: Tampilan dialog Create New Data Source.
Modul V – Koneksi Database menggunakan ADO
5-62
TADOConnection Komponen TADOConnection merupakan komponen yang bertugas melakukan koneksi dengan bantuan perantara. Perantara bisa berupa ODBC Data Source atau DSN File. Untuk mengaktifkan koneksinya dapat dilakukan dengan mengganti properti Connected menjadi True, tetapi properti ConnectionString harus didefinisikan dulu.
ConnectionString Properti ini digunakan untuk mendefinisikan koneksi dengan perantara. Properti ini bisa diisi langsung atau menggunakan step-by-step wizard. Klik pada tanda tiga titik di kanan untuk membuka wizard.
Kemudian akan muncul dialog ODBC Microsoft Access Setup, seperti pada gambar 5.10, namun bagian editbox di atas (bagian Data Source Name dan Description) tidak dapat diisi. Klik Select, dan isilah dengan database yang telah disimpan tadi (dalam kasus ini DatabaseContoh.mdb). Jika telah selesai mendefinisikan database tersebut, maka di atas tombol Select akan tertera nama database yang telah didefinisikan tersebut. Klik OK, maka berkas DSN tadi telah disimpan pada tempat yang telah ditentukan.
Datasets (Koneksi ADO)
C
oba jalankan Delphi, dan buatlah sebuah project baru. Kemudian lihat pada tab ADO. Di sana terdapat beberapa komponen yang disebut dengan datasets. Datasets merupakan komponen yang bertugas melakukan koneksi dengan database dan tabel-tabel fisik melalui perantara. Dalam kasus ini, perantara yang dipakai adalah ODBC. Sedangkan teknologi datasets yang dipakai adalah teknologi ADO (ActiveX Data Object).
Gambar 5.13: Tampilan dialog ConnectionString.
Bila menggunakan berkas DSN, gunakan Use Data Link File dan klik Browse untuk mempermudah pencarian. Isi dengan berkas yang telah dibuat tadi (DBContohPrak5.dsn). Namun bila menggunakan “alias”, gunakan Use Connection String, dan klik Build.
Modul V – Koneksi Database menggunakan ADO
5-63
Gambar 5.14: Tampilan dialog Data Link Properties, tab Provider.
Setelah itu akan muncul dialog Data Link Properties. Pada tab Provider, pilih Microsoft OLE DB Provider for ODBC Drivers, kemudian klik Next.
Modul V – Koneksi Database menggunakan ADO
5-64
Gambar 5.15: Tampilan dialog Data Link Properties, tab Connection.
Pilih Use data source name, dan pilih pada DBContohPrak5 setelah drop-down muncul. Klik OK. Pada dialog sebelumnya, klik OK pula. Setelah itu maka properti Connected bisa diubah menjadi True untuk memulai koneksinya.
LoginPrompt Properti LoginPrompt digunakan untuk menampilkan kotak dialog untuk login ke database, yang bertujuan mengisikan Username dan Password. Bila properti ini bernilai True, maka dialog Login Prompt akan muncul. Bila bernilai False, maka dialog tersebut tidak muncul. Sebagai gantinya, bila pada database yang dikoneksi
Modul V – Koneksi Database menggunakan ADO
5-65
dilindungi dengan Username dan Password, maka untuk memulai koneksi harus dilakukan dengan memanggil metode Open yang memiliki parameter UserID dan Password.
TADOTable TADOTable merupakan komponen untuk mewakili tabel fisik dari database. Properti Active dapat diubah menjadi True untuk mengkoneksikan tabel, tetapi sebelumnya properti Connection dan TableName harus didefinisikan dulu.
Connection
Modul V – Koneksi Database menggunakan ADO
5-66
Connection Properti Connection mendefinisikan koneksi dengan TADOConnection, dan harus berupa komponen TADOConnection. Disarankan untuk mengisi properti ini, bukannya mengisi properti ConnectionString, untuk membuat proses koneksi semua query dalam sebuah aplikasi menjadi terpusat.
SQL Properti ini bertipe TStrings dan berisi baris-baris kalimat yang digunakan untuk melakukan query pada database server.
Properti Connection mendefinisikan koneksi dengan TADOConnection, dan harus berupa komponen TADOConnection. Disarankan untuk mengisi properti ini, bukannya mengisi properti ConnectionString, untuk membuat proses koneksi semua tabel dalam sebuah aplikasi menjadi terpusat.
Parameters
TableName
Properti ini digunakan untuk mengaktifkan query. Mengaktifkan query juga bisa dilakukan dengan metode Open atau ExecSQL.
Properti ini baru dapat diisi bila properti Connection sudah terdefinisi dan properti Connected pada TADOConnection yang disambung sudah bernilai True. Properti ini menunjukkan nama tabel secara fisik (misalkan: Mahasiswa, Mata Kuliah, atau Nilai).
Active Properti ini digunakan untuk mengaktifkan tabel. Mengaktifkan tabel juga bisa dilakukan dengan metode Open.
TADOQuery TADOQuery merupakan komponen yang mewakili sebuah query. Query adalah pertanyaan yang diajukan pada database server dan bisa menghasilkan jawaban atau mengubah tabel.
Properti ini mendefinisikan parameter yang diisikan dalam properti SQL.
Active
Data Sources
S
eperti yang telah dijelaskan tentang arsitektur database pada gambar 5.2, data sources adalah sumber data yang bertugas sebagai perantara internal dalam aplikasi antara datasets dengan data controls. Pada Delphi, data sources bisa didapatkan pada tab Data Access.
TDataSource Komponen TDataSource merupakan komponen yang mewujudkan perantara intarnal antara datasets dengan data controls.
Modul V – Koneksi Database menggunakan ADO
5-67
DataSet Properti DataSet merupakan properti yang digunakan untuk menyatakan dataset yang ditunjuk. Dalam kasus ini, buatlah sedemikian rupa sehingga setiap komponen TADOTable berhubungan dengan satu komponen TDataSource. Ubahlah properti DataSet dari tiap TDataSource menjadi masing-masing TADOTable yang sudah ada.
Data Controls
S
edangkan data controls merupakan komponen-komponen yang berfungsi sebagai antarmuka dengan pemakai. Pada komponen-komponen inilah pemakai berinteraksi dengan database. Pemakai bisa melihat data yang ada, menambahkan, mengganti, atau menghapusnya.
Pada Delphi, komponen-komponen ini disebut juga dengan komponen data-aware, dan bisa didapatkan pada tab Data Controls. Berikut akan dibahas yang sering digunakan, beserta properti utamanya.
DataSource Properti DataSource dimiliki oleh semua data controls. Properti ini menunjukkan hubungan dengan data source dan harus bertipe TDataSource.
DataField Properti DataField dimiliki oleh data controls yang menampilkan atau merekayasa hanya satu medan. Properti ini menunjukkan nama medan mana yang akan ditampilkan atau direkayasa oleh data controls. Properti ini baru bisa didefinisikan setelah properti DataSource didefinisikan. Properti ini bertipe string.
Modul V – Koneksi Database menggunakan ADO
5-68
TDBGrid Komponen ini merupakan komponen yang bertugas menampilkan data source berbentuk tabel. Karena semua medan juga akan tampil dalam satu waktu, maka komponen TDBGrid tidak memiliki properti DataField.
TDBNavigator Komponen ini mem-visual-kan tombol-tombol yang digunakan untuk merekayasa data source, seperti menuju rekaman pertama, sebelumnya, setelahnya, terakhir, menambahkan data, menyunting data, menghapus data, menyimpan, membatalkan, dan menyegarkan tampilan data. Karena TDBNavigator tidak merekayasa medan tertentu (tapi semua medan), maka komponen ini tidak memiliki properti DataField.
TDBText Komponen ini merupakan komponen untuk mem-visual-kan tampilan dari sebuah medan. Karena TDBText menampilkan hanya medan tertentu, maka komponen ini memiliki properti DataField.
TDBEdit Komponen ini merupakan komponen untuk mem-visual-kan tampilan dari sebuah medan sekaligus sebagai tempat untuk mengubah data pada medan tersebut—sebagai masukan dari pemakai. Karena TDBEdit menampilkan dan merekayasa hanya medan tertentu, maka komponen ini memiliki properti DataField.
Contoh Aplikasi
L
anjutkan aplikasi yang telah dibuat dengan menyertakan tiga tabel seperti pada struktur gambar 5.1. Buatlah sedemi-
Modul V – Koneksi Database menggunakan ADO
5-69
kian sehingga ketiga tabel tersebut masing-masing divisualisasikan dengan menggunakan TDBGrid. Berilah nama (properti Name) pada tiap-tiap komponen TADOTable masing-masing TableMahasiswa untuk koneksi tabel mahasiswa, TableMK untuk koneksi tabel mata kuliah, dan TableNilai untuk koneksi tabel nilai. Kemudian berilah nama pada tiap-tiap komponen TDataSource masing-masing DSMahasiswa untuk data source tabel mahasiswa, DSMK untuk data source tabel mata kuliah, dan DSNilai untuk data source tabel nilai. Selain itu, tiap tabel juga bisa direkayasa menggunakan TDBNavigator, yang diletakkan di bawah setiap TDBGrid seperti pada gambar 5.16. Gambar 5.16: Contoh aplikasi praktikum 5.
Modul V – Koneksi Database menggunakan ADO
Tugas Aplikasi Tugas 5.1 Buatlah sebuah project seperti pada ProjectKelima, tapi dengan definisi database seperti gambar 5.17, dan juga menggunakan komponen TDBEdit. Berilah nama project tersebut dengan nama ProjectBus.
Gambar 5.17: Definisi database untuk tugas.
Bus NoLambung (AutoNumber) NoPol (Text, 10) Kapasitas (Number, Long Integer) NoTrayek (Number, Long Integer) Trayek NoTrayek (AutoNumber) Jurusan (Text, 30) Jarak (Number, Double) Tarip (Number, Double) Perjalanan NoPerjalanan (AutoNumber) NoLambung (Number, Long Integer) Tanggal (Date/Time)
Untuk membuat projek ini tak satupun baris kode program yang diperlukan untuk diketik. Simpan unit tersebut dengan nama MainUnit dan project tersebut dengan nama ProjectKelima. Jalankan dan cobalah untuk melakukan rekayasa data.
5-70
Tiket NoTiket (AutoNumber) NoPerjalanan (Number, Long Integer) NoKursi (Number, Long Integer)
Modul VI – Medan-medan Semu dan Pengesahan Data
Modul
6 Medan-medan Semu dan Pengesahan Data
D
i samping medan-medan yang telah didefinisikan dalam tabel database fisik, dalam aplikasi Delphi masih dapat didefinisikan medan-medan buatan sendiri yang bersifat semu (virtual).
Sebagai contoh dari ProjectKelima pada modul 5, tampilan untuk nama dan alamat mahasiswa dapat disertakan pada tampilan tabel Nilai, sehingga dengan hanya melihat tabel Nilai dapat diketahui nama mahasiswanya, begitu pula bila ingin melihat nama mata kuliah pada tabel Nilai. Selain itu, pemasukan data pada tabel juga bisa diatur sedemikian rupa sehingga pada waktu pemakai menyimpan perubahannya, bila terdapat ketidaksahihan data, maka secara otomatis data tersebut dicegah agar tidak disimpan. Dalam kasus ini, bukalah kembali project ProjectKelima.
Jenis-jenis Medan dalam Datasets
B
erkaitan dengan informasi yang perlu dan tidak perlu ditampilkan pada sebuah tabel, maka tiap medan tabel fisik bisa dibuat sebagai komponen sewaktu merancang aplikasi. Selain itu, dalam Delphi juga dimungkinkan penambahan beberapa medan semu.
6-72
Medan Data (Data Fields) Medan data (data fields) merupakan medan seperti halnya medan-medan pada tabel database secara fisik.
Medan Pengunjung (Lookup Fields) Medan pengunjung (lookup fields) merupakan medan semu yang tidak hadir dalam tabel database secara fisik. Namun medan ini hanya hadir sebagai tampilan pada data set. Medan ini menampilkan medan dari tabel lainnya yang memiliki hubungan dengan tabel asal, dan menggunakan kunci utama dari tabel yang akan dibaca yang berhubungan dengan kunci asing dari tabel asal.
Medan Terhitung (Calculated Fields) Medan terhitung (calculated fields) merupakan medan semu seperti halnya medan pengunjung. Hanya saja tampilan pada medan ini tidak langsung ada, tapi ditampilkan dengan cara dihitung setiap kali sebuah rekaman akan ditampilkan.
Fields Editor Untuk membuat medan-medan menjadi komponen—termasuk membuat medan-medan semu—maka pada Delphi terdapat fasilitas yang disebut Fields Editor. Fasilitas ini bisa dijumpai pada komponen dataset umum seperti tabel dan query. Sebelum medan-medan tadi didefinisikan, maka TADOTable atau TADOQuery harus dalam keadaan aktif—properti Active diisi True. Kemudian klik kanan pada komponen TADOTable atau TADOQuery, lalu pilih Fields Editor. Akan muncul Fields Editor, yang pada keadaan awalnya kosong. Klik kanan dan pilih Add all fields, maka semua medan fisik akan menjadi komponen. Dalam kasus ini, lakukan hal tersebut untuk setiap TADOTable. Untuk membuat medan semu, sebelumnya nonaktifkan komponen TADOTable atau TADOQuery yang bersangkutan,
Modul VI – Medan-medan Semu dan Pengesahan Data
6-73
kemudian klik kanan pada Fields Editor, dan selanjutnya pilih New field. Maka akan muncul dialog New Field. Dalam hal ini, coba buka Fields Editor pada TableNilai, kemudian pada Fields Editor tersebut, klik kanan dan pilih New field. Gambar 6.1: Dialog New Field.
Modul VI – Medan-medan Semu dan Pengesahan Data
6-74
Pada bagian Lookup definition, isilah Key Fields dengan NRP, sebagai kunci untuk mencari pada tabel yang dikunjungi. Kemudian Dataset diisi dengan TableMahasiswa, sebagai tabel yang dikunjungi. Isilah Lookup keys dengan NRP, sebagai kunci penghubung pada tabel yang dikunjungi. Terakhir, isilah Result field dengan Nama, sebagai medan yang akan ditampilkan oleh medan semu NamaMahasiswa. Klik OK. Nama komponen medan semu tersebut akan didefinisikan sebagai TableNilaiNamaMahasiswa. Contoh kedua adalah menambahkan medan semu untuk menampilkan nilai akhir bila diketahui nilai akhir adalah 20% dari nilai tugas ditambah dengan 30% dari nilai UTS ditambah 50% dari nilai UAS. Dalam kasus ini, anggap nama medan tersebut adalah NilaiAkhir. Pada Fields Editor, pilih New field dan isilah seperti pada gambar 6.3.
Pada Field properties, isilah bagian Name dengan nama NamaMahasiswa, bagian Type dengan String, dan bagian Size dengan 20. Bagian Component akan terisi secara otomatis oleh Delphi dan disarankan untuk tidak mengubah nilainya. Pada bagian Field type, pilih Lookup.
Gambar 6.3: New Field pada kasus TableNilai, untuk menampilkan medan NilaiAkhir.
Gambar 6.2: New Field pada kasus TableNilai.
Selanjutnya klik OK. Nama komponen medan semu tersebut akan menjadi TableNilaiNilaiAkhir. Untuk menampilkan hasilnya ikuti sub bab berikutnya.
Modul VI – Medan-medan Semu dan Pengesahan Data
6-75
Menghitung Medan Terhitung
M
edan-medan terhitung tidak dapat ditampilkan pada waktu perancangan. Ini dikarenakan nilai medan-medan ini memang tidak disediakan baik oleh tabel asal maupun tabel lainnya, namun hanya bisa didapatkan dengan cara coding.
Untuk itu, pilih kembali komponen TableNilai, dan carilah event yang bernama OnCalcFields.
OnCalcFields Event ini akan terjadi bila dataset akan melakukan penghitungan pada medan-medannya. Pada event inilah nilai apa yang diberikan kepada sebuah medan semu terhitung akan dihitung. Dalam kasus ini, karena:
NilaiAkhir 20% Tugas 30% UTS 50% UAS maka isi event-handler ini adalah sebagai berikut: procedure TForm1.TableNilaiCalcFields(DataSet: TDataSet); begin TableNilaiNilaiAkhir.AsFloat := 0.2 * TableNilaiTugas.AsFloat + 0.3 * TableNilaiUTS.AsFloat + 0.5 * TableNilaiUAS.AsFloat; end;
Rekayasa Tampilan Medan
U
ntuk membuat pemakai lebih “nyaman” memakai aplikasi yang dikembangkan, beberapa aspek penting tampilan medan dapat direkayasa. Untuk itu, ubahlah beberapa properti yang dimiliki oleh komponen yang merupakan turunan dari kelas TField seperti dijelaskan di bawah ini.
Modul VI – Medan-medan Semu dan Pengesahan Data
6-76
DisplayLabel Properti ini mewakili label atau tulisan yang ditampilkan sebagai judul menggantikan nama medan fisik. Bila diganti akan mengubah tampilan judul pada TDBGrid.
DisplayFormat Properti ini dimiliki oleh komponen yang merupakan turunan dari kelas TAggregateField, TDateTimeField, TNumericField, dan TSQLTimeStampField. Properti ini digunakan untuk menampilkan hasil terformat, semisal untuk memformat bilangan, tanggal, atau jam. Acuan macam-macam penulisan format dapat dilihat pada help file yang dimiliki Delphi.
DisplayWidth Properti ini dimiliki oleh semua TField, dan mewakili lebar (jumlah) huruf yang akan ditampilkan tiap medan pada TDBGrid.
Visible Properti ini digunakan untuk menampilkan sebuah medan pada pemakai atau menyembunyikannya.
Pengesahan Data
S
elain hal tersebut di atas, pengesahan data dalam pemasukan data pada database merupakan hal yang sangat penting. Hal ini dikarenakan tidak semua data yang dimasukkan ke dalam rekaman merupakan data yang sah (valid). Ada beberapa hal yang menyebabkan ketidaksahihan data tersebut, di antaranya pengisian medan numerik yang melibatkan huruf, aturan-aturan yang membatasi pengisian medan (bussiness rules), dan kemungkinan kesalahan pemakai dalam memasukkan data.
Modul VI – Medan-medan Semu dan Pengesahan Data
6-77
BeforePost Event ini terjadi bila pemakai akan melakukan penyimpanan rekaman yang telah disisipkan atau diubah pada tabel secara fisik. Segala ketidaksahihan data bisa dideteksi di sini dan mencegah penyimpanan bila data yang diisikan dirasa tidah sah. Untuk membatalkan penyimpanan, panggilah prosedur Abort di dalam event-handler ini.
OnPostError Event ini terjadi bila aplikasi atau pemakai melakukan penyimpanan rekaman pada tabel tetapi terjadi exception. Hal yang sering terjadi adalah pelanggaran kunci utama atau medan yang diisikan tidak sesuai dengan yang diminta konfigurasi database. Gunakan event ini untuk menampilkan pesan kesalahan sendiri bila terjadi exception pada waktu melakukan penyimpanan pada tabel.
OnDeleteError Event ini terjadi bila aplikasi atau pemakai melakukan penghapusan rekaman pada tabel tetapi terjadi exception. Hal yang sering terjadi adalah data yang dihapus masih memiliki transaksi yang berhubungan pada tabel lain sesuai dengan konfigurasi hubungan (relationship). Gunakan event ini untuk menampilkan pesan kesalahan sendiri bila terjadi exception pada waktu melakukan penghapusan pada rekaman tabel.
Referensi Tambahan
A
da beberapa referensi tambahan, yang sangat berguna untuk diterapkan dalam beberapa persoalan. Misalkan bagaimana mengetahui berapa jumlah mahasiswa yang mengikuti mata kuliah dengan kode MK0001.
Modul VI – Medan-medan Semu dan Pengesahan Data
6-78
Cara yang paling sederhana adalah dengan melakukan pencarian satu persatu pada tabel nilai, kemudian menjumlahkan rekaman yang nilai medan KodeMK sama dengan MK0001. Komponen TADOTable menyediakan beberapa metode untuk melakukannya, beberapa di antaranya akan dijelaskan.
First, Prior, Next, dan Last Metode First digunakan untuk menggerakkan pilihan rekaman ke rekaman teratas, sedangkan metode Prior digunakan untuk menggerakkan pilihan rekaman ke rekaman sebelumnya. Metode Next digunakan untuk menggerakkan pilihan rekaman ke rekaman setelahnya, sedangkan metode Last digunakan untuk menggerakkan pilihan rekaman ke rekaman terakhir.
EnableControls dan DisableControls Metode EnableControls digunakan agar setiap kali posisi rekaman aktif digerakkan, maka data control yang berkaitan dengan dataset tersebut langsung menampilkan perubahannya. Untuk menonaktifkannya digunakan metode DisableControls, sehingga bila melakukan proses berulang pada tabel tidak akan membebani sistem. Perlu diketahui, setiap kali selesai melakukan proses berulang, jangan lupa untuk memanggil EnableControls agar tampilan pada data controls bisa dikembalikan seperti semula.
Eof dan Bof Properti Eof bernilai True hanya jika posisi rekaman aktif berada pada rekaman terakhir. Sedangkan properti Bof bernilai True hanya jika posisi rekaman aktif berada pada rekaman pertama.
RecordCount Properti RecordCount digunakan untuk mengetahui jumlah rekaman yang ada pada suatu tabel.
Modul VI – Medan-medan Semu dan Pengesahan Data
6-79
Modul VI – Medan-medan Semu dan Pengesahan Data
hir mahasiswa (bila dikurangkan, akan menghasilkan bilangan yang menunjukkan usia dalam satuan hari).
FieldByName Metode FieldByName merupakan sebuah metode untuk menunjukkan medan sesuai dengan namanya. Metode ini memiliki parameter berbentuk string yang mewakili nama medan fisiknya. Untuk lebih lengkapnya, dapat dilihat pada help file Delphi. Sedangkan berikut ini suatu fungsi untuk mengetahui jumlah mahasiswa yang mengikuti mata kuliah dengan kode MK0001. Sebelumnya, letakkan sebuah komponen TADOTable, namakan dengan TableSearchNilai, arahkan properti Connection ke ADOConnection1, dan isi properti TableName dengan Nilai. Kemudian aktifkan tabel tersebut dengan mengubah properti Active menjadi True. Hal ini dimaksudkan agar proses tidak mengganggu tabel nilai yang ditampilkan. Untuk komponen ini tidak diperlukan TDataSource. function JumlahMahasiswa(const KodeMK: string): Integer; begin Result := 0; TableSearchNilai.DisableControls; TableSearchNilai.First; while not TableSearchNilai.Eof do begin if TableSearchNilai. FieldByName('KodeMK').AsString = KodeMK then Result := Result + 1; TableSearchNilai.Next; end; TableSearchNilai.EnableControls; end;
Contoh Aplikasi
L
anjutkan ProjectKelima dan tambahkan beberapa medan semu pada TableNilai, di antaranya:
AlamatMahasiswa, mewakili alamat mahasiswa.
UmurMahasiswa, mewakili usia mahasiswa. Hitung dengan mengurangi waktu sekarang terhadap tanggal la-
6-80
NamaMataKuliah, mewakili nama mata kuliah.
SKS, mewakili jumlah SKS.
Bobot, mewakili jumlah SKS dikalikan NilaiAkhir.
Selain itu, formatlah TableMahasiswaJenisKelamin dengan tampilan “Laki-laki” atau “Perempuan”. Begitu pula dengan medan-medan lainnya yang dirasa perlu diformat. Ditambah lagi dengan memperbaiki tampilan judul medan sehingga nyaman dibaca pemakai. Jangan lupa untuk mencegah agar pengisian nilai tugas, UTS, maupun UAS tidak dilakukan sembarangan, tetapi dibatasi antara 0 hingga 100.
Modul VI – Medan-medan Semu dan Pengesahan Data
6-81
Modul
Tugas Aplikasi
7
Tugas 6.1 Dari soal 5.1, tentang ProjectBus, buatlah medan-medan semu seperlunya. Setelah itu, cegah agar tiap perjalanan untuk tiap bus tidak memakai tanggal yang sama. Kemudian, batasi agar penjualan tiket bus tidak melebihi kapasitas yang ada pada tiap bus tiap perjalanan, dan jangan sampai dalam tiap perjalanan menjual lebih dari satu tiket dengan nomor tempat duduk yang sama.
Hubungan Master-Detail dan Data Controls Tambahan
T
erkadang hubungan master-detail diperlukan, terutama dalam penampilan tabel yang saling berhubungan sebagai tabel master dan tabel rincian (tabel rincian umumnya disebut tabel item transaksi).
Dengan hubungan master-detail, maka untuk menghubungkan dua tabel (master dan rincian) dan merekayasanya tanpa mendefinisikan hubungan tersebut (oleh pemakai) akan dengan mudah dilakukan. Pemakai tidak perlu lagi mengubah medan penghubung pada kedua tabel tersebut, bahkan tidak perlu lagi “melihatnya”, karena medan-medan yang tidak perlu dipedulikan pemakai tersebut bisa disembunyikan.
Mendefinisikan Hubungan Master-Detail
U
ntuk mendefinisikan hubungan master-detail, pemrogram tidak perlu melakukan coding sedikitpun. Mendefinisikan hubungan ini hanya memerlukan dua komponen TADOTable (beserta dua TDataSource yang terhubung) yang mewakili dua tabel yang saling berhubungan. Misalnya, dalam kasus ProjectKelima, bila ingin mendefinisikan hubungan ini untuk tabel mahasiswa sebagai master dan tabel nilai sebagai rincian, maka setiap kali dipilih salah satu
Modul VII – Hubungan Master-Detail dan Data Controls Tambahan
7-83
rekaman pada tabel mahasiswa, maka nilai yang ditampilkan hanya untuk mahasiswa yang terpilih (karena dihubungkan dengan medan NRP). Untuk itu, isilah properti MasterSource pada TabelNilai dengan DSMahasiswa (yaitu sebagai data source yang mewakili tabel mahasiswa). Kemudian definisikan hubungannya (link) dengan mengisi properti MasterFields. Klik pada tiga titik di kanan untuk membuka dialog Field Link Designer.
Modul VII – Hubungan Master-Detail dan Data Controls Tambahan
7-84
Gambar 7.2: Dialog Field Link Designer setelah didefinisikan.
Gambar 7.1: Dialog Field Link Designer.
Klik OK, maka pada properti MasterFields tadi akan muncul NRP. Sejauh ini, hubungan master-detail sudah terbentuk. Untuk menambah tingkat kenyamanan pemakai, karena sudah jelas NRP dan data mahasiswa yang tertera pada tabel nilai hanya yang terpilih pada tabel mahasiswa, maka sembunyikan tampilan NoNilai, NRP, dan NamaMahasiswa pada tabel nilai seperti yang telah diajarkan pada praktikum 6. Pada dialog tersebut, definisikan hubungan antara medan pada tabel rincian dengan medan pada tabel master, dalam hal ini, NRP dengan NRP. Pilih NRP pada Detail Fields dan pilih NRP pada Master Fields, kemudian klik Add. Maka akan muncul “NRP NRP” pada Joined Fields.
Data Controls Tambahan
D
i samping data controls yang telah disebutkan pada praktikum sebelumnya, masih ada beberapa data controls tambahan yang tak kalah penting dalam pembuatan aplikasi database. Kebanyakan data controls tambahan ini merupakan data controls yang merekayasa data per medan.
TDBRadioGroup Komponen ini merupakan sebuah komponen data-aware yang mewakili pilihan-pilihan (lists) tertentu untuk mengisi (atau menampilkan nilai) sebuah medan yang bertipe string. Cara kerja-
Modul VII – Hubungan Master-Detail dan Data Controls Tambahan
7-85
nya hampir sama dengan TRadioGroup pada tab standard, hanya saja yang ini disambungkan dengan nilai medan. Komponen ini sangat berguna untuk menyaring agar pemakai hanya mengisikan data dengan nilai-nilai tertentu.
TDBCheckBox Komponen TDBCheckBox adalah sebuah komponen data-aware yang digunakan untuk mewakili nilai medan yang bertipe boolean.
TDBListBox Komponen ini sama seperti TDBRadioGroup, yaitu menyaring nilai-nilai tertentu saja untuk medan bertipe string. hanya saja tampilannya yang menggunakan sistem daftar yang bisa digulung.
TDBComboBox Komponen ini sama seperti TDBListBox, dengan perbedaan bahwa selain pemakai bisa memilih nilai-nilai tertentu saja, juga bisa diisikan data yang lainnya. Biasanya memudahkan untuk medan yang sering menggunakan nilai-nilai tertentu tetapi masih dimungkinkan memiliki nilai lainnya.
TDBLookupListBox Komponen ini mirip dengan TDBListBox, tetapi mampu menampilkan nilai-nilai hubungan ke tabel master. Komponen ini sangat membantu dalam memasukkan nilai medan pada tabel transaksi yang bergantung pada nilai medan pada tabel master. Untuk menggunakannya, ubah properti ListSource ke komponen TDataSource yang mewakili tabel master, properti KeyField dengan medan kunci pada tabel master, dan properti ResultField dengan medan yang ingin ditampilkan pada tabel master.
Modul VII – Hubungan Master-Detail dan Data Controls Tambahan
7-86
TDBLookupComboBox Komponen ini sama dengan TDBLookupListBox, hanya saja berupa editbox yang hanya memuat satu baris dan baru bisa menampilkan daftar bila tombol drop-down diklik.
TDBMemo Komponen ini digunakan untuk menampilkan dan merekayasa medan bertipe memo.
TDBImage Komponen ini digunakan untuk menampilkan dan merekayasa medan bertipe gambar bitmap atau foto.
Contoh Aplikasi
B
ukalah ProjectBus, kemudian buatlah hubungan master-detail sedemikian rupa sehingga memudahkan pemakai untuk mengisi data rutin perjalanan berdasarkan bus, dan memudahkan pengisian data bus menurut trayek. Selain itu juga buat hubungan master-detail untuk memudahkan pengisian data pemesanan tiket berdasarkan perjalanan.
Buatlah setiap tampilan hanya menampilkan satu hubungan master-detail, sehingga dalam project ini diperlukan tiga tampilan. Anda dapat membuat tiga form yang bisa di-switch.
Modul VII – Hubungan Master-Detail dan Data Controls Tambahan
7-87
Tugas Aplikasi Tugas 7.1 Menggunakan yang telah diberikan pada modul 5, 6, dan 7, rancanglah sebuah database dan aplikasinya untuk membantu operasional sebuah swalayan yang menangani penjualan dan pembelian barang. Berbeda dengan tugas sebelumnya, kali ini hanya diberikan tabel dan nama medannya, sedangkan tipe data tiap medan harus Anda definisikan sendiri. Begitu pula dengan hubungan (relationships) yang harus Anda tentukan sendiri. Gambar 7.3: Definisi database (hanya medanmedan) untuk tugas 7.1.
Supplier
Customer
NoSupplier Nama Alamat NoTelpon
NoCustomer Nama Alamat NoTelpon
Barang
Pembelian
KodeBarang Nama HargaBeli HargaJual Stok
NoPembelian NoSupplier Tanggal
Penjualan ItemPembelian NoItemPembelian NoPembelian KodeBarang Jumlah
NoPenjualan NoCustomer Tanggal
ItemPenjualan NoItemPenjualan NoPenjualan KodeBarang Jumlah
Modul VII – Hubungan Master-Detail dan Data Controls Tambahan
7-88
Jangan lupa untuk mencegah agar pengisian harga jual barang tidak sampai lebih rendah dari harga beli. Selain itu buat sedemikian rupa sehingga memudahkan pemakai dalam mengisikan data dengan menggunakan hubungan master-detail, dan pengesahan data untuk mencegah misalnya penjualan barang melampaui batas stoknya.
Modul VIII – Query
Modul
8 Query
T
erkadang diperlukan menampilkan data tertentu berdasarkan kriteria tertentu pula. Hal ini sangat sulit bila hanya dilakukan dengan menggunakan tabel. Untuk menampilkan data tertentu tersebut, tampilan bisa disaring melalui sebuah query.
Query adalah kumpulan perintah yang dikirimkan pada database server, dan database server mengerjakan perintah tersebut sekaligus mengirimkan hasilnya. Jadi bila menulis aplikasi Delphi yang mengandung query, maka yang mengerjakan perintahperintah tersebut bukan aplikasinya, melainkan database server yang dipakai. Selain untuk menampilkan hasil yang tersaring, query juga bisa digunakan untuk menyisipkan, mengubah, dan menghapus data. Ditambah lagi kemampuannya untuk membuat, mengubah, atau menghapus tabel bahkan database!
Structured Query Language
S
QL (Structured Query Language) merupakan sebuah bahasa internasional yang digunakan untuk melakukan query. Karena sifatnya yang internasional, maka SQL dapat dipakai pada database server apapun—semua database server memakai SQL. SQL dikategorikan dua macam, pertama adalah untuk merekayasa data, dan kedua untuk mendefinisikan data.
8-90
Data Manipulation Language Bagian kategori SQL untuk melakukan rekayasa data adalah DML (Data Manipulation Language). Bagian ini hanya merekayasa atau menampilkan data yang ada pada tabel. Bagian ini tidak melakukan definisi data, seperti membuat atau menghapus tabel data.
Query yang Menampilkan Hasil (SELECT) Query jenis ini hanya menampilkan hasil, dan biasanya dipakai untuk menyaring tampilan agar hanya data tertentu yang ditampilkan. Query ini menggunakan klausa SELECT sebagai awalannya, dan selalu diikuti oleh FROM. Bagian SELECT memilih medan-medan yang akan ditampilkan, sedangkan bagian FROM menyatakan tabel-tabel yang digunakan dalam query tersebut. Untuk melakukan penyaringan data, maka digunakan klausa WHERE, di mana berisi syarat agar data ditampilkan. Selain itu dalam klausa WHERE juga bisa berisi syarat hubungan dua atau lebih tabel. Beberapa fungsi yang ada dalam SQL dan paling sering digunakan antara lain SUM, MIN, MAX, AVG, dan COUNT. 1.
Fungsi SUM digunakan untuk mengetahui jumlah nilai dalam suatu medan pada tabel, dengan syarat tipe data medan harus berupa numerik.
2.
Fungsi MIN digunakan untuk mengetahui nilai terendah dalam suatu medan pada tabel, dengan syarat tipe data medan harus berupa numerik.
3.
Fungsi MAX digunakan untuk mengetahui nilai tertinggi dalam suatu medan pada tabel, dengan syarat tipe data medan harus berupa numerik.
4.
Fungsi AVG digunakan untuk mengetahui nilai rata-rata dalam suatu medan pada tabel, dengan syarat tipe data medan harus berupa numerik.
Modul VIII – Query
8-91
5.
Fungsi COUNT digunakan untuk mengetahui jumlah rekaman pada tabel.
Klausa ORDER BY digunakan untuk mengurutkan hasil query menurut medan tertentu. Sedangkan klausa GROUP BY digunakan untuk melakukan pengelompokan tampilan bila sebagian medan-medan yang dipilih pada bagian SELECT yang berupa kumpulan (bila sebagian medan terpilih menggunakan fungsi seperti yang ada di atas). Klausa GROUP BY biasanya diikuti dengan klausa HAVING, yang berfungsi sama dengan klausa WHERE, namun berisi persyaratan kumpulan tadi. Sebagai contoh, SQL untuk menampilkan semua mahasiswa adalah: SELECT * FROM Mahasiswa Sedangkan untuk menampilkan mahasiswa yang bernama “Agus” dapat dilakukan dengan cara: SELECT * FROM Mahasiswa A WHERE A.Nama = "Agus" Untuk menampilkan nilai tugas rata-rata dari mata kuliah “Aljabar Logika” adalah: SELECT AVG(B.Tugas) FROM MataKuliah A, Nilai B WHERE (A.Nama = "Aljabar Logika") AND (A.KodeMK = B.KodeMK) Contoh di atas menunjukkan bahwa SQL juga mendukung hubungan antar tabel—dalam kasus ini, tabel mata kuliah dan tabel nilai. Berikut ini sebuah contoh menggunakan ORDER BY, yaitu menampilkan nama mahasiswa yang mengikuti mata kuliah “Aljabar Logika”, dan ditampilkan urut menurut nama mahasiswa, bukannya NRP. SELECT A.NRP, A.Nama FROM Mahasiswa A, MataKuliah B, Nilai C WHERE (A.NRP = C.NRP) AND (B.KodeMK = C.KodeMK) AND (B.Nama = "Aljabar Logika")
Modul VIII – Query
8-92
ORDER BY A.Nama Karena hubungan antara tabel mahasiswa dengan mata kuliah merupakan hubungan many-to-many, maka hubungan tersebut harus memiliki perantara—dalam hal ini tabel nilai. Sehingga bagian klausa FROM mengandung ketiga tabel tersebut. Perlu diketahui, bahwa tabel-tabel yang ada pada klausa FROM bukan hanya tabel yang medannya ingin ditampilkan, tetapi semua tabel yang terlibat, khususnya dalam hubungan (relationship). Contoh dari klausa GROUP BY dan HAVING bisa dilihat berikut ini. SELECT A.NRP, A.Nama, AVG(0.2 * B.Tugas + 0.5 * B.UAS) AS FROM Mahasiswa A, Nilai B WHERE (A.NRP = C.NRP) GROUP BY A.NRP, A.Nama HAVING AVG(0.2 * C.Tugas + 0.5 * C.UAS) >= ORDER BY A.Nama DESC
0.3 * B.UTS + RataRata
0.3 * C.UTS + 56
Query tersebut di atas akan menampilkan NRP, nama mahasiswa, dan rata-rata nilai akhir dari semua mata kuliah yang ditempuhnya, di mana rata-rata nilai akhirnya minimal 56, dan ditampilkan urut menurun (descending) menurut nama. Untuk acuan lebih lanjut dapat dibaca pada buku-buku tentang SQL.
Query yang Mengubah Data pada Tabel (INSERT, UPDATE, dan DELETE) Jenis dari query yang lain adalah query yang mengubah data pada tabel. Query ini tidak menampilkan hasil, tapi mengubah data yang ada pada tabel, seperti menambahkan baris baru (inserting), mengubah baris yang telah ada (updating), atau menghapus baris (deleting).
Modul VIII – Query
8-93
Acuan lengkapnya dapat dibaca pada buku-buku tentang SQL, namun di sini akan diberikan beberapa contoh untuk inserting, updating, dan deleting.
Perintah INSERT Perintah ini digunakan untuk menambahkan baris baru, dengan parameter medan-medan yang diisikan. Sebagai contoh, untuk menambahkan data mahasiswa baru dengan NRP “02113105”, nama “Kikil”, alamat “mBangil”, dan jenis kelamin laki-laki tanpa mengisikan tempat dan tanggal lahirnya adalah: INSERT INTO Mahasiswa (NRP, Nama, Alamat, JenisKelamin) VALUES ("02113105", "Kikil", "mBangil", TRUE)
Perintah UPDATE Perintah ini digunakan untuk mengubah medan tertentu pada baris tertentu dengan kriteria tertentu pula. Bagian klausa WHERE dapat diisi dengan kriteria pengubahan data tersebut. Bila bagian tersebut tidak diisi, maka perubahan akan dilakukan pada semua baris pada tabel tersebut. Berikut ini contoh perintah untuk mengubah tempat lahir dari mahasiswa yang bernama “Kikil” menjadi “Pasuruan”. UPDATE Mahasiswa SET TempatLahir = "Pasuruan" WHERE Nama = "Kikil" Perubahan tersebut hanya akan mempengaruhi satu baris. Bila kriteria yang diberikan menunjuk ke banyak baris, maka perubahan akan dilakukan pada baris-baris yang bersangkutan. Contoh, bila ingin mengubah semua alamat mahasiswa yang bernilai “mBangil” menjadi “Pocong”, dapat dilakukan dengan cara sebagai berikut. UPDATE Mahasiswa SET Alamat = "Pocong" WHERE Alamat = "mBangil" Sedangkan untuk mengubah semua nilai tugas pada tabel Nilai menjadi 60 adalah sebagai berikut.
Modul VIII – Query
8-94
UPDATE Nilai SET Tugas = 60
Perintah DELETE Perintah ini menghapus baris sesuai dengan kriteria yang telah ditentukan. Sama seperti pada UPDATE, klausa WHERE berisi kriteria yang diinginkan. Bila bagian klausa WHERE tidak diisi, maka semua baris akan dihapus. Berhati-hatilah dalam penggunaannya, bila lupa memberikan klausa WHERE dan query ini dijalankan, maka semua baris data akan terhapus, dan tidak ada cara untuk mengembalikannya. Misalkan untuk menghapus mahasiswa yang bernama “Kikil”, dapat dilakukan dengan cara berikut. DELETE FROM Mahasiswa WHERE Nama = "Kikil" Contoh berikut akan menghapus semua baris data dalam tabel Mahasiswa. DELETE FROM Mahasiswa
Data Definition Language Bagian kategori SQL yang bertugas untuk mendefinisikan data adalah DDL (Data Definition Language). Dalam kategori ini, perintah-perintah yang ditulis akan melakukan pembuatan tabel (CREATE TABLE), menambah atau menghapus medan dalam tabel (ALTER TABLE), menghapus tabel (DROP TABLE), membuat indeks tambahan pada tabel (CREATE INDEX), dan menghapus indeks utama atau tambahan pada tabel (DROP INDEX). Pada praktikum ini DDL tidak dibahas karena definisi data dilakukan pada database server—dalam hal ini, Microsoft Access. Perintah-perintah DDL dapat didapatkan dari buku-buku yang membahas tentang SQL.
Modul VIII – Query
8-95
Menggunakan TADOQuery
K
omponen TADOQuery merupakan komponen yang hampir sama dengan TADOTable, karena juga merupakan kelas dari TCustomADODataSet. Komponen ini juga menghasilkan tabel seperti pada TADOTable, hanya jika query yang dikerjakan merupakan query dengan perintah SELECT. Agar bisa ditampilkan, harus ada komponen TDataSource yang mana properti DataSource-nya mengacu ke komponen ini, sama seperti pada TADOTable.
SQL Properti SQL merupakan sebuah properti yang dimiliki oleh TADOQuery dan bertipe TStrings. Properti ini berisi perintahperintah SQL yang akan dikirimkan ke database server. Untuk lebih jelasnya tentang tipe data TStrings, dapat dilihat pada help file yang disertakan dengan Borland Delphi.
Parameters Properti ini merupakan properti untuk mendefinisikan parameter. Parameter yang dimaksudkan adalah semacam peubah (variables) yang disisipkan pada pernyataan SQL pada properti SQL. Pemakaian parameter sangat menguntungkan terutama untuk kesesuaian tipe data SQL dengan tipe data pada Pascal Objek. Properti Parameters merupakan properti yang bertipe TParameters, yang merupakan kumpulan (collections) dari beberapa parameter. Untuk menunjukkan parameter tertentu dapat diakses dari metode ParamByName dengan parameter berupa nama parameter. Metode ParamByName tersebut bertipe TParameter. Berikut ini dijelaskan dua properti utama yang dimiliki oleh kelas TParameter.
Modul VIII – Query
8-96
DataType Properti ini digunakan untuk mengakses tipe data dari parameter yang digunakan. Beberapa kemungkinan nilai yang diperbolehkan dapat dilihat dalam help file dari Borland Delphi.
Value Properti Value menunjukkan isi peubah parameter tersebut. Properti ini bertipe Variant, sehingga semua tipe data bisa digunakan.
Menjalankan Query Untuk menjalankan query—melalui TADOQuery tentunya—terlebih dahulu properti SQL harus diisi lengkap tanpa ada kesalahan. Bila terdapat kesalahan, maka pada waktu menjalankan query akan terjadi exception. Setelah properti SQL terisi lengkap, bila ada parameter yang disertakan pada SQL maka properti Parameters juga harus didefinisikan. Ada dua cara menjalankan query, yaitu dengan metode Open atau metode ExecSQL.
Open Metode Open digunakan bila perintah SQL yang dikirimkan mengembalikan data tabel. Perintah SQL yang mengembalikan—dan menampilkan—data tabel adalah perintah SELECT.
ExecSQL Berbeda dengan Open, metode ExecSQL dijalankan apabila perintah SQL mengandung perintah yang tidak mengembalikan data tabel. Perintah-perintah tersebut di antaranya adalah INSERT, UPDATE, dan DELETE.
Modul VIII – Query
8-97
Mengakses Hasil Query Bila query yang dijalankan mengembalikan data tabel, maka selain bisa diperlihatkan melalui data controls, dapat juga diakses medan-medannya secara program. Berikut ini metode yang digunakan, yaitu FieldByName.
FieldByName Metode FieldByName merupakan sebuah metode untuk menunjukkan medan sesuai dengan namanya. Metode ini memiliki parameter berbentuk string yang mewakili nama medan fisiknya. Berikut ini contoh menggunakan TADOQuery untuk menampilkan nilai tugas, UTS, dan UAS mata kuliah “Pascal II” dari mahasiswa yang bernama “Kikil”. ... try ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT B.Tugas, B.UTS, B.UAS'); ADOQuery1.SQL.Add('FROM Mahasiswa A, Nilai B, ' + 'MataKuliah C'); ADOQuery1.SQL.Add('WHERE (A.NRP = B.NRP) AND'); ADOQuery1.SQL.Add('(C.KodeMK = B.KodeMK) AND'); ADOQuery1.SQL.Add('(A.Nama = :NamaMhs) AND'); ADOQuery1.SQL.Add('(C.Nama = :NamaMK)'); ADOQuery1.Parameters.ParamByName('NamaMhs'). DataType := ftString; ADOQuery1.Parameters.ParamByName('NamaMhs'). Value := 'Kikil'; ADOQuery1.Parameters.ParamByName('NamaMK'). DataType := ftString; ADOQuery1.Parameters.ParamByName('NamaMK'). Value := 'Pascal II'; ADOQuery1.Open; except MessageDlg('Terjadi kesalahan pada query.', mtError, [mbOK], 0); end; ...
Modul VIII – Query
8-98
Contoh Aplikasi
B
ukalah ProjectBus, kemudian ubah kode-kode program sedemikian rupa sehingga perintah-perintah pengesahan data seperti pada soal 6.1 tidak lagi melakukan looping dengan menggunakan TADOTable, tetapi diganti dengan menggunakan query. Selain itu, tambahkan satu form khusus untuk laporan tentang tiket yang terjual untuk tiap perjalanan dan laporan kursikursi yang masih kosong pada bus tertentu pada perjalanan tertentu. Buatlah semuanya memakai query.
Modul VIII – Query
8-99
Daftar Pustaka
Tugas Aplikasi Tugas 8.1 Kerjakan sama seperti tugas 7.1, tetapi semua pengesahan data dan laporan harus menggunakan query. Kerjakan tugas tersebut lengkap sehingga layak untuk diujicobakan pada dunia nyata. Apabila terdapat kesalahan apapun, maka program tersebut harus mampu mengatasinya. Selamat mengerjakan.
Borland International, Inc., Borland Delphi 7 Developer Guide.
Borland International, Inc., Delphi 7 Help File.
Suprayogi, Hendra, Modul Praktikum Pemrograman Delphi, STIKI, 2003.