Treeview保存/加载到xml太慢了

时间:2014-05-24 15:07:42

标签: xml delphi treeview

目前树视图中有大约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;

1 个答案:

答案 0 :(得分:3)

查看代码时,我错过了BeginUpdate / EndUpdate。这可以大大提高速度。

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

finally
  aTreeView.Items.EndUpdate;
end;