C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[2719] Re:[질문]트리뷰에 새로운 노드와 child노드를 add하는 방법
박지훈.임프 [cbuilder] 4059 읽음    2000-01-14 00:00
이정희 님이 쓰신 글 :
: 트리뷰를 사용하다 보니... 에러가 너무 많이 나더라구요...
: 그것도 다름아닌 index valid(?)....에러...
: 아래 처럼 하다 보니... 쿼리2에서 데이터가 없을 때에는
: 위와 같은 에러가 뜨더라구요...
:
: int i, j, k =0;
: TTreeNode *Node1;
: TreeView1->Items->Clear();

: Query1->SQL->Clear();
: Query1->SQL->Add(" Sele....
: for(i=0 ; i < Query1->RecordCount; i++){
:    TreeView1->Items->Add(NULL, Query1->Field....);
:    Node1 = TreeView1->Items->Item[k];
:    Query2->SQL->Add(....
:    for(j=0; j<Query2->RecordCount; j++){
:        TreeView1->Items->AddChild(Node1, Query2->F....);
:        Query2->Next();
:        k++;
:    }
:    Query2->SQL->Clear();
:    Query1->Next();
:    k++;
: }
: TreeView1->FullExpand();
:
: 트리뷰 사용할 때 인덱스를 어떻게 해야 할 지 ...
: 그리고 위의 소스에 이상은 없는지 알려 주시기 바랍니다...
: 그럼 이만....
:
:



임펠리테리입니다.
물론 쿼리를 오픈은 하셨겠지요? 뭐 옮겨적다가 실수로 빼먹으신 거 같고...
그 외에도 몇가지 여기저기.. 음.. 그대로 옮기셨으면 알아보기 좋았을텐데요.

k의 인덱싱이 잘못되어있습니다. 소스를 봐서는 루핑하면서 Query1의 결과로부터 최상위 노드인
Node1을 추가하고 있는데, 이때 추가한 노드의 객체(포인터)를 얻어내기 위해 k 인덱스를 유지하며
계속 증가시키고 있는 것 같군요. 맞나요?

추가한 노드의 객체를 얻어내기 위해서는 Items->Item[] 프로퍼티를 사용하지 않습니다.
Add() 메소드가 그 내부에서 추가한 노드의 포인터를 리턴하기 때문입니다. 이 Add() 뿐 아니라,
AddChild(), AddChildFirst(), AddChildObject(), AddChildObjectFirst(), AddFirst(),
AddObject(), AddObjectFirst() 등 모든 Add~() 함수가 추가한 노드를 리턴합니다.

그러므로, 첫번째 for문 다음의 노드를 추가하는 라인은 다음과 같이 하는 것이 아니라...
    TreeView1->Items->Add(NULL, Query1->Field....);
    Node1 = TreeView1->Items->Item[k];
다음과 같이 해야 합니다.
    Node1 = TreeView1->Items->Add(NULL, Query1->Field....);

참고로.. 트리뷰 뿐만 아니라, TList, TStringList, TListBox, TListView 등, VCL의 모든 Add~()
함수는 공통적인 특징이 있는데, 그 메소드에서 추가한 아이템에 대한 정보를 리턴한다는
것입니다. 만약 아이템이 독자적인 객체일 경우(TListView, TTreeView등)에는 추가한 아이템의
포인터를 리턴하며, 그렇지 않고 스트링이나 포인터등 단순한 정보를 추가하는 경우에는
추가한 아이템의 인덱스를 리턴합니다.

그럼 참고하시길...

+ -

관련 글 리스트
2717 [질문]트리뷰에 새로운 노드와 child노드를 add하는 방법 이정희 3724 2000/01/14
2719     Re:[질문]트리뷰에 새로운 노드와 child노드를 add하는 방법 박지훈.임프 4059 2000/01/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.