2014-05-24 3 views
-5

현재 XE6의 표준 TTreeView 인 treeview에는 약 40,000 개의 노드가 있습니다. 저장 /로드 시간이 오래 걸리고 (약 2 분) 노드의 수가 미래에 증가 할 것으로 예상됩니다.Treeview 저장 /로드가 너무 느림

속도 개선에 대한 의견은 어떻습니까? 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; 

답변

3

나는 동시에 BeginUpdate /와 EndUpdate를 그리워 코드를 찾고 있습니다. 그러면 속도가 크게 향상 될 수 있습니다.

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

finally 
    aTreeView.Items.EndUpdate; 
end; 
+0

감사합니다. Sebastian. Load 프로 시저를 호출 할 때이 메소드가 있습니다. 나는 효과가 같다고 생각하니? –

+0

Load 프로 시저를 호출하기 전에 BeginUpdate를 호출하면 충분합니다. 하지만 내가 본 코드에 대해서만 언급 할 수 있습니다. BTW : VCL에 40000 개 항목 추가 TTreeView는 내 PC에서 2 초가 걸립니다. –

+0

실제 응용 프로그램입니까 아니면 방금 테스트 응용 프로그램을 만들었습니까? –