目前树视图中有大约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;
答案 0 :(得分:3)
查看代码时,我错过了BeginUpdate / EndUpdate。这可以大大提高速度。
aTreeView.Items.BeginUpdate;
try
// clear and add your items here
finally
aTreeView.Items.EndUpdate;
end;