데이터베이스를 읽어서 트리뷰에 나타내는 작업입니다.
그런데 이상하게 부모노드는 제대로 만들어지는데 그부모노드에 해당되는
하위노드들은 어뚱한 곳에 들어가 있읍니다.
도대체 어떻게 된건지 헤메고 있습니다.
영화 ------ 파이널판타지
음악 ------ 바하
스포츠 ---- 박찬호
뉴스 ------ 한겨레
위와같이 들어가야 정상인데
영화 ------ 파이널판타지 ----- 바하
음악 ------ 박찬호
스포츠----- 하위노드없음
뉴스 ----- 하위노드없음
이렇게 되버립니다.
childnode:=MainForm.Treeview2.Items.AddChild(node, MainForm.CategolyTable1.FIeldByName('SiteName').asString);
이 부분을 아래와같이하면 확실한데 Treenode 형식에 String형을
대입한다고 델파이가 야단이라서....
TreeView에 대해서 아시는분께서 답변 부탁드리겟습니다.
childnode:=MainForm.Treeview2.Items.AddChild(MainForm.CategolyTable1.FIeldByName('SiteName').asString , MainForm.CategolyTable1.FIeldByName('SiteName').asString);
////////////////////////////////////////////////////////////////////////////////
Procedure TreeViewCreat_2;
var str : String; i,findindex:Integer; node,node2,childnode : TTreeNode;
begin
CategolyStrList:=TStringList.Create;
SiteStrList:=TStringList.Create;
mainform.Treeview2.Items.Clear;
findindex:=0;
if MainForm.CategolyTable1.RecordCount <> 0 then
begin
MainForm.CategolyTable1.First;
while not MainForm.CategolyTable1.EOF do
begin
if Length(MainForm.CategolyTable1.FIeldByName('SiteName').asString) = 0 then
begin
node := MainForm.Treeview2.Items.Add(nil, MainForm.CategolyTable1.FIeldByName('Categoly').asString);
node.ImageIndex:=0;
node.selectedIndex:=1;
CategolyStrList.Add(MainForm.CategolyTable1.FIeldByName('Categoly').asString);
end;
if Length(MainForm.CategolyTable1.FIeldByName('SiteName').asString) <> 0 then
begin
findindex:=CategolyStrList.IndexOf(MainForm.CategolyTable1.FIeldByName('Categoly').asString);
if findindex > -1 then
begin
//node := MainForm.Treeview2.Items [ findindex ]; //<-------이인덱스값이 잘못들어간것같기도하고....
node := CategolyStrList[ findindex ];
childnode:=MainForm.Treeview2.Items.AddChild(node, MainForm.CategolyTable1.FIeldByName('SiteName').asString);
SiteStrList.Add(MainForm.CategolyTable1.FIeldByName('SiteName').asString);
childnode.ImageIndex:=2;
childnode.selectedIndex:=3;
end;
end;
MainForm.CategolyTable1.Next;
end;
end;
end;
작성하신 소스는 부모노드를 얻기위해 StringList에 부모노드의 문자열을 기록
하였다가 index값을 이용하였는데 index값은 TreeView에 Node가 추가중인 경우에
변하기 때문에 정확하지 않습니다.
일단 작성하신 소스로보아 Categoly의 문자열은 중복되지 않는다는 전제하에
부모노드를 찾아 자식노드로 등록하는 방법으로 소스를 변경해 보았습니다.
부모노드를 찾는 함수
function GetParentNode(Categoly : String) : TTreeNode;
var
TempNode : TTreeNode;
begin
Result := nil;
with MainForm.Treeview2 do
begin
TempNode := Items.GetFirstNode;
While TempNode <> nil do
begin
if (TempNode.Text = Categoly) then
begin
Result := TempNode;
Break;
end;
TempNode := TempNode.GetNextSibling; // 같은단계(0단계)의 다음노드 얻기
end;
end;
end;
자식노드를 추가하는 소스의 변경 (TStringList 는 사용할 필요가 없음)
if Length(MainForm.CategolyTable1.FIeldByName('SiteName').asString) <> 0 then
begin
node := GetParentNode(MainForm.CategolyTable1.FIeldByName('Categoly').asString); // 부모노드 얻기
if (node <> nil) then
begin
childnode:=MainForm.Treeview2.Items.AddChild(node, MainForm.CategolyTable1.FIeldByName('SiteName').asString); // 자식노드 추가
// SiteStrList.Add(MainForm.CategolyTable1.FIeldByName('SiteName').asString);
childnode.ImageIndex:=2;
childnode.selectedIndex:=3;
end;
end;
컴파일 해보지 않아 문법 에러가 있을 수도 있습니다.