-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;
感謝評論塞巴斯蒂安。我有這些時調用加載過程。我猜效果是一樣的? –
如果您在調用Load過程之前調用BeginUpdate,那就足夠了。但我只能對我看到的代碼發表評論。順便說一句:在PC上添加40000個項目到VCL TTreeView需要2秒鐘。 –
這是一個真正的應用程序,或者你只是做了一個測試應用程序? –