Kamis, 28 Februari 2013

Modul pada Delphi

Kebanyakan buku-buku aplikasi database Delphi, referensi aplikasi database Delphi, tutorial aplikasi database Delphi sampai e-book Delphi memberikan gambaran yang sama tentang pembuatan aplikasi database di Delphi, yaitu dalam hal penggunaan Data Module.

Apa Itu Data Module?

Semua sudah tau, Di Delphi, Data Module adalah sejenis form yang dikhususkan untuk akses database. Di situ diletakkan komponen koneksi database, komponen akses data (dataset, query, table) dsb, juga komponen lain pendukung akses ke database. Di Delphi, data module ini diwakili oleh komponen TDataModule, yaitu komponen mirip form yang invisible saat aplikasi dijalankan.
Trus apa gunanya? Ya, agar aplikasi lebih modular. Dengan mengumpulkan komponen-komponen akses data dalam satu form, akan mudah membuat perubahan-perubahan apabila diperlukan.
Komponen-komponen yang ada pada data module ini kemudian dapat diakses dari form-form lain dengan meng-use nama unitnya, lalu memanggil objek dengan kode:
DataModule1.AdoTable1.Open;
Potongan kode di atas adalah contoh membuka AdoTable1 yang berada di DataModule1.
Saya tidak akan memperpanjang di sini. Semua juga sudah tau. Saya hanya akan membahas kelemahan-kelemahan penggunaan TDataModule dalam aplikasi database Delphi saja.
Sejauh pengalaman saya, banyak saya temui kasus yang ujung-ujungnya adalah TDataModule.
Contoh: https://www.facebook.com/groups/kppdi/permalink/10151308702455850/, dan berbagai kasus lain.

Error Access Violation Saat Mengakses Data

Error yang paling menggemaskan adalah Access Violation (AV). Dalam penggunaan TDataModule, error ini biasa terjadi apabila form/unit yang ingin mengakses data mencoba
DataModule1.AdoTable1.Open;
Sementara DataModule1 belum dibuat (belum ada di memori). Pemanggilan DataModule1 akan mengakses memori yang belum diinisialisasi, sehingga timbul error Access Violation ini.
Penyebab utama error ini adalah urutan pembuatan form (form creation order), di mana form pemanggil telah dibuat dan DataModule belum dibuat. Jika pada form pemanggil, pada event OnCreate() terdapat kode untuk mengakses data via DataModule, tentu akan error, karena saat kode itu dieksekusi DataModule belum di-create.
Anda dapat melihat urutan ini lewat menu Project>Options, klik tab Form (atau tekan Ctrl+Shift+F11). Cara lain adalah via menu Project>View Source dan lihat kodenya.

Form Tidak Tampil?

Lanjutan dari error di atas, kita perlu mengubah urutan pembuatan form (form creation order) dan mengatur ulang dengan data module berada pada urutan pertama, dengan harapan tidak terjadi lagi error AV. Yaaah…. malah form tidak ada yang tampil saat aplikasi jalan. Apa lagi ini?
Form yang berada pada urutan pertama otomatis dianggap oleh Delphi sebagai form utama (main form). Aturannya di Delphi jelas: Form utama tampil otomatis, form yang lain tersembunyi dan akan tampil bila dipanggil (misalnya dengan Form2.Show;). Mengingat data module adalah form invisible dan menjadi form utama, maka jelas tidak akan tampil. Form-form lain kan belum dipanggil, jadi lengkaplah penderitaan: semua form kagak nongol!

Repot Bolak-Balik Ke Data Module

Ini, menurut saya, adalah hal paling menjengkelkan dalam membuat aplikasi database. Musti bolak-balik ke data module untuk melihat nama field, mengubah perintah SQL, membuka dan menutup tabel, atau sekadar melihat nama komponen yang akan dipakai dalam kode.
DataModule1.AdoTable1.Insert;
DataModule1.AdoTable1.FieldByName('kode').AsStrring := Edit1.text;
DataModule1.AdoTable1.FieldByName('.... //lupa, terpaksa cek lagi ke DataModule1
Trus, coba sebut jumlah form dalam aplikasi kita. Lima? Sepuluh? Atau bahkan 50? Keciiiill! Bagaimana kalau ada 150 form? Tiap form ada 3 TAdoQuery dan 3 TDataSource? Coba kalikan, hasilnya (3+3)*150 = 900 komponen dalam satu data module…
Yang begini masih mending:
TDataModule Pada Aplikasi Database Delphi 2
Tapi kalau yang ini:
TDataModule Pada Aplikasi Database Delphi
Ini disebut modular? Waaaw…!!
Ayo bantu pindahkan kursi, saya mau koprol sambil bilang “Waaawww!”

Apa Solusi Alternatif Untuk Data Module?

Saya sebut saja, sejauh yang saya pikirkan:
  1. Jangan gunakan TDataModule. Untuk membuat aplikasi yang modular tidak harus menggunakan data source (Anda masih bisa menggunakan form lain, meskipun akan menghasilkan kasus-kasus yang sama)
  2. Komponen akses data utama, contohnya TAdoConnection, letakkan saja di form utama (main form). Sebut saja form ini dengan nama Form1 biar gampang. Form1 ini kemudian diatur agar di-create pertama kali. Nantinya form lain tidak akan menimbulkan error access violation saat memakai AdoConnection 1, karena adanya di Form1 dan Form1 ini sudah dibuat (pertama kali)
  3. Komponen akses data lain (seperti AdoTable1, AdoQuery2) diletakkan saja di masing-masing form yang menggunakannya. Ada keuntungan dari cara ini: Pertama, penulisan akan mudah. Saya memilih
    AdoTable1.Insert;
    
    Dibandingkan dengan
    Form1.AdoTable1.Insert;
    
    Kalau Anda?
    Keuntungan kedua akan terasa apabila Form1 sudah dibuat, dan form-form lain belum (akan dibuat nanti saat user mengklik menu, dengan Form2 := TForm2.Create(Application);). Kondisi ini akan mengurangi penggunaan memori oleh aplikasi. Saat dijalankan, tidak akan banyak memori yang dipakai di Form1, karena cuma ada AdoConnection1, sementara objek-objek akses data lain ada di form-form yang lain dan belum dibuat. Ini tentu menghemat memori. Bandingkan dengan kasus sebaliknya, begitu dijalankan, boooom..! Semua objek sudah berkumpul dan bahu-membahu rebutan memori.
Jadi sebagai kesimpulan, saya sarankan untuk tidak menggunakan TDataModule sebagai data module aplikasi database Anda. Gunakan form utama sebagai induk koneksi, dan tiap form dengan akses sendiri ke datanya. Inilah yang menurut saya pantas disebut aplikasi database modular, bukan yang menumpuk di TDataModule…

Tidak ada komentar:

Posting Komentar