Q&A

  • Re: 트리뷰에 조직을 다 넣지 마세요.
노드를 Open할때 바로 밑의 자식노드 데이타를 가져와서 add하세요





이런 wrote:

> 현재 조직도 데이터를 읽어 와서 트리뷰로 조직도를

> 구성하는 프로그램을 작성중인데.. 문제가 있어서 질문을 드립니다.

>

> 프로그램 구동은 잘 되나, 데이터 개수가 500개 이상일 경우에는

> 너무 느리군요.. 아래와 같이 불규칙한 조직도 데이터가 있을경우

> 트리뷰로 나타내야 합니다.

>

> --------------

> 데이터 형식

> --------------

> 우리회사,전자계산소,개발부,홍길동

> 우리회사,전자계산소,개발부,김말똥

> 우리회사,전자계산소,개발부,유지보수팀,황정은

> 우리회사,전자계산소,개발부,유지보수팀,김정말

> 우리회사,제주지점,이상은

> 우리회사,제주지점,김동한

>

> 우리회사

> 전자계산소

> 개발부

> 홍길동

> 김말똥

> 유지보수팀

> 황정은

> 김정말

> 제주지점

> 이상은

> 김동한

>

>

> 제가 만들었던 샘플프로그램을 올려드립니다.

> 왜 데이터가 조금 많을 경우에는 느릴까요?

> 아시는분의 조언 부탁드립니다.

>

>

> procedure TForm1.AnalyClick(Sender: TObject);

> var

> MainNode, FindedNode, DestNode: TTreeNode;

> num, Dnum : Integer;

> StrList : TStringList;

> begin

> TreeView.Items.Clear;

> MainNode:= TreeView.Items.add(nil, '조직 구성도');

> StrList := TStringList.Create;

> TreeView.Items.BeginUpdate;

>

> for num :=0 to Memo.Lines.count -1 do

> begin

> StrList.CommaText := Memo.Lines.Strings[num];

> DestNode:= MainNode;

>

> for Dnum :=0 to StrList.Count -1 do

> if FindNode(StrList.Strings[Dnum], FindedNode, DestNode) then

> if Dnum = StrList.Count -1 then {마지막 항목이라면 무조건 추가}

> TreeView.Items.AddChild(DestNode, StrList.Strings[Dnum])

> else

> DestNode := FindedNode

> else

> DestNode := TreeView.Items.AddChild(DestNode, StrList.Strings[Dnum]);

>

> Label1.Caption := inttostr(num) + ' ' +inttostr(Memo.Lines.count-1);

> application.ProcessMessages;

> end;

>

> TreeView.Items.EndUpdate;

> StrList.Free;

> // TreeView.FullExpand;

> end;

>

> //------------------------------------------------------------//

> // 메인 폼의 트리뷰 아이템 검색 루틴

> //------------------------------------------------------------//

> Function TForm1.FindNode( Str : String ; var FindNname, Origin :TTreeNode): Boolean;

> var

> DestNode: TTreeNode;

> Levels: integer;

> begin

> DestNode := Origin;

> Levels := DestNode.Level;

>

> while DestNode <> nil do

> begin

> DestNode := DestNode.GetNext;

> if DestNode = nil then Break;

> if Levels >= DestNode.Level then Break;

> if Levels = DestNode.Level-1 then

> if Str = DestNode.Text then

> begin

> FindNname := DestNode;

> FindNode := True;

> exit;

> end;

> end;

>

> FindNode := False;

> end;

1  COMMENTS
  • Profile
    최용일 2001.11.08 01:57
    쩌비님 말씀처럼 하시는 것이 좋을듯 하네요... 데이터가 많으면 많을수록 비교할 수



    없을 정도로 빠릅니다...



    제가 볼때는 프로그램 구조상의 문제는 없는거 같네요...



    뭐 전체 트리를 검색할때가 문제가 된다면 트리형태의 자료구조를 하나 만드시면 되구요.



    검색할때 트리뷰컴포넌트를 이용하는 것이 아니라 만들어진 트리형태의 자료구조를



    이용하는 거죠...



    탐색기 폴더트리가 이러한 형태입니다...



    이런 wrote:

    > 프로그램 구조상 조직도가 이미 트리뷰에

    > 구성되어 있어야 합니다 -_-;

    >

    > 분명히 빠른 방법이 있을텐데...

    > 아시는분?.. 글구 이 게시판에서는 파일 올리기가 안되네요

    > 델마당 Q/A 에 제가 구현한 소스를 올려놓았습니다.

    >

    > 아시는분.. 답변좀 주세요~

    >