Logo

Marco Cantù's
Essential Pascal

Bab 10
Variants

Untuk memberikan dukungan penuh terhadap OLE, Delphi versi 32-bit menyertakan data type Variant. Disini saya ingin mendiskusikan data type ini dari sudut pandang umum. Type Variant mempunyai efek pervasive pada bahasa pemrograman secara keseluruhan, dan component library Delphi juga menggunakannya dalam hal yang tidak berhubungan dengan pemrograman OLE.

Variants Tidak Mempunyai Type

Secara umum, Anda dapat menggunakan variant untuk menyimpan data type apapun dan melakukan berbagai operasi dan konversi type. Perhatikan bahwa hal ini bertentangan dengan pendekatan umum dalam bahasa Pascal dan bertentangan dengan praktek pemrograman yang baik. Suatu variant diperiksa type-nya dan dihitung saat run time. Compiler tidak akan memperingatkan Anda akan kemungkinan error dalam code, yang hanya bisa ditangkap dengan pemeriksaan yang ekstensif. Secara keseluruhan, Anda dapat memandang bagian code yang menggunakan variant sebagai code yang di-interpretasikan, karena, sama seperti code yang di-interpretasikan, banyak operasi yang tidak bisa diselesaikan sampai run time. Hal ini terutama mempengaruhi kecepatan code tersebut.

Sekarang saya telah memperingatkan Anda mengenai penggunaan type Variant, sekarang saatnya untuk melihat apa yang dapat dikerjakannya. Secara mendasar, setelah Anda mendeklarasikan suatu variabel variant seperti berikut:

var
  V: Variant;

Anda dapat memberikannya nilai dengan type yang berbeda:

V := 10;
V := 'Hello, World';
V := 45.55;

Sekali Anda mempunyai nilai variant, Anda dapat menyalinnya ke ke data type yang kompatibel maupun yang tidak kompatibel. Jika Anda menyalin suatu nilai ke suatu data type yang tidak kompatibel, Delphi akan melaksanakan suatu konversi, bilamana bisa. Jika tidak, dia akan menampilkan run-time error. Sebenarnya, suatu variant menyimpan informasi type beserta dengan datanya, memungkinkan beberapa operasi saat run-time; operasi ini bisa sangat bermanfaat tapi pelan dan tidak aman.

Pertimbangkan contoh berikut (dinamai VariTest), yang merupakan suatu perkembangan dari code diatas. Saya meletakkan tiga edit box pada suatu form baru, menambahkan beberapa button, lalu menuliskan code berikut untuk event OnClick untuk button pertama:

procedure TForm1.Button1Click(Sender: TObject);
var
  V: Variant;
begin
  V := 10;
  Edit1.Text := V;
  V := 'Hello, World';
  Edit2.Text := V;
  V := 45.55;
  Edit3.Text := V;
end;

Aneh bukan? Disamping mengisi property Text dari suatu komponen edit dengan suatu variant yang berisi string, Anda dapat mengisi Text tersebut dengan suatu variant yang berisi suatu angka integer atau floating-point. Seperti yang dapat Anda lihat pada Gambar 10.1, semuanya berjalan baik.

Gambar 10.1: Output contoh VariTest setelah button Assign ditekan.

Lebih parah lagi, Anda dapat menggunakan variant untuk menghitung nilai, seperti yang dapat Anda lihat pada code yang berkaitan dengan button kedua:

procedure TForm1.Button2Click(Sender: TObject);
var
  V: Variant;
  N: Integer;
begin
  V := Edit1.Text;
  N := Integer(V) * 2;
  V := N;
  Edit1.Text := V;
end;

Menuliskan code semacam ini sangat berisiko. Jika edit box pertama berisi suatu angka, semuanya berjalan lancar. Jika tidak, suatu exception akan timbul. Lagi, Anda dapat menulis code serupa, tapi tanpa alasan yang kuat, Anda seharusnya tidak menggunakan type Variant; tetaplah menggunakan data type Pascal yang tradisional dan pendekatan type-checking. Dalam Delphi dan di VCL (Visual Component Library), secara mendasar, variant digunakan untuk dukungan OLE dan untuk mengakses field database.

Lebih Dalam Tentang Variants

Delphi menyertakan suatu record type variant, TVarData, yang mempunyai layout memory serupa dengan type Variant. Anda dapat menggunakannya untuk mengakses type sebenarnya dari suatu variant. Struktur TVarData menyertakan type Variant, terlihat sebagai VType, beberapa reserved field, dan nilai sebenarnya.

Nilai yang mungkin dari field VType bersesuaian dengan type data yang dapat Anda gunakan dalam OLE automation, yang mana sering disebut type OLE atau variant. Berikut ini adalah daftar lengkap secara alfabet dari type variant yang tersedia:

Anda dapat memperoleh penjelasan dari type ini pada system Help di Delphi, untuk topik Variant Values.

Ada juga beberapa function untuk mengoperasikan variant yang dapat Anda gunakan untuk membuat konversi type tertentu atau mengetahui informasi mengenai type suatu variant (lihat, misalnya, function VarType). Kebanyakan function konversi type dan pemberian nilai yang sebenarnya dijalankan secara otomatis saat Anda menuliskan ekspresi menggunakan variant. Rutin pendukung variant lain (lihat di file Help untuk topik rutin pendukung Variant) sebenarnya beroperasi pada array variant.

Variants adalah Pelan!

Code yang menggunakan type Variant adalah pelan, tidak hanya saat Anda mengkonversi type data, tapi juga ketika Anda menambahkan dua nilai variant yang masing-masing berisi suatu Integer. Mereka juga hampir sepelan code Visual Basic yang diinterpretasi! Untuk membandingkan kecepatan suatu algoritma yang berdasarkan variant dengan code yang sama yang menggunakan integer, Anda dapat melihat contoh VSpeed.

Program ini menjalankan suatu pengulangan, mengukur kecepatannya dan menunjukkan statusnya dengan suatu progress bar. Berikut ini adalah yang pertama dari dua pengulangan yang mirip, berdasarkan integer dan variant:

procedure TForm1.Button1Click(Sender: TObject);
var
  time1, time2: TDateTime;
  n1, n2: Variant;
begin
  time1 := Now;
  n1 := 0;
  n2 := 0;
  ProgressBar1.Position := 0;
  while n1 < 5000000 do
  begin
    n2 := n2 + n1;
    Inc (n1);
    if (n1 mod 50000) = 0 then
    begin
      ProgressBar1.Position := n1 div 50000;
      Application.ProcessMessages;
    end;
  end;
  // we must use the result
  Total := n2;
  time2 := Now;
  Label1.Caption := FormatDateTime (
    'n:ss', Time2-Time1) + ' seconds';
end;

Code untuk pengukuran waktu cukup berharga untuk ditelaah, karena ini adalah sesuatu yang dapat Anda adaptasikan dengan mudah pada test performance macam apapun. Seperti yang dapat Anda lihat, program menggunakan function Now untuk memperoleh waktu sekarang dan function FormatDateTime untuk menampilkan perbedaan waktu, untuk memperoleh hasil menit ("n") dan detik ("ss") dalam format string. Sebagai alternatif, Anda dapat menggunakan function API Windows yaitu GetTickCount, yang mengembalikan indikasi yang ketepatan milidetik sejak operating system dimulai.

Pada contoh ini, perbedaan kecepatan begitu besarnya sehingga Anda dapat melihatnya bahkan tanpa pengukuran waktu dengan ketepatan tinggi. Namun demikian, Anda dapat melihat hasilnya untuk komputer saya sendiri pada Gambar 10.2. Nilai sebenarnya akan bergantung pada komputer yang Anda gunakan, tapi perbandingannya tidak akan jauh berbeda.

Gambar 10.2: Perbedaan kecepatan pada algoritma yang sama, berdasarkan integer dan variant (pengukuran waktu sebenarnya akan bervariasi tergantung pada komputer yang digunakan), seperti yang ditunjukkan pada contoh VSpeed.

Kesimpulan

Variant begitu berbeda dari data type tradisional Pascal dimana saya memutuskan untuk mencakupnya pada bab pendek yang terpisah. Meskipun peran mereka adalah dalam pemrograman OLE, mereka cukup bermanfaat saat menulis program secara quick and dirty tanpa harus berpikir tentang type data. Seperti yang telah kita lihat, hal ini mempengaruhi kinerja program.

Sekarang kita telah membahas sekian banyak fitur bahasa pemrograman, perkenankan saya membahas struktur keseluruhan dari suatu program dan modularisasi yang ditawarkan dengan unit.

Bab Selanjutnya: Program dan Unit

© Copyright Marco Cantù, Wintech Italia Srl 1995-2000
© Copyright of the Indonesian Translation by Hianoto Santoso, 2002