【发布时间】:2014-05-24 15:07:41
【问题描述】:
目前树视图中有大约 40,000 个节点,这是 XE6 的标准 TTreeView。 问题是保存/加载需要很长时间(大约 2 分钟),并且预计未来节点数量会增加。
您对提高速度有何看法?除了xml之外还有其他的保存/加载方式吗?还有其他树视图组件吗?
编辑:好的,全部真相,只有真相。我只是测量了(没有使用花哨的仪器,只有一个密西西比,两个密西西比,......)加载/保存时间。保存大约 5 秒,加载略少于 5 秒。它只是感觉如此缓慢和反应迟钝,以至于我觉得它花了 2 分钟。 :) 谢谢
代码:
procedure TTree.Save(aTreeView: TTreeView; aFilePath: String);
var
oTreeNode: TTreeNode;
oXMLDocument: IXMLDocument;
oXMLNode: IXMLNode;
procedure ProcessTreeItem(aTreeNode: TTreeNode; aXMLNode: IXMLNode);
var
oTemp: IXMLNode;
begin
if (aTreeNode = nil) then Exit;
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;
while aTreeNode <> nil do begin
ProcessTreeItem(aTreeNode, oTemp);
aTreeNode := aTreeNode.getNextSibling;
end;
end;
begin
oXMLDocument := NewXMLDocument;
oXMLDocument.Options := [doNodeAutoIndent];
oXMLNode := oXMLDocument.AddChild('xml');
oTreeNode := aTreeView.TopItem;
while oTreeNode <> nil do begin
ProcessTreeItem(oTreeNode, oXMLNode);
oTreeNode := oTreeNode.getNextSibling;
end;
oXMLDocument.SaveToFile(aFilePath);
end;
procedure TTree.Load(aTreeView: TTreeView; aFilePath: String);
var
oXMLNode: IXMLNode;
oXMLDocument: IXMLDocument;
procedure ProcessNode(aXMLNode: IXMLNode; aTreeNode: TTreeNode);
var
bExpanded: Boolean;
oNodeData: TNode;
oTemp: IXMLNode;
begin
if aXMLNode = nil then Exit;
oNodeData := CreateNode(Integer(aXMLNode.Attributes['NodeID']), aXMLNode.Attributes['NodeType']);
aTreeNode := aTreeView.Items.AddChildObject(aTreeNode, aXMLNode.Attributes['text'], oNodeData);
aTreeNode.Selected := aXMLNode.Attributes['Selected'];
oTemp := aXMLNode.ChildNodes.First;
while oTemp <> nil do begin
ProcessNode(oTemp, aTreeNode);
oTemp := oTemp.NextSibling;
end;
end;
begin
aTreeView.Items.Clear;
oXMLDocument := NewXMLDocument;
oXMLDocument.LoadFromFile(aFilePath);
oXMLNode := oXMLDocument.DocumentElement.ChildNodes.First;
while oXMLNode <> nil do begin
ProcessNode(oXMLNode, nil);
oXMLNode := oXMLNode.NextSibling;
end;
end;
【问题讨论】: