C++Builder XEでRTTIユニットを使う

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に追加された。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください