ツリービュー(TTreeView)のノード(TTreeNode)のDataプロパティに文字列(UnicodeString)を設定する方法。
(1)キャストして登録する方法
ツリーノード(TTreeNode)のDataプロパティはvoid*型です。
Dataプロパティに設定する時は文字列(UnicodeString)をvoid*にキャストし、Dataプロパティから取得する時はUnicodestring*にキャストします。
ツリーノード(TTreeNode)に設定する
treenode->Data = new UnicodeString(Edit1->Text);
ツリーノード(TTreeNode)から取得する
UnicodeString* data = (UnicodeString*)treenode->Data;
サンプルプログラム
追加ボタンを押すとノードを追加します。
追加したノードのDataプロパティには、Edit1のTextプロパティの値を設定します。
ツリービューのノードを選択すると、ノードのDataプロパティの値をEdit1に表示します。
int i = 0; //グローバル変数。ノードのラベルに使用する
//追加ボタン
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TTreeNode* item = TreeView1->Items->AddChild(TreeView1->Selected, IntToStr(i++));
item->Data = new UnicodeString(Edit1->Text);
}
//ノードが削除された時、Dataプロパティのメモリを解放する
void __fastcall TForm1::TreeView1Deletion(TObject *Sender, TTreeNode *Node)
{
delete (UnicodeString*)Node->Data;
}
//ツリービューがクリックされた時、選択されているノードのDataプロパティの値を表示する
void __fastcall TForm1::TreeView1Click(TObject *Sender)
{
if (TreeView1->Selected)
{
UnicodeString* data = (UnicodeString*)TreeView1->Selected->Data;
Edit1->Text = *data;
}
}
(2)TTreeNodeを継承した専用のクラスを作成する方法
TTreeNodeのOnCreateNodeClassイベントを使うと、TTreeNodeを継承した独自のクラスをツリーノードに使用できます。
複雑なデータを使用する時に有効です。
TTreeNodeを継承したクラスを作成する
struct TMyNode : public TTreeNode
{
UnicodeString Data;
__fastcall TMyNode(TTreeNodes *AOwner) : TTreeNode(AOwner) {}
};
TTreeNodeをキャストして文字列を設定する
((TMyNode*)treenode)->Data = Edit1->Text;
ツリーノード(TTreeNode)をキャストして文字列を取得する
Edit1->Text = ((TMyNode*)treenode)->Data;
サンプルプログラム
フォームは上のサンプルプログラムと同じです。
int i = 0; //グローバル変数。ノードのラベルに使用する
//文字列を保持するツリーノード
struct TMyNode : public TTreeNode
{
UnicodeString Data;
__fastcall TMyNode(TTreeNodes *AOwner) : TTreeNode(AOwner) {}
};
//ノードが作成される時、ノードにはTMyNodeクラスを使用する
void __fastcall TForm1::TreeView1CreateNodeClass(TCustomTreeView *Sender, TTreeNodeClass &NodeClass)
{
NodeClass = __classid(TMyNode);
}
//追加ボタン
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TTreeNode* item = TreeView1->Items->AddChild(TreeView1->Selected, IntToStr(i++));
((TMyNode*)item)->Data = Edit1->Text;
}
//ツリービューがクリックされた時、選択されているノードのDataプロパティの値を表示する
void __fastcall TForm1::TreeView1Click(TObject *Sender)
{
if (TreeView1->Selected)
{
Edit1->Text = ((TMyNode*)TreeView1->Selected)->Data;
}
}
OnCreateNodeClassイベントを使う例は、以前にも同じような記事を書きました。([C++Builder]TTreeNodeを継承した独自のノードをツリービューに追加する « 山本隆の開発日誌)。