18 Mei 2009

Implementasi Run-Time Type Information / RTTI (Bagian 2)

Penggunaan RTTI memungkinkan kita mendapatkan informasi dari sebuah obyek tentang properti dari obyek tersebut. Salah satu fungsi yang berguna untuk kebutuhan ini adalah GetPropList. Fungsi ini menghasilkan daftar properti (termasuk event) yang terdapat pada sebuah obyek. Properti yang dimaksud adalah properti yang di published, seperti yang kita lihat pada Object Inspector. Ada beberapa variasi sintaks fungsi GetPropList seperti yang dapat kita lihat pada unit TypInfo.
function GetPropList(TypeInfo: PTypeInfo; TypeKinds: TTypeKinds; PropList: PPropList; SortList: Boolean = True): Integer;
function GetPropList(TypeInfo: PTypeInfo; out PropList: PPropList): Integer;
function GetPropList(AObject: TObject; out PropList: PPropList): Integer;

Fungsi GetPropList mengembalikan jumlah properti yang ditemukan dan properti apa saja yang terdapat pada sebuah obyek yang disimpan pada PropList. Fungsi yang pertama membatasi hasil yang dikembalikan hanya berdasarkan TypeKinds dan mempunyai pilihan untuk mengurutkan properti yang ada. Sedangkan dua variasi lainnya menghasilkan semua properti yang ada. Contoh dibawah ini akan menampilkan tiap properti yang ada pada sebuah obyek.
uses TypInfo;

procedure GetProp(aObject: TObject);
var
  i, PropCount: Integer;
  PropInfo: PPropInfo;
  PropList: PPropList;
  PropType: PPTypeInfo;
  s: string;
begin
  PropCount := GetPropList(PTypeInfo(aObject.ClassInfo), PropList);
  for i := 0 to PropCount - 1 do
  begin
    PropInfo := PropList^[i];
    PropType := PropInfo^.PropType;
    s := GetEnumName(TypeInfo(TTypeKind), Ord(PropType^.Kind));
    ShowMessage(PropInfo^.Name + ':' + PropType^.Name + ':' + s);
  end;
end;

Fungsi lain yang juga penting adalah GetPropInfo. Fungsi ini menghasilkan informasi detail dari sebuah obyek dengan properti tertentu. Fungsi ini juga mempunyai beberapa variasi sintaks.
function GetPropInfo(Instance: TObject; const PropName: string; AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(AClass: TClass; const PropName: string; AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string; AKinds: TTypeKinds): PPropInfo;

Fungsi tersebut mengembalikan nilai berupa pointer dengan tipe PPropInfo yang berisi karakteristik mengenai properti, seperti dapat kita lihat dibawah ini.
type
  PPropInfo = ^TPropInfo;
  TPropInfo = packed record
    PropType: PPTypeInfo;
    GetProc: Pointer;
    SetProc: Pointer;
    StoredProc: Pointer;
    Index: Integer;
    Default: Longint;
    NameIndex: SmallInt;
    Name: ShortString;
  end;

Terdapat puluhan fungsi untuk mengakses properti dari obyek yang dapat dilihat pada unit TypInfo. Beberapa diantara fungsi-fungsi tersebut adalah:

  • GetObjectProp
  • SetObjectProp
  • GetStrProp
  • SetStrProp
  • GetOrdProp
  • SetOrdProp
  • GetPropValue
  • SetPropValue
Contoh dibawah ini mengganti properti dari obyek TButton dengan nama Button1.
var
  PropInfo: PPropInfo;
  Obj: TObject;
begin
  PropInfo := GetPropInfo(Button1.ClassInfo, 'Font');
  Obj := GetObjectProp(Button1, PropInfo);
  SetPropValue(Obj, 'Style', '[fsBold,fsItalic]');
  SetStrProp(Button1, 'Caption', 'Tombol');
SetOrdProp(Button1.Font, 'Size', 10);

end;

Dengan menggunakan fungsi-fungsi yang berhubungan dengan RTTI, memungkinkan kita untuk mengakses properti dari obyek. Hal ini bisa sangat berguna, misalnya untuk menyimpan layout dari sebuah form. Properti dan nilai dari obyek dapat disimpan dalam registry, file INI atau file format buatan sendiri, atau bisa pula database. Kemudian pada saat form di load, layout dari form tersebut dapat dikembalikan dengan menggunakan properti dan nilai obyek yang disimpan sebelumnya.

Tidak ada komentar:

Posting Komentar