首先建立树节点所用的记录类型
type
HXL_TNode = record
name:string;
desc:string;
BRoot:Boolean;
end;
定义该类型指针
pHXL_TNode = ^ HXL_TNode;
然后在 virtualstringtree 所在的 frame 或者 form 的 create 函数中,初始化你的 virtualtree
添加列:vrtlstrngtr1.Header.Columns.Add
设置第 n 列的名称 vrtlstrngtr1.Header.Columns[n].Text := ‘ 名字 ’;
设置第 n 列的宽度:vrtlstrngtr1.Header.Columns[n].Width := 120;
设置折叠在第 n 列进行:vrtlstrngtr1.Header.MainColumn := n;
设置树节点所占的空间大小:vrtlstrngtr1.NodeDataSize := SizeOf(HXL_TNode);
假设你所定义的 virtualstringtree 为 vrtlstrngtr1
p_node: pHXL_TNode;
p_node1, p_node2: PVirtualNode;
建立父节点:
p_node1 := vrtlstrngtr1.AddChild(nil);
p_node := vrtlstrngtr1.GetNodeData(p_node1);
p_node^.name :=‘绿茶’;
p_node^.desc :=‘不发酵的茶’;
p_node^.BRoot := True;
注意:不是用 p_node1.parent 是不是为空来判断是不是父节点,p_node1 的父节点不是空节点,而是 vrtlstrngtr1.RootNode. 如果你想自己控制,则可以自己定义 BRoot 成员,来判断是不是根节点。
添加子节点
p_node2 := vrtlstrngtr1.AddChild(p_node1);
p_node := vrtlstrngtr1.GetNodeData(p_node2);
p_node^.name := '西湖龙井';
p_node^.desc :=‘产地西湖的名茶’;
p_node^.BRoot := False;
如果要显示,则需要在 Events 中点击 OnGetText 右面的空白出,自动生成 vrtlstrngtr1GetText 函数:
procedure 树所在的 frame 或者 form 的类.vrtlstrngtr1GetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
p_node: pHXL_TNode;
begin
p_node := Sender.GetNodeData(Node);
case Column of
0: CellText := p_node.name;
1: CellText := p_node.desc;
end;
end;
点击 virtual string tree 要做处理,则需要在 events 中点击 OnClick 右面的空白处,就会自动生成一个 vrtlstrngtr1Click(Sender: TObject) 函数
这里添加你要做的处理
获取所点击的节点
p_node := vrtlstrngtr1.FocusedNode; 如果点击的地方不在节点出,则会返回空,做处理时,需要加以判断。
如果你想设置某节点 p_node1 以高亮形式显示给用户:
首先设置该节点被选中,vrtlstrngtr1.Selected[p_node1] := True; 此时该节点的背景色是灰色,如果想设置其它颜色,则在属性中设置:properties->colors->UnfocusedSelectionColor 中设置. 如果你想起父节点也能在当前树的窗体中显示出来,则只需 vrtlstrngtr1.FocusedNode := p_node1 父节点;
将树完全折叠起来用 vrtlstrngtr1.FullCollapse(nil);
将树在节点 p_node 处展开用 vrtlstrngtr1.Expanded[p_node] := True;
树节点用的比较多的属性:ChildCount,NextSibling,PrevSibling,Parent,FirstChild,LastChild.