ツリービューのノードのDataプロパティに文字列を設定する

ツリービュー(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を継承した独自のノードをツリービューに追加する « 山本隆の開発日誌)。

コメントを残す

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

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