【问题标题】:Treeview save/load to xml too slowTreeview 保存/加载到 xml 太慢了
【发布时间】: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;

【问题讨论】:

    标签: xml delphi treeview


    【解决方案1】:

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

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

    【讨论】:

    • 感谢塞巴斯蒂安的评论。我在调用 Load 过程时有这些。估计效果是一样的吧?
    • 如果在调用 Load 过程之前调用 BeginUpdate,那就足够了。但我只能评论我看到的代码。顺便说一句:在我的 PC 上将 40000 个项目添加到 VCL TTreeView 需要 2 秒。
    • 这是一个真正的应用程序还是你只是做了一个测试应用程序?
    • 不是这个。如果添加 40000 个节点需要 2 秒,那就没什么好说的了。
    • @Mike 不正是需要一个测试应用来探索这个吗?
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 2023-03-27
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2013-08-18
    相关资源
    最近更新 更多