-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;
감사합니다. Sebastian. Load 프로 시저를 호출 할 때이 메소드가 있습니다. 나는 효과가 같다고 생각하니? –
Load 프로 시저를 호출하기 전에 BeginUpdate를 호출하면 충분합니다. 하지만 내가 본 코드에 대해서만 언급 할 수 있습니다. BTW : VCL에 40000 개 항목 추가 TTreeView는 내 PC에서 2 초가 걸립니다. –
실제 응용 프로그램입니까 아니면 방금 테스트 응용 프로그램을 만들었습니까? –