안녕하세요
일단 기본 코드는 아래와 같습니다.
procedure TForm1.FoundNode(const NodeName: string);
var
Node: TTreeNode;
NodeYes : Integer;
begin
Node := TreeView1.Items.GetFirstNode;
NodeYes := 0;
repeat
if Node.Text = NodeName then
begin
NodeYes := Nodeyes + 1;
CurrentNodeNum := Node.AbsoluteIndex;
TextListBox3.Items.Add(IntToStr(Node.AbsoluteIndex)); // 확인용
end;
Node := Node.GetNext;
until Node = nil;
if NodeYes >= 1 then
begin
FoundResult := 'Yes';
end
else if NodeYes = 0 then
begin
FoundResult := 'No';
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
StrList : TStringList;
getS, Temp, Temps, Zero, Element, LBoxTemp : string;
Index, SGLastColValue, Location, SRow, SCol : integer;
LValue, TLBoxCount : Integer;
TNode : TTreeNode;
I, J, K, P, XX : Integer;
colnum, rownum, ShowResultCol, TLBox1Count, TLBox2Count : Integer;
begin
// 문자열 자르기
getS := Edit1.Text;
StrList := TStringList.Create;
ExtractStrings([' '], [' '], PChar(getS), StrList);
// 룰에 따라 집어넣기....
//Index := 0;
Temps := '';
SGLastColValue := 2;
Zero := '0';
Temp := '';
ShowResultCol := StrList.Count;
SRow := 2;
// For Index := 0 to StrList.Count - 1 do begin
Temp := StrList.Strings[0]; // 첫 문자, 임시로 일단 0 값...
FoundNode(Temp);
If FoundResult = 'No' Then begin
MyNode := TreeView1.Items.AddChild(TreeView1.Items[0], Temp);
//TextListBox1.Items.Add(IntToStr(MyNode.AbsoluteIndex));
TextListBox1.Items.Add(Temp);
LValue := 2;
For K := 0 to StrList.Count - 1 do begin
For colnum := 0 to StringGrid1.ColCount - 2 do begin
For rownum := 0 to StringGrid1.RowCount - 2 do begin
If (LValue = StrToInt(StringGrid1.Cells[StrList.Count,rownum + 2])) and
(Temp = StringGrid1.Cells[colnum, rownum + 2]) then begin
For I := 0 to StringGrid1.ColCount - 2 do begin
Temps := StringGrid1.Cells[I, rownum + 2];
Element := Element +' ' +Temps;
end;
TextListBox2.Items.Add(Element);
Temps := '';
Element := '';
end;
end;
end;
For I := 0 to TextListBox1.Items.Count -1 do begin
FoundNode(TextListBox1.Items.Strings[I]);
For J := 0 to TextListBox2.Items.Count - 1 do begin
//TreeView1.Items.AddChild(TreeView1.Items[StrToInt(TextListBox3.Items.Strings[0])],TextListBox2.Items.Strings[J]);
TreeView1.Items.AddChild(TreeView1.Items[CurrentNodeNum],TextListBox2.Items.Strings[J]); // <- 문제점...
end;
//TextListBox3.Clear;
end;
TextListBox1.Clear;
For I := 0 to TextListBox2.Items.Count - 1 do begin
TextListBox1.Items.Add(TextListBox2.Items.Strings[I]);
end;
TextListBox2.Clear;
LValue := LValue + 1;
//TextListBox3.Clear;
end;
end
Else If FoundResult = 'Yes' Then begin
Showmessage('exist!!');
end;
// TextListBox1.Clear;
// TextListBox2.Clear;
// TextListBox3.Clear;
// end;
TreeView1.FullExpand;
end;
안약에... a b c d 를 집어넣고 버튼 2를 누르면...다음과 같이 만들어져야 정상입니다.
a
ab
abc
abcd
abd
abcd
acd
abcd
ac
abc
abcd
abd
abcd
acd
ad
abc
abcd
abd
abcd
acd
abcd
그런데, abcd 노드가 아래와 같이 마지막에만 붙어요...
a
ab
abc
abd
acd
ac
abc
abd
acd
ad
abc
abcd
abd
abcd
acd
abcd
위의 코드는 기본적으로 두개의 리스트박스에 아이템들이 있으면, 첫번째 리스트박스의 0번째 아이템부터 노드를 검사해서 그 노드의 절대값을 가지고 와서 두번째 리스트박스에 있는 아이템들을 전부 자식노드로 추가하는것입니다. 첫번째 리스트박스의 아이템이 다 끝나면, 두번째 리스트박스의 아이템을 첫번재 리스트박스로 옮기고, 두번째 리스트박스에는 어떤 일련의 작업에 의해서 새로운 아이템들이 생깁니다.
그런데, 입력문자가 3개(예를 들어, a b c)를 넣으면 올바른 결과값이 나오는데, 4개부터가 문제입니다. 결국, 같은 이름을 가진 노드는 같은 이름의 마지막 노드의 절대값만 가지고 수행을 하는것 같습니다.
그래서, 세번째 리스트박스에서 확인해 보니까 같은 이름의 노드라도 절대값을 다 읽는데 왜 마지막에만 추가되는지 모르겠습니다.
코딩이 틀린건지..아니면...알고리즘이 잘못된건지 모르겠습니다.