DelphiのRTTI(実行時型情報)を復習する。その2(RTTIユニット)の記事をC++Builderで書いてみました。
■サンプルプログラム:TButtonの全プロパティを表示する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//RTTI.TRttiContextを作成
TRttiContext context;
//TButtonの型情報を取得
TRttiType* rttiType = context.GetType(__classid(TButton));
//TButtonの全プロパティの配列を取得
DynamicArray<TRttiProperty*> properties = rttiType->GetProperties();
//プロパティをListBox1に登録
for (int i = 0; i < properties.Length; ++i)
{
ListBox1->Items->Add(properties[i]->ToString());
}
}
全プロパティが表示された。
■サンプルプログラム:TButtonの全メソッドを表示する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//RTTI.TRttiContextを作成
TRttiContext context;
//TButtonの型情報を取得
TRttiType* rttiType = context.GetType(__classid(TButton));
//TButtonの全メソッドの配列を取得
DynamicArray<TRttiMethod*> method = rttiType->GetMethods();
//メソッドをListBox1に登録
for (int i = 0; i < method.Length; ++i)
{
ListBox1->Items->Add(method[i]->ToString());
}
}
全メソッドが表示された。
■サンプルプログラム:Button1のCaptionの値を取得する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//RTTI.TRttiContextを作成
TRttiContext context;
//TButtonの型情報を取得
TRttiType* rttiType = context.GetType(__classid(TButton));
//TButtonのCaptionプロパティを取得
TRttiProperty* property = rttiType->GetProperty("Caption");
//Button1のCaptionプロパティの値を取得
UnicodeString caption = property->GetValue(Button1).AsString();
//ListBox1に登録
ListBox1->Items->Add(caption);
}
Button1のCaptionプロパティの値がListBoxに表示された。
■サンプルプログラム:Button1のCaptionの値を設定する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//RTTI.TRttiContextを作成
TRttiContext context;
//TButtonの型情報を取得
TRttiType* rttiType = context.GetType(__classid(TButton));
//TButtonのCaptionプロパティを取得
TRttiProperty* property = rttiType->GetProperty("Caption");
//Button1のCaptionプロパティの値を設定
property->SetValue(Button1, TValue::FromVariant("ぼたん"));
}
ボタンのキャプションが変わった。
■サンプルプログラム:メソッドを実行する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//RTTI.TRttiContextを作成
TRttiContext context;
//TStringsの型情報を取得
TRttiType* rttiType = context.GetType(__classid(TStrings));
//TStringsのAddメソッドを取得
TRttiMethod* method = rttiType->GetMethod("Add");
//TStrings.Addを実行
for (int i = 1; i < 4; ++i)
{
TValue value[1] = { TValue::FromVariant("テスト" + IntToStr(i)) };
method->Invoke(ListBox1->Items, value, 0);
}
}
ListBoxに追加された。