아래 코드는 최요일님께서 에이트 창에서 입력받아 트리뷰에서 노드 이름을 뽑아내는 부분입니다.
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;
쩝~ 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;
^^ 항상 즐코하세요...