Extended Record. I’m Loving It

Hampir semua pengguna Delphi (bukan yang baru mengenal) pernah melihat potongan kode seperti ini:

procedure TForm2.Button1Click(Sender: TObject);
var
 MyList: TStringList;
begin
 MyList := TStringList.Create;
 try
 MyList.LoadFromFile('c:\myfile.txt');
 Memo1.Lines.Assign(MyList);
 finally
 MyList.Free;
 end;
end;

Ya, untuk memuat isi file teks ke sebuah memo. Atau mungkin untuk diinsert ke database. Atau untuk keperluan lainnya.

Yang jadi soal, biasanya, kita mesti berulangkali mengetik TTipeObjek.Create dan Objek.Free. Ditambah lagi, dengan error handling try..finally..end yang kadang-kadang jadi momok.

Extended Record

Delphi menyediakan sebuah tipe data (saya lupa sejak versi Delphi ke-berapa) yaitu Extended Record. Untuk menyegarkan, kita lihat kembali tipe record di Delphi:

TMyRec = record
 MyName: string[20];
 MyAge : Byte;
 MyPhone: string[15]
 end;

Contoh di atas adalah record paling sederhana dengan tiga field: MyName, bertipe string sepanjang 20 karakter, MyAge, bertipe ordiner dengan nilai antara 0 sampai 255, dan MyPhone, string sepanjang 15 karakter. Tidak usah saya perpanjang, Anda sudah tahuūüôā

Kemudian ada juga record dengan variant record, yang field-fieldnya dapat dipakai sesuai kebutuhan.

 TMyRec2 = record
 MyName: string[20];
 MyPhone: string[15];
 case boolean of
 False : (
 MyAge : Byte;
 MyHeight: Byte
 );
 True  : (
 MyFavNumber: Word
 );
 end;
 

Silahkan ikuti link ini untuk info lebih lanjut: http://delphibasics.co.uk/RTL.asp?Name=Record

Di Delphi, record tidak perlu di-create atau di-free. Delphi otomatis memanage eksistensi record di memori dan membuangnya  bila tidak lagi digunakan oleh kode. Dengan begini, kasus pada contoh paling atas (memuat teks dari file ke TMemo) tentu tidak perlu ribet dengan try..finally..end dan TObjekTipe.Create atau Objek.Free. Atas dasar itulah, extended record (a.k.a advanced record) eksis di Delphi.

Anda bertanya, apa record bisa melakukan “myRecord.LoadFromFile();” ? Jawabannya: Tidak!

Kita yang harus membuatnya bisa melakukan itu. Coba lihat contoh ini:


TMyRec = record
 MyName: string[20];
 MyAge : Byte;
 MyPhone: string[15];
 procedure Info;
 end;

Lihat, ada sebuah prosedur, procedure Info. Sekarang prosedur tersebut kita definiskan:


procedure TMyRec.Info;
begin
 ShowMessage('Hi..., saya '+ MyName+'. Umur saya '+ IntToStr(MyAge)+'. Hubungi saya di '+ MyPhone+'...');
end;

Dan record ini kemudian kita gunakan:


procedure TForm2.Button1Click(Sender: TObject);
var
 rec: TMyRec;
begin
 rec.MyName := 'Vivi';
 rec.MyAge  := 18;
 rec.MyPhone:= '085296368599';
 rec.Info;
end;

Apa yang terjadi? Kita akan dapatkan sebuah kotak pesan sesuai yang diharapkan dalam definisi prosedur Info();

Dan yang penting, tidak perlu Create(), Free() dan try..finally..end. Kini tinggal kreativitas kita menggunakan fasilitas luar-biasa ini, yang hampir tidak ada bahasa pemrograman lain yang memilikinya.

Lanjut.

Bila ternyata kita butuh nilai-nilai inisial sebelum sebuah record digunakan, kita bisa saja menggunakan konstruktor untuk melakukan inisialisasi. Dengan catatan, kita butuh MyRecord.Create(). Agak kontras, tapi kan kita yang butuhūüôā


TDanaAnggaranSKPD = record
 private
 FSKPD: String;
 procedure GetDanaSKPD;
 public
 DanaDPABelanjaLangsung,
 DanaDPABelanjaTidakLangsung,
 DanaDPPABelanjaLangsung,
 DanaDPPABelanjaTidakLangsung: Double;
 constructor Create(AKodeSPKD: String);
 end;

...........................................................................

procedure TDanaAnggaranSKPD.GetDanaSKPD;
var
 Q: TUniQuery;
begin
 self.DanaDPABelanjaLangsung       := 0;
 Self.DanaDPABelanjaTidakLangsung  := 0;
 Self.DanaDPPABelanjaLangsung      := 0;
 Self.DanaDPPABelanjaTidakLangsung := 0;
 if FSKPD = '' then exit;
 q := TUniQuery.Create(Application);
 q.Connection := FMain.Koneksi;
 q.SQL.Text := 'select '+
 '( select sum(jumlah_r) from usr_02 where (substring(kode, 10, 15)='''+FSKPD+''') and ( not (substring(kode, length(kode)-1,2)  in (''PD'',''PK'',''PT'', ''PS'', ''BT'')))) as anggaran_bl_dpa_r, '+
 '( select sum(jumlah_p) from usr_02 where (substring(kode, 10, 15)='''+FSKPD+''') and ( not (substring(kode, length(kode)-1,2)  in (''PD'',''PK'',''PT'', ''PS'', ''BT'')))) as anggaran_bl_dpa_p, '+
 '( select sum(jumlah_r) from usr_02 where (substring(kode, 10, 15)='''+FSKPD+''') and (substring(kode, length(kode)-1,2) = ''BT'')) as anggaran_bt_dpa_r, '+
 '( select sum(jumlah_p) from usr_02 where (substring(kode, 10, 15)='''+FSKPD+''') and (substring(kode, length(kode)-1,2) = ''BT'')) as anggaran_bt_dpa_p';
 try
 q.Open;
 self.DanaDPABelanjaLangsung       := Q.Fields[0].AsFloat;
 Self.DanaDPPABelanjaLangsung      := Q.Fields[1].AsFloat;
 Self.DanaDPABelanjaTidakLangsung  := Q.Fields[2].AsFloat;
 Self.DanaDPPABelanjaTidakLangsung := Q.Fields[3].AsFloat;
 finally
 q.Free;
 end;
end;

..........................................................................

constructor TDanaAnggaranSKPD.Create(AKodeSPKD: String);
begin
 self.FSKPD := AKodeSPKD;
 GetDanaSKPD;
end;

Contoh di atas adalah record yang lebih kompleks. Saya membuatnya untuk mencari mengambil data dana SKPD pada aplikasi Sistem Informasi Keuangan Daerah.

Record di atas dapat digunakan:


procedure TFSPD.eSKPDChange(Sender: TObject);
var
 ASkpd: String;
 DA_Skpd: TDanaAnggaranSKPD;
 begin
 ASkpd  := Right(eSKPD.Text, 15); //kode SKPD
 DA_Skpd:= TDanaAnggaranSKPD.Create(ASkpd);
 DPA_BL := DA_Skpd.DanaDPABelanjaLangsung;
 DPA_BT := DA_Skpd.DanaDPABelanjaTidakLangsung;

end;

Bila Anda tertarik dengan extended record, download berikut ini dapat Anda jadikan inspirasi. Saya membuatnya untuk menggantikan TStringList pada kasus paling awal, namun belum sempurna. Masih sebatas “pemenuhan kebutuhan.”

Contoh penggunaan extended record, dengan exe-demo – 212KB

Sukses selaluūüôā

5 thoughts on “Extended Record. I’m Loving It

  1. wah..
    saya pernah belajar delphi juga tuh, cuman dikit2 aja n gak ngerti juga,,
    bahasanya mirip pascal kan..
    bis belajar delphi ke VB..
    ya ampun tambah pusing saya..
    trus sekarang lagi belajar PHP, ah..kepala rasanya cenat-cenut..
    tapi makasi buat infonya..

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s