|
이정희 님이 쓰신 글 :
: 트리뷰를 사용하다 보니... 에러가 너무 많이 나더라구요...
: 그것도 다름아닌 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등)에는 추가한 아이템의
포인터를 리턴하며, 그렇지 않고 스트링이나 포인터등 단순한 정보를 추가하는 경우에는
추가한 아이템의 인덱스를 리턴합니다.
그럼 참고하시길...
|