2014-05-24 85 views
-5

目前樹形視圖中有40,000個節點,它是XE6的標準TTreeView。 問題是保存/加載需要很長時間(大約2分鐘),並且未來預計節點數量會增加。Treeview保存/加載到xml太慢

您對提高速度有什麼看法?除了xml,還有其他的保存/加載方式嗎?任何其他treeview組件?

編輯:好吧,整個事實,只有真相。我只是測量(不使用任何奇特的儀器,只有一個密西西比,兩個密西西比,......)加載/保存時間。保存約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; 

回答

3

當你的代碼看着我錯過的BeginUpdate/EndUpdate。這可以大大提高速度。

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

finally 
    aTreeView.Items.EndUpdate; 
end; 
+0

感謝評論塞巴斯蒂安。我有這些時調用加載過程。我猜效果是一樣的? –

+0

如果您在調用Load過程之前調用BeginUpdate,那就足夠了。但我只能對我看到的代碼發表評論。順便說一句:在PC上添加40000個項目到VCL TTreeView需要2秒鐘。 –

+0

這是一個真正的應用程序,或者你只是做了一個測試應用程序? –