안녕하세요.
태풍피해는 없으신지요.
procedure TForm1.Button1Click(Sender: TObject);
var
FoundNode : string;
begin
FoundNode := Edit1.Text;
SearchNode(FoundNode);
end;
procedure TForm1.SearchNode(const NodeName: string);
var
Node: TTreeNode;
begin
Node := TreeView1.Items.GetFirstNode;
repeat
if Node.Text = NodeName then
ListBox1.Items.Add('Absolute Index: ' + IntToStr(Node.AbsoluteIndex));
until Node = nil;
end;
function TForm1.GetItemPath(Node: TTreeNode): string;
begin
Result := '';
if Node <> nil then
begin
Result := Node.Text;
while Node.Parent <> nil do
begin
Node := Node.Parent;
Result := Node.Text + '->' + Result;
end;
end;
end;
위의 소스는 최용일 님이 제공해 주신 겁니다.
root
가
라
A
B
I
C
나
A
D
H
다
바
A
E
G
F
위와 같이 트리뷰가 구성되어 있을때, 아래와 같은 결과가 나오도록 즉, 에디트에 입력한 텍스트를 가지고 와서 트리뷰에서 검사해서 경로명을 보여주는 루틴입니다. 이걸 이용해서 하위(자식노드들의 경로명)노드의 경로들을 나타내려고 하는데, 좀 막히네요.
만약 에디트 창에 'A'를 입력했다면,
현재 위 루틴의 결과는 다음과 같이 나옵니다.
root -> 가 -> 라 -> A
root -> 나 -> A
root -> 다 -> 바 -> A
그런데, 이 루틴을 바꿔서 하위노드의 경로명을 얻는데 쓰려고 합니다.
다음과 같은 결과가 나오도록...
A -> B -> I
A -> C
A -> D -> H
A -> E -> G
A -> F
그래서...일단 다음과 같이 고쳤는데... 역시나... -.-;
function TForm1.GetItemPath(Node: TTreeNode): string;
begin
Result := '';
if Node <> nil then
begin
Result := Node.Text;
while Node.HasAsParent(Node) = true do
begin
Node.HasAsParent(Node);
Result := Node.Text + ' -> ' + Result;
end;
end;
end;
코드 좀 봐 주세요.
그럼 감사합니다.
아래와 같이 해보세요... 좀 더 많이 책보고 VCL에 대해서 공부하셔야 할듯...
SubNode는 값이 한두개가 아니기 때문에 스트링리스트에 넣어서 반환하도록 했습니다...
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
SearchNode2(ListBox1.Items, 'A');
end;
procedure TForm1.GetSubItemsPath(StrList: TStrings; const NodeName: string; Node: TTreeNode);
var
Index: Integer;
begin
if Node.HasChildren then
begin
for Index := 0 to Node.Count - 1 do
GetSubItemsPath(StrList, NodeName + '->' + Node[Index].Text, Node[Index]);
end
else
begin
StrList.Add(NodeName);
end;
end;
procedure TForm1.SearchNode2(StrList: TStrings; const NodeName: string);
var
Node: TTreeNode;
begin
Node := TreeView1.Items.GetFirstNode;
repeat
if Node.Text = NodeName then
GetSubItemsPath(ListBox1.Items, Node.Text, Node);
Node := Node.GetNext; // <<< 이거 빼먹으셨던데... 이거 없으면 무한루트돕니다...
until Node = nil;
end;
^^ 항상 즐코하세요...