C++BuilderでJVCLのTJvInspectorを使ってみました。
TJvInspectorはDelphi/C++Builderのオブジェクトインスペクタのように、オブジェクトのプロパティを表示するコンポーネントです。
※TJvInspectorはJVCLのコンポーネントです。JVCLをインストールすると使用できるようになります。
■コンポーネントのプロパティを表示する
TJvInspectorにコンポーネントを登録するには、AddComponentメソッドを使用します。
AddComponentの第1引数にはコンポーネント、第2引数には表示名、第3引数はカテゴリーの状態(trueならノードを展開して表示)です。
JvInspector1->Clear();
JvInspector1->AddComponent(Edit1, "Edit1のプロパティ", true);
TJvInspectorでプロパティの値を編集すると、即座にコンポーネントの状態が更新されます。
Widthプロパティを編集すると、Edit1のWidthが変更された。
複数のコンポーネントを登録することもできます。
JvInspector1->Clear();
JvInspector1->AddComponent(Edit1, "Edit1のプロパティ", false);
JvInspector1->AddComponent(Panel1, "Panel1のプロパティ", false);
また、TJvInspectorCustomCategoryItemとTJvInspectorPropDataを使って、表示するコンポーネントを登録することもできます。
TJvInspectorCustomCategoryItem* InspCat = new TJvInspectorCustomCategoryItem(JvInspector1->Root, NULL);
InspCat->DisplayName = "Edit1のプロパティ";
TJvInspectorPropData::New(InspCat, Edit1);
InspCat->Expanded = true; //ノードを開く
■表示するプロパティを指定する
TJvInspectorPropData::Newメソッドの第3引数で表示するプロパティを指定することができます。
TJvInspectorCustomCategoryItem* InspCat = new TJvInspectorCustomCategoryItem(JvInspector1->Root, NULL);
InspCat->DisplayName = "Edit1のプロパティ";
TJvInspectorPropData::New(InspCat, Edit1, "Text"); //Textプロパティを表示する
TJvInspectorPropData::NewByNamesを使うと、表示するプロパティを配列で指定できます。
第3引数がプロパティ名の配列、第4引数が配列の要素数になります。
TJvInspectorCustomCategoryItem* InspCat = new TJvInspectorCustomCategoryItem(JvInspector1->Root, NULL);
InspCat->DisplayName = "Edit1のプロパティ";
UnicodeString names[] = { "Height", "Text", "Width" };
TJvInspectorPropData::NewByNames(InspCat, Edit1, names, 3);
実行時型情報(RTTI)を使って、プロパティを指定することもできます。
Typinfo::PPropInfoを引数にする例
TJvInspectorCustomCategoryItem* InspCat = new TJvInspectorCustomCategoryItem(JvInspector1->Root, NULL);
InspCat->DisplayName = "Edit1のプロパティ";
TJvInspectorPropData::New(InspCat, Edit1, GetPropInfo(__delphirtti(TEdit), "Text"));
Typinfo::PPropListを引数にする例
TJvInspectorCustomCategoryItem* InspCat = new TJvInspectorCustomCategoryItem(JvInspector1->Root, NULL);
Typinfo::PPropList PropInfos;
int PropCount = GetPropList(__delphirtti(TEdit), PropInfos);
TJvInspectorPropData::New(InspCat, Edit1, PropInfos, PropCount);
■単純なデータ型を表示する
TJvInspectorに単純なデータ型を表示するには、TJvInspectorVarDataのNewメソッドを使用します。
UnicodeString MyString;
…
TJvInspectorCustomCategoryItem* InspCat = new TJvInspectorCustomCategoryItem(JvInspector1->Root, NULL);
InspCat->DisplayName = "MyStringのプロパティ";
TJvInspectorVarData::New(InspCat, L"My String", __delphirtti(UnicodeString), &MyString);
もちろんTJvInspectorで値を編集すると、MyStringの値に反映されます。
わずかなコード量でこれだけのことができました。
強力なコンポーネントです。