Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Treeview保存/加载到xml的速度太慢_Xml_Delphi_Treeview - Fatal编程技术网

Treeview保存/加载到xml的速度太慢

Treeview保存/加载到xml的速度太慢,xml,delphi,treeview,Xml,Delphi,Treeview,目前,treeview中有大约40000个节点,这是XE6的标准TTreeView。 问题在于,保存/加载需要很长时间(大约2分钟),并且节点数量预计将在未来增长 你对提高速度有什么看法?除了xml,还有其他保存/加载方式吗?还有其他treeview组件吗 编辑:好的,全部真相,除了真相什么都没有。我只是测量了(没有使用奇特的仪器,只有一个密西西比河,两个密西西比河,…)负载/节省时间。保存时间约为5秒,加载时间略少于5秒。它感觉非常迟钝,反应迟钝,我觉得它花了2分钟 谢谢 代码: proced

目前,treeview中有大约40000个节点,这是XE6的标准TTreeView。 问题在于,保存/加载需要很长时间(大约2分钟),并且节点数量预计将在未来增长

你对提高速度有什么看法?除了xml,还有其他保存/加载方式吗?还有其他treeview组件吗

编辑:好的,全部真相,除了真相什么都没有。我只是测量了(没有使用奇特的仪器,只有一个密西西比河,两个密西西比河,…)负载/节省时间。保存时间约为5秒,加载时间略少于5秒。它感觉非常迟钝,反应迟钝,我觉得它花了2分钟 谢谢

代码:

procedure TTree.Save(aTreeView:TTreeView;aFilePath:String);
变量
三电极:三电极;
oXMLDocument:IXMLDocument;
oXMLNode:IXMLNode;
过程ProcessTreeItem(aTreeNode:TTreeNode;aXMLNode:IXMLNode);
变量
oTemp:IXMLNode;
开始
如果(aTreeNode=nil),则退出;
oTemp:=aXMLNode.AddChild('item');
oTemp.Attributes['text']:=aTreeNode.text;
oTemp.Attributes['NodeID']:=TNode(aTreeNode.Data).ID;
oTemp.Attributes['NodeType']:=TNode(aTreeNode.Data).NodeType;
oTemp.Attributes['Selected']:=aTreeNode.Selected;
aTreeNode:=aTreeNode.getFirstChild;
当一个无节点开始时
ProcessTreeItem(aTreeNode,oTemp);
aTreeNode:=aTreeNode.getNextSibling;
结束;
结束;
开始
oXMLDocument:=NewXMLDocument;
选项:=[doNodeAutoIndent];
oXMLNode:=oXMLDocument.AddChild('xml');
OthereNode:=aTreeView.TopItem;
当三端零开始时
ProcessTreeItem(oTreeNode,oXMLNode);
oTreeNode:=oTreeNode.getNextSibling;
结束;
oXMLDocument.SaveToFile(文件路径);
结束;
过程TTree.Load(aTreeView:TTreeView;aFilePath:String);
变量
oXMLNode:IXMLNode;
oXMLDocument:IXMLDocument;
过程进程节点(aXMLNode:IXMLNode;aTreeNode:TTreeNode);
变量
扩展:布尔型;
oNodeData:TNode;
oTemp:IXMLNode;
开始
如果aXMLNode=nil,则退出;
oNodeData:=CreateNode(整数(aXMLNode.Attributes['NodeID']),aXMLNode.Attributes['NodeType']);
aTreeNode:=aTreeView.Items.AddChildObject(aTreeNode,aXMLNode.Attributes['text'],oNodeData);
aTreeNode.Selected:=aXMLNode.Attributes['Selected'];
oTemp:=aXMLNode.ChildNodes.First;
而oTemp nil确实开始了
ProcessNode(oTemp,aTreeNode);
oTemp:=oTemp.NextSibling;
结束;
结束;
开始
aTreeView.Items.Clear;
oXMLDocument:=NewXMLDocument;
LoadFromFile(aFilePath);
oXMLNode:=oXMLDocument.DocumentElement.ChildNodes.First;
而oXMLNode nil不开始
ProcessNode(oXMLNode,nil);
oXMLNode:=oXMLNode.NextSibling;
结束;
结束;

查看您的代码时,我错过了开始更新/结束更新。这可以大大提高速度

aTreeView.Items.BeginUpdate;
try
  // clear and add your items here

finally
  aTreeView.Items.EndUpdate;
end;

谢谢你的评论,塞巴斯蒂安。我在调用加载过程时有这些。我猜效果是一样的?如果在调用加载过程之前调用BeginUpdate,那就足够了。但我只能对我看到的代码发表评论。顺便说一句:在我的电脑上向VCL TTreeView添加40000个项目需要2秒钟。这是一个真正的应用程序还是你刚刚制作了一个测试应用程序?这不是。如果添加40000个节点需要2秒钟,那就没什么好说的了。@Mike不是一个测试应用程序,探索这一点需要什么?
aTreeView.Items.BeginUpdate;
try
  // clear and add your items here

finally
  aTreeView.Items.EndUpdate;
end;