【发布时间】:2019-09-23 04:00:44
【问题描述】:
我正在使用带有虚拟树视图的 Delphi XE3。
我的代码如下:
type
TMyData = record
Caption: string;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
RootNode: PVirtualNode;
PData: ^TMyData;
begin
RootNode := tvItems.AddChild(nil);
PData := tvItems.GetNodeData(RootNode);
PData^.Caption := 'This is a test node';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
tvItems.NodeDataSize := SizeOf(TMyData);
end;
procedure TForm1.tvItemsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
PData: ^TMyData;
begin
if Assigned(Node) then
begin
PData := tvItems.GetNodeData(Node);
if Assigned(PData) then
Celltext := PData^.Caption;
end;
end;
当我单击“Button1”时,将创建根节点。但是,当我的鼠标点击节点文本时,它不会被选中。
我的一些发现:
必须单击节点文本的开头才能选择节点。如果单击节点文本的中间或末尾,则不会选择节点。
如果我把 tvItemsGetText 改成下面,那么问题就消失了:
procedure TForm1.tvItemsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
PData: ^TMyData;
begin
CellText := 'This is a test node';
end;
我在 tvItemsGetText 中设置了一个断点,发现它会被调用多次。在前几次,PData 将为 nil,这使 CellText 为空。在最终调用时,PData 将变为有效,并且 CellText 将设置为“这是一个测试节点”。
似乎允许鼠标单击并选择节点的范围是由节点的初始文本确定的。如果初始文本为空字符串,则必须单击节点的最开始处才能选择它。
这是虚拟树视图的错误吗?
【问题讨论】:
-
the range that allow mouse click and select the node is determined by the initial texts- 是的。使用tvItems.BeginUpdate-> 更改树结构 ->tvItems.EndUpdate。或者 - 使用AddChild第二个参数(用户数据:指针) -
@kami,非常感谢。我有两个问题: 1. 我应该为我添加的每个节点使用 BeginUpdate 和 EndUpdate 吗?节点不是批量添加的。 2、如何使用UserData参数?我检查了文件,它没有提到它。并且示例代码也不使用它。
标签: delphi select virtualtreeview