Q&A

  • 최용일님께서 답변해주신 내용중에서.....
아래 코드는 최요일님께서 에이트 창에서 입력받아 트리뷰에서 노드 이름을 뽑아내는 부분입니다.

var
    CurNode: TTreeNode;
    StrList: TStringList;
    S: string;
    Index: Integer;
begin
    S := Edit1.Text; // 'apple mango banana'
    StrList := TStringList.Create;
    ExtractStrings([' '], [' '], PChar(S), StrList);

    CurNode := TreeView1.Items.GetFirstNode;
    repeat
        for Index := 0 to StrList.Count - 1 do
        begin
            if Pos(StrList.Strings[Index], CurNode.Text) <> 0 then
            begin
                ListBox1.Items.Add(CurNode.Text);
                Break;
            end;
        end;
        CurNode := CurNode.GetNext;
    until CurNode = nil;
    StrList.Free;
end;

위 코드는 같은 이름(같은 이름을 가진 노드)에 상관 없이 리스트박스에 입력됩니다. 그래서 아래와 같이 코드를 바꿔서 중복되는 이름을 걸러서 리스트박스에 들어가게 하려고 했습니다.
그러나 아무 작동도 안하는게 어디가 잘못 되었는지 잘 모르겠습니다. -.-

var
    CurNode: TTreeNode;
    StrList: TStringList;
    S: string;
    Index: Integer;
begin
    S := Edit1.Text; // 'apple mango banana'
    StrList := TStringList.Create;
    ExtractStrings([' '], [' '], PChar(S), StrList);

    CurNode := TreeView1.Items.GetFirstNode;
    repeat
        for Index := 0 to StrList.Count - 1 do
        begin
            if Pos(StrList.Strings[Index], CurNode.Text) <> 0 then
            begin
                for i:=0 to listbox1.items.count-1 do  // 여기서 부터
                begin
                   if listbox1.items.strings[i] = Trim(CurNode.Text) then
                   begin
                     Break;
                   end;
                end;   // 여기까지 추가.
                ListBox1.Items.Add(CurNode.Text);
                Break;
            end;
        end;
        CurNode := CurNode.GetNext;
    until CurNode = nil;
    StrList.Free;
end;

2  COMMENTS
  • Profile
    최용일 2002.09.10 18:55
    안녕하세요. 최용일입니다.

    쩝~ for문으로 돌리셨으면 중복된 이름인가 아닌가를 알아야 하잖아요. 그냥 break로 나가기만 하면 하나 마나죠...

    var
        Found: Boolean;
    begin
        ......
                    Found := False;
                    for i:=0 to listbox1.items.count-1 do  // 여기서 부터
                    begin
                        if listbox1.items.strings[i] = Trim(CurNode.Text) then
                        begin
                            Found := True;
                            Break
                        end;
                    end;   // 여기까지 추가.
                    if not Found then
                        ListBox1.Items.Add(CurNode.Text);
                    Break;

    그리고 참고로 TStrings에는 IndexOf라는 아주 간편한 메소드가 있습니다.
                    ......
                    if ListBox1.Items.IndexOf( Trim(CurNode.Text) ) = -1 then // not found
                    begin
                        ListBox1.Items.Add( CurNode.Text );
                    end;
                    Break;

    ^^ 항상 즐코하세요...

  • Profile
    sunny 2002.09.10 20:44
    감사합니다
    TStrings에서 IndexOf 라는 메소드 정말 유용한 매소드네요
    잘 배웠습니다.
    그럼 수고하세요