TreeViewコンポーネントの基本的な使い方のメモ。(TreeViewは、エクスプローラのフォルダの階層構造のような表示が出来るコンポーネント)
サンプルプログラムを通して記録。
目次
フォーム設計
画面のイメージと設定値。
設計イメージ |
---|
object Form1: TForm1 Left = 0 Top = 0 Caption = 'TreeView'#12486#12473#12488 ClientHeight = 220 ClientWidth = 359 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object TreeView1: TTreeView Left = 24 Top = 24 Width = 169 Height = 177 DragMode = dmAutomatic HideSelection = False HotTrack = True Indent = 19 ReadOnly = True TabOrder = 0 OnDragDrop = TreeView1DragDrop OnDragOver = TreeView1DragOver end object Button1: TButton Left = 232 Top = 24 Width = 97 Height = 25 Caption = #12450#12452#12486#12512#36861#21152 TabOrder = 1 OnClick = Button1Click end object Button2: TButton Left = 232 Top = 71 Width = 97 Height = 25 Caption = #23376#12450#12452#12486#12512#36861#21152 TabOrder = 2 OnClick = Button2Click end object Button3: TButton Left = 232 Top = 120 Width = 97 Height = 25 Caption = #21066#38500 TabOrder = 3 OnClick = Button3Click end end
実行イメージ |
---|
動作の仕様
- アイテム追加で、アイテムが後ろに新規追加されていきます。
- 子アイテム追加で、選択されているアイテムの配下に子アイテムを新規追加します。
- 削除で、選択されているアイテムを削除します。
- アイテムをドラッグ&ドロップすることで、移動することが出来ます。
各動作の説明
アイテムの追加
//--------------------------------------------------------------------------- // 同階層にアイテムを追加する void __fastcall TForm1::Button1Click(TObject *Sender) { // 追加する TTreeNode *p = TreeView1->Selected; TTreeNode *x = TreeView1->Items->Add(p, ItemName("Item")); if (p != NULL) { // 選択されていたら、そのアイテムの手前に移動する x->MoveTo(p, naInsert); } } //---------------------------------------------------------------------------
TreeView1->Selectedプロパティは、選択中のアイテムへのポインタを返します。Addメソッドは指定ノードと同じリストに新しいノードを追加し、そのポインタを返します。
指定した場所にアイテムを追加するメソッドは無いので、追加した後にMoveToメソッドで移動&挿入しています。MoveToメソッドの第二引数の意味を下表に示します。
値 | 意味 |
---|---|
naAdd | 末尾に追加 |
naAddFirst | 先頭に追加 |
naAddChild | 子ノードの末尾に追加 |
naAddChildFirst | 子ノードの先頭に追加 |
naInsert | 後ろに追加 |
子アイテムの追加
//--------------------------------------------------------------------------- // 配下に子アイテムを追加する void __fastcall TForm1::Button2Click(TObject *Sender) { TTreeNode *p = TreeView1->Selected; if (p != NULL) { // 選択されていたら、子アイテム追加 TreeView1->Items->AddChild(p, ItemName("Item")); // 子ノードを展開する p->Expand(false); } } //---------------------------------------------------------------------------
AddChildメソッドにて、子アイテムを追加します。標準ではノードは折り畳まれているので、Expandメソッドにて展開させています。
アイテムの削除
//--------------------------------------------------------------------------- // 選択されたアイテムを削除する void __fastcall TForm1::Button3Click(TObject *Sender) { TTreeNode *p = TreeView1->Selected; if (p != NULL) { // 選択されていたら削除する. p->Delete(); } } //---------------------------------------------------------------------------
Deleteメソッドにて選択されたアイテムを削除しています。
ドラッグ中の処理
//--------------------------------------------------------------------------- // ドロップ許可を決定する // Dragを有効にするには、DragMode = dmAutomatic に設定する. // 何かがDragされてきた時に許可/不許可を返す. void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { if (Source == TreeView1 && TreeView1->GetNodeAt(X,Y) != NULL) { // ドラッグ元が自分自身かつ、 // 現在の座標下にノードが存在するなら許可 Accept = true; } else { // 条件を満たさないドラッグであれば不許可 Accept = false; } if (Y < 15) { // 上へスクロール SendMessage(TreeView1->Handle, WM_VSCROLL, SB_LINEUP, 0); } else if (TreeView1->Height-Y < 15) { // 下へスクロール SendMessage(TreeView1->Handle, WM_VSCROLL, SB_LINEDOWN, 0); } } //---------------------------------------------------------------------------
イベントの記述に先立ち、ドラッグ&ドロップの機能を有効にするためにTreeView1->DragMode = dmAutomaticとしておく必要があります。
このイベントはドラッグ中に常に発生します。ドロップ可能ならばAcceptにtrueを与えることでその旨を伝えます。GetNodeAtメソッドは座標(X,Y)にあるノードを返すメソッドです。自分自身からのドラッグで、かつ、ドロップ先にノードがある場合に許可しています。
また、ドロップ先が表示外だった場合に自動的にスクロールしません。プログラマが実装する必要があります。画面の上端・下端の場合に、スクロールメッセージを発行することで、スクロールさせます。
ドロップの処理
//--------------------------------------------------------------------------- // ドロップ時の処理 // ドロップ先に挿入する. void __fastcall TForm1::TreeView1DragDrop(TObject *Sender, TObject *Source, int X, int Y) { if (Sender == TreeView1 && Source == TreeView1) { TTreeNode *pFrom = TreeView1->Selected; TTreeNode *pTo = TreeView1->GetNodeAt(X,Y); if (pFrom != pTo) { // ドラッグ先が選択中、つまり // ドラッグ元=ドラッグ先の場合は何もせず無視. pFrom->MoveTo(pTo, naInsert); // 移動後に子ノードが格納されてしまうので再展開する. pFrom->Expand(false); } } } //---------------------------------------------------------------------------
ドラッグ中と同様の情報が引数として与えられます。
その他
ノードにアイコンを付ける場合
- TTreeView->Imagesプロパティおよび->StateImagesに、アイコンのデータを持ったImageListコンポーネントを関連付けます。
- TTreeNodeのプロパティにImageListのイメージ番号を指定することでアイコンが表示されます。
プロパティ名 | 意味 |
---|---|
ImageIndex | 通常時のイメージ番号(Images) |
SelectedIndex | 選択時のイメージ番号(Images) |
StateIndex | 1〜15までのイメージ番号(StateImages) |
Imagesを使った場合は強制的にアイコン表示となり、無効のイメージ番号を指定してもその分のスペースが表示されます。一方、StateImagesを使うと1から15までの15個しかイメージを使えませんが、-1など無効なイメージ番号を指定するとアイコンが表示されなくなります。
主なプロパティとメソッド
TTreeView
プロパティ名 | 説明 |
---|---|
AutoExpand | 選択されたノードを自動展開するか否か。 |
HideSelection | フォーカスが別コントロールに移動したときに選択状態を表示するかどうか。 |
Items | 表示されるTTreeNodesオブジェクト。 |
MultiSelect | 複数のノードを選択できるようにするか。 |
ReadOnly | ユーザが内容を変更できるか。 |
Selected | 現在選択されているノードオブジェクト(TTreeNode)。 |
ShowButtons | 子を持つノードの左側に[+][-]のマークを表示するか。 |
ShowLines | 各ノードを繋ぐ線を表示するか。 |
ShowRoot | ノードの親への線を表示するか。 |
SortType | 自動的にソートするかどうかを指定。stNode=ソートしない。stData=TTreeNode->Dataの変更時にソート。stText=TTreeNode->Captionの変更時にソート。stBoth=stDataとstTextの両方。ソート時にはOnCompareイベントが発生するので比較用のコードを記述しておく。 |
メソッド名 | 説明 |
---|---|
FullCollapse | 全てのノードをたたむ。 |
FullExpand | 全てのノードを展開する。 |
GetNodeAt | 座標で示されるノードオブジェクトを返す。 |
LoadFromFile | ファイルからツリービューを読み込む。 |
SaveToFile | ツリービューをファイルへ書き出す。 |
TTreeNodes
プロパティ名 | 説明 |
---|---|
Count | ツリービュー内のノード数。 |
Item[n] | n番目のノードへのアクセス。TTreeNodeオブジェクトを返す。 |
Owner | 親となるツリービュー。 |
メソッド名 | 説明 |
---|---|
Add | 新しいノードを後尾に追加。 |
AddChild | 新しい子ノードを追加。 |
AddFirst | 新しいノードを先頭に追加。 |
Clear | ツリービューの全てのノードを削除する。 |
Delete | 指定ノードを削除する。 |
Insert | 指定ノードの後にノードを挿入する。 |
TTreeNode
プロパティ名 | 説明 |
---|---|
Count | 子ノードの数。 |
Data | ユーザデータ格納用のvoidポインタ。 |
Expanded | このノードが展開されているか。 |
HashChildren | 子ノードを持っているか。[+]マークはココを見ている。 |
ImageIndex | 「ノードにアイコンを付ける場合」参照。 |
SelectedIndex | 「ノードにアイコンを付ける場合」参照。 |
StateIndex | 「ノードにアイコンを付ける場合」参照。 |
Index | 同じ親を持つ階層のノードに振られる番号。 |
Item | 子ノードへのアクセス。 |
Level | ツリービュー内のノードのレベル。 |
Parent | 親ノード。 |
Selected | ノードが選択されているか。 |
Text | ノードに表示されるテキスト。 |
メソッド名 | 説明 |
---|---|
Collaspe | 子ノードを折り畳む。 |
Delete | ノードを削除する。 |
DeleteChildren | 子ノードを全て削除する。 |
Expand | 子ノードを展開する。 |
MoveTo | ノードを移動する。「各動作の説明−アイテムの追加」参照。 |
サンプルのソース
- 今回作成したプログラムのソース。