안녕하세요. 트리뷰땜에 미쳐가는 델초보입니다.
또 질문합니다.
트리뷰가 다음과 있습니다.
Root
a
ab
abc
ac
b
ab
bc
위와 같이 있을때, ListBox1 에 0 번째 아이템부터 ab, ac, bc 가 있고, ListBox2 에 abc 가 있다고 가정합니다.
하고자하는 작업은... ListBox1 의 아이템을 하나씩 읽어서 ListBox2 에 있는 아이템을 트리뷰에 자식노드로 달아야합니다.
자식노드가 추가되긴 되는데, 같은 값이 중복되어서 들어갑니다.
그 이유는... 위의 트리뷰에서 ab 노드 밑에 자식노드 abc 가 이미 존해하고 있습니다.
따라서, ListBox1 에 0번째 아이템에 ab 라는 노드를 트리뷰에서 찾아서 자식노드 abc를 추가하면 다음과 같은 현상이 발생하겠죠.
Root
a
ab
abc
abc <-- 문제점...
ac
abc
b
ab
abc
bc
abc
그래서 자식노드를 추가할때, 현재 노드의 바로 밑에 자식노드에 추가할 자식노드(ListBox2 의 아이템들)가 있는지 없는지를 알아야됩니다.
해결할 방법이 없을까요 ?
도와주세요.
쩝~ 예전에 했던것들을 조금씩만 응용하셨으면 될텐데....
시간나시면 트리뷰의 속성과 메소드들에대해서 델파이 헬프를 한번 차근차근 보세요...
function FindChildNode(Node: TTreeNode; const NodeText: string): Boolean;
// Node의 Child(1단계아래만검사)중에서 NodeText란 이름을 가진 노드가 있는지 검사
var
ChildNode: TTreeNode;
begin
Result := False;
ChildNode := Node.GetFirstChild; // Node의 첫번째 자식노드얻기
while ChildNode <> nil do // 자식노드가 있다면
begin
if CompareText(NodeText, ChildNode.Text) = 0 then
// 자식노드의 이름이 NodeText와 같은 이름이라면
begin
Result := True;
Break; // 루프종료
end;
ChildNode := Node.GetNextSibling; // Node의 다음번 자식노드 검색
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CurNode: TTreeNode;
Index: Integer;
begin
// 트리뷰의 모든 아이템 검사
CurNode := TreeView1.Items.GetFirstNode;
repeat
if ListBox1.Items.IndexOf(CurNode.Text) <> -1 then
// 노드 이름이 첫번째 리스트박스에 있다면
begin
for Index := 0 to ListBox2.Items.Count - 1 do
// 두번째 리스트박스에 있는 이름들을 추가
begin
if not FindChildNode(CurNode, ListBox2.Items[Index]) then
// 노드의 Child노드를 검색해서 두번째 리스트박스에 없는 이름만 추가
TreeView1.Items.AddChild(CurNode, ListBox2.Items[Index]);
end;
end;
CurNode := CurNode.GetNext;
until CurNode = nil;
end;
^^ 항상 즐코하세요...