Delphi什么是填充VirtualStringTree的理想方法?
所以我正在与德尔福2010年,它已经有一段时间,因为我开始使用VirtualTreeView(正是VirtualStringTree)..似乎我在做一些错误的方式..因为事情不起作用,因为我是期待。
我试图用指向存储在数据记录中的文件/子文件夹描述的节点来填充我的VST,并通过扫描用户给出的路径生成它们。(更多详细信息如下图所示)
因为它显示节点以奇怪的方式显示..不管我做了什么节点数据没有正确初始化..节点字幕的“文件”列是唯一的工作。
这里是我使用的代码:
1- 节点数据声明 :
type nodeData=record
Text, Size, Path:String;
ImageIndex:Integer;
end;
PNodeData=^nodeData;
var hashmap:TDictionary<String, PVirtualNode>; // hashmap-> to store parent nodes (Folder)
filesList:TDictionary<Integer,nodeData>; // fileList to store records of data
2- 方法
a)扫描用户给出的路径
procedure AddAllFilesInDir(const Dir:String);
begin
// it scans the path 'Dir' and extract the "name & size" of each file/folder found in this dir
end;
b)生成filesList tdictionary ...&图像存储在链接到treeview.images属性的“ treeImageLIst ”中
procedure addFileToList(Name, Size:String);
var d:nodeData;
parent:String;
SHFileInfo :TSHFileINfo;
Icon:TIcon;
begin
parent:=ExtractFileDir(Name);
//Get The Icon That Represents The File/Folder
SHGetFileInfo(PChar(Name), 0, SHFileInfo, SizeOf(SHFileInfo),
SHGFI_ICON or SHGFI_SMALLICON );
Icon := TIcon.Create;
Icon.Handle := SHFileInfo.hIcon;
// set The Name, Size, Path
d.Name:=ExtractFileName(Name);
d.Size:=Size;
d.Path:=parent;
// set the ImageIndex
d.ImageIndex:=Form1.treeImageList.AddIcon(Icon);
// add the node to fileList
filesList.Add(filesList.Count, d);
// Destroy the Icon
DestroyIcon(SHFileInfo.hIcon);
Icon.Free;
end;
c)创建树“theTree”
procedure createTree();
var theNode, Node:PVirtualNode;
d:PNodeData;
parent:String;
nData:nodeData;
i:integer;
begin
for i := 0 to filesList.Count - 1 do
begin
nData:=filesList.Items[i]; parent:=nData.Path;
if(hashmap.ContainsKey(parent))then theNode:=hashmap.Items[parent]
else theNode:=nil;
Node:=Form1.theTree.AddChild(theNode);
// add a checkbox and make it checked
Node.CheckType:=ctCheckBox;
Node.CheckState:=csCheckedNormal;
// get the newly created node data
d:=Form1.theTree.GetNodeData(Node);
// assign a data to the newly created node
d^:=nData;
// add the node to hashmap if it's a new folder node
if((ExtractFileExt(nData.Text)='')and(not hashmap.ContainsKey(nData.Path+''+nData.Text)))
then hashmap.Add(nData.Path+''+nData.Text, Node);
end;
Form1.theTree.Expanded[Form1.theTree.TopNode]:=True;
end;
d)树视图事件
procedure TForm1.theTreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var d:PNodeData;
begin
d := Sender.GetNodeData(Node);
Finalize(d^);
end;
procedure TForm1.theTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
var d:PNodeData;
begin
d:=Sender.GetNodeData(Node);
case Column of
0:CellText:=d^.Text;
1:CellText:=d^.Size;
end;
end;
procedure TForm1.theTreeGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
var d:PNodeData;
begin
d:=Sender.GetNodeData(Node);
if(Kind in [ikNormal, ikSelected])then
begin
if(Column=0)then ImageIndex:=d^.ImageIndex;
end;
end;
我真的很沮丧,现在..我不知道为什么节点没有正确创建..尽管我测试了记录数据,并且他们创建的很好,但是当我测试onNodeClick事件时,我发现节点指向的数据记录只返回第一个字段..而其他字段为空或者它们生成访问冲突异常 。
你已经发布了太多的代码来提出一个有用的问题。 每天发布数百个问题,其中没有代码示例,或没有足够的代码示例。 你已经走了另一条路,真的是另一条路。
“填充”虚拟树视图的最佳方式是不填充它。 相反,您只需设置rootNodeCount
,然后在需要时迭代地设置子节点的子节点计数。 对于折叠节点,树视图知道有子节点或者没有子节点就足够了。 一旦你展开一个子节点,你可以填充子元素。
请注意,当你按照虚拟控制的方式来完成时,你并没有编写大量的代码。 相反,您只是“回答有关模型对象基础状态的问题”。 有多少根节点? 你告诉虚拟树那个数字。 然后,从那里开始,您只需在询问时回答问题。 第0列的文本对于根节点下的节点#3是什么? (它调用你处理的事件,并返回该信息)。 请注意,初始化DATA是大多数VirtualTreeViews新手常常误解的人。 理想情况下,数据应该包含一个指向真实模型对象的指针,可以回答VirtualTreeView提出的问题。 回答这些问题的最有效的类可能甚至不需要为树中的每个可见节点实例化一个真正的模型对象,虽然这当然是可以接受的和常见的。 尽管如此,了解它并非严格意义上的ESSENTIAL是很重要的。
其次,如果您的目标是使用TVirtualTreeView来模拟shell浏览器,那么该代码已经为您完成了,请参阅VirtualTreeview网站上提供的Advanced VT演示的子部分。 看看我在这里指出的标签:
链接地址: http://www.djcxy.com/p/35001.html上一篇: Delphi what is the Ideal method to populate a VirtualStringTree?