Q&A

  • 트리뷰에서 같은 이름이라도 자식노드가 붙어야되는데..안 붙어요.
안녕하세요
일단 기본 코드는 아래와 같습니다.

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개부터가 문제입니다. 결국, 같은 이름을 가진 노드는 같은 이름의 마지막 노드의 절대값만 가지고 수행을 하는것 같습니다.
그래서, 세번째 리스트박스에서 확인해 보니까 같은 이름의 노드라도 절대값을 다 읽는데 왜 마지막에만 추가되는지 모르겠습니다.  
코딩이 틀린건지..아니면...알고리즘이 잘못된건지 모르겠습니다.
0  COMMENTS