Q&A

  • 엑티브엑스 트리뷰를 델파이에서 쓰려구...
안녕하세요..

델파이6에서 엑티브엑스 컨트롤을 등록 하고 텝에다가 등록시켜놓고 쓰려고 합니다..

그런데.. ^^;

폼에 위치 시키고 버튼을 만들어 Treeview1.Nodes.Add 메소드로 간단한 노드 삽입을 구현 해보려고 합니다..

그리고 파라미터로는..

Add(var Relative : OleVariant, var Relationship : OleVariant, var Key : OleVariant, var Text : OleVariant, var Image : OleVariant, var SelectedImage : OleVariant)

라고 되어 있었습니다.. 파라메타 풍선 도움말에요...

그런데..

실제로 비베에서는 이를테면

Add(, , 'r', 'root)

뭐 이런식으로 파라메타를 생략해서 사용하던데 델파이에서는 안통하(?)더군요.. ^^;

nill 등의 값도 그렇구요...

그래서 MSDN에서 TreeView 를 찾아서 그에 맞게 파라메터를 넣어도 에러가 나더라구요..

델파이에서 엑티브엑스의 트리뷰를 사용해보신분 도움 부탁드립니다..

-----------------------------

사실 왜 힘들여(?) 엑티브엑스의 트리뷰를 사용하려하냐면...

다음과 같은 사연(?)이 있어서 입니다..  (제가 무지해서...--;)

사무실에서 어떤 목적으로 DB를 구축하였습니다.

오브젝트 단위로 레코드가 이루어져 있씁니다..

각 오브젝트는 22자리의 스트링이 유일한 식별자(ID)로 되어 있구요..

그런데 이 유일한 식별자라는 것이 규칙이 없다는것이 참 난감하더라구요...아무튼...

그리고 이 오브젝트는 또 다른 동일한 구성의 자식 오브젝트를 하나 이상 가질수가 있게 되어 있구요..

DB상의 표현으로는 UpperCode 라는 필드를 두어 부모의 ID 값을 가지고 있는 식으로 구성이 되어 있습니다.

이런 오브젝트가 약 2000 여 개가 있구요.

이러것들이 서로 부모 자식의 관계로 구성되어 있습니다..

델파이가 제공하는 Treeview는 사용자 임의 지정 인덱스가 없더라구요...

그냥 Data 프로퍼티만이 있을뿐...

일단 무식하게 이렇게 구성된 DB를 가지고 트리로 만들려니..

다음과 같은 방식으로 했습니다.. (좀 무식하지만... --;)

while(not qryEntity.Eof)do begin
 strCode := qryEntity.FieldByName('UT_CODE').AsString;
 strUpper:= qryEntity.FieldByName('UT_UPPER_CODE').AsString;
 strName := qryEntity.FieldByName('UT_SHORT_NAME').AsString;
 strlstNodes.Add(strCode);
 i:= strlstNodes.IndexOf(strUpper);
 if(i > -1)then
  trvwUnits.Items.AddChildObject(trvwUnits.Items.Item[i], strName, qryEntity.GetBookmark)
 else
  trvwUnits.Items.AddObject(nil, strName, qryEntity.GetBookmark);
 qryEntity.Next;
end;

이렇게 하면 보모 ID가 있으면 그리로 작식으로 붙고...

부모가 존재하지 않으면 루트에 붙습니다..

2000여개의 레코드에 약 30,40여 초 걸리더라구요...

물론 그냥 조건없이 2000 여개 노드생성은

5초도 안걸리지만요...

제가 트리뷰의 특징을 잘 이용하지 못해서 그런것 같습니다..

무슨 다른 좋은 아이디어가 없을 까요??

참고로 비주얼베이직으론 이런 표현이 가능합니다... 이 트리만의 강점이죠...

Do While t_Remote_Db_Rs.EOF <> True
 t_str_1 = "_" + t_Remote_Db_Rs("ut_code")
 t_str_2 = "_" + t_Remote_Db_Rs("ut_upper_code")
 t_str_3 = t_Remote_Db_Rs("ut_short_name")
 err.Clear
 Set nodX = frm_unit_hierachy.TreeView1.Nodes.Add(t_str_2, tvwChild, t_str_1, t_str_3, "closed")
 If err.Number > 0 Then
  Set nodX = frm_unit_hierachy.TreeView1.Nodes.Add(, , t_str_1, t_str_3, "closed")
  TreeView1.Nodes(t_str_1).Expanded = True
  err.Clear
 End If
 t_Remote_Db_Rs.MoveNext
Loop

델파이에서 어떤 좋은 아이디어가 없을까요...

도움 부탁드립니다..  (훌쩍훌쩍..)

0  COMMENTS