我刚刚发现了这个组件并开始使用它.
我知道它的整个概念是在需要的时候初始化节点,但我需要所有节点立即初始化.
有什么聪明的方法呢?
我想出的唯一一件事是在添加节点后使用GetLast().
我相信,还有更好的方法吗?
我的树有两级节点 - 它是一个联系人列表样式树.
我的问题是,我希望在所有"联系人类别"中检查所有联系人.这是我现在看的联系人列表的截图(是的,我有权发布)

如您所见,Todd Hirsch在类别测试类别中进行了检查,但未在所有联系人中进行检查.我想要实现的目标是让联系人在每个类别中都具有相同的检查状态.
示例:我在测试类别中检查Todd Hirsch - Todd Hirsch会自动检入所有联系人(以及其他所有类别).如果我在所有联系人中查看Todd Hirsch,他也将在测试类别中进行检查.如果我在所有联系人中取消选中Todd Hirsch,他也将在测试类别中取消选中.
我尝试通过VirtualStringtree的OnChecking事件,通过循环遍历树中每个节点的整个树,但是当联系人列表很大(2000 +)时,它非常慢,当它有5000+时,它甚至可能崩溃我的程序(应用程序已停止工作)
你有什么建议?
这是我用来确保只检查一次联系人的代码.(这不是我现在想要的,但这就是我现在正在使用的.)
////////////////////////////////////////////////////////////////////////////////
/// HasDuplicateChecked
////////////////////////////////////////////////////////////////////////////////
Function HasDuplicateChecked(Node: PVirtualNode): PVirtualNode;
Var
ParentNode, ChildNode: PVirtualNode;
I, J: Integer;
Begin
// IHCW
Result := Nil;
// Get the first node of the tree..
ParentNode := VT.GetFirst;
// Loop thru the parent nodes.
for I := 0 to VT.RootNodeCount - 1 do
begin
// Get …Run Code Online (Sandbox Code Playgroud) 假设我有这个节点数据记录:
Type
PPerson = ^TPerson;
TPerson = record
Name: String;
Age: Integer;
SomeBool: Boolean;
end;
Run Code Online (Sandbox Code Playgroud)
要填充我的VirtualStringTree,我会这样做:
Procedure AddToTree(Person: TPerson);
Var
Node: PVirtualNode;
Data: PPerson;
Begin
Node := VT.AddChild(nil);
Data := VT.GetNodeData(Node);
Data.Name := Person.Name;
Data.Age := Person.Age;
Data.SomeBool := Person.SomeBool;
End;
Procedure TMyForm.MyButtonClick(Sender: TObject);
Var
Person: TPerson;
Begin
Person.Name := 'Jeff';
Person.Age := 16;
Person.SomeBool := False;
AddToTree(Person);
End:
Run Code Online (Sandbox Code Playgroud)
现在,虽然这很好用,但我想简化它,所以每当我向记录添加新字段时,我都不会修改AddToTree方法.
所以我尝试了这个:
Procedure AddToTree(Person: TPerson);
Begin
VT.AddChild(nil,@Person);
End;
Run Code Online (Sandbox Code Playgroud)
这个编译,但似乎PVirtualNode没有得到数据,因为我的VT没有显示任何东西,并且当打破OnGetText事件时,我看到变量是空的.
我究竟做错了什么?:)
我在Windows 7上遇到了VirtualTreeView组件的问题.我添加了一个TVirtualStringTree并使用OnGetImageIndex事件来分配ImageIndex,它始终处于调试器非零值.
VirtualStringTree使用带有16x16图标的TImageList作为Images属性.
在Windows XP上它可以正常工作,在Windows 7上,它在正常图标的顶部与TImageList的索引为0的图标重叠.我在Windows 7上运行与在XP上相同的程序,因此代码是相同的,但绘图是不同的.
此图片说明了问题:
virtualtreeview问题http://i42.tinypic.com/6sb8ko.jpg
灰色三角形图标的索引为0,文件夹图标的索引为5.
这是VirtualStringTree中的错误吗?我可以以某种方式避免这个吗?
我正在使用存储库中的最新VirtualTreeView版本.
我正在寻找一个程序或一些东西,如果我右键单击一个节点(或通常在VirtualStringTree上)被解雇
我有以下场景:
现在我希望为我的所有子节点(仅当它们被选中)有一个不同的弹出菜单(1个常用).
希望你能理解我的意思,谢谢你的帮助.
我已将ShowHint设置为true,将HintMode设置为hmToolTip,但是当我将光标悬停在控件上时,我的OnGetHint()事件处理程序甚至没有断点.
知道我做错了什么吗?
.
另外,有没有人对良好的文档,教程等有任何提示?例如,我在哪里可以找到HintMode属性的各种值实际意味着什么?
网站上的文档非常不完整,"使用其他资源如新闻组或Delphi Gems留言板查找说明"这一短语在HMTL帮助中发生了789次 - 通常我真正需要帮助的地方: - /
[更新]事实上,如果记录在案,我会愿意使用另一个组件,即使是少一个组件.
谢谢 !
我正在尝试将项目从D6移动到D-XE3.使用VirtualStringTree版本5.10在OnSaveNode和OnLoadEvents中保存和加载树数据时,我得到了垃圾.我可能没有正确处理Unicode,但我可能还有其他一些无知:
procedure TfMain.vstGridSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
var
Data: PStkData;
begin
Data := Sender.GetNodeData(Node);
// Owned: boolean;
Stream.Write(Data.Owned, SizeOf(boolean) );
// Symbol: string;
Stream.Write(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));
// AvgTarget: currency;
//Stream.Write(Data.AvgTarget, SizeOf(currency));
// PE: double;
Stream.Write(Data.PE, SizeOf(double));
end;
procedure TfMain.vstGridLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
var
Data: PStkData;
begin
Data := Sender.GetNodeData(Node);
//Owned: boolean;
Stream.Read(Data.Owned, SizeOf(boolean));
//Symbol: string;
Stream.Read(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));
//AvgTarget: currency;
Stream.Read(Data.AvgTarget, SizeOf(currency));
//PE: double;
Stream.Read(Data.PE, SizeOf(double));
end;
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
delphi unicode virtualtreeview tvirtualstringtree delphi-xe3
我有一个VirtualTreeView,它最初隐藏了一些列(coVisible不存在).
启用它们(添加coVisible到列选项)后会发生奇怪的事情 - 列出现但与前一列重叠.我可以通过将宽度更改为1像素更小,然后返回到列的原始宽度来强制重新绘制,然后正确显示列,从而解决问题.
除了添加coVisible以使列重新正确显示之外,还有什么我需要做的吗?
我需要以编程方式在VirtualTreeview中选择一个特定节点,但我找不到任何方法.有人可以帮忙解决问题吗?
我有一个将Header.Column设置为taLeftJustify(默认)的VirtualStringTree .
有没有办法设置该列的单元格/节点,taRightJustify以便节点将向右对齐,但标题列文本将向左对齐?
这是我想要的结果(在第1栏):
我使用的是相当旧的VT版本4.5.5
delphi ×10
virtualtreeview ×10
c++builder ×1
checkbox ×1
delphi-7 ×1
delphi-xe3 ×1
duplicates ×1
pointers ×1
unicode ×1