Q&A

  • DB를 읽어와 TreeView에 뿌려주는..node 값을 찾지 못해요..T.T
안녕하십니까..고수님들..

다름이 아니오라..현재 DB에서 데이타를 읽어와 TreeView에 뿌려주는 작업을 하고 있습니다..그러니까 부모 - 아들 - 손자 ..뭐 이런식이죠..!!

지금 DB구조는 아래와 같이 예를 들어 작성하였습니다..



Tel | Name | TelType | UpperTel

a A1 0

b A2 0

c A11 1 a

d A21 1 b

e A111 2 c





여기서 DB구조에 필드 타입을 보면



Tel : CHAR , Name : CHAR , TelType : TINYINT , UpperTel : CHAR



위와 같이 구성되어 있습니다..!!

설명을 간략히 드리자면 TelType에 해당하는 0 : 부모

1 : 자식

2 : 손자

뭐 이런식으로 구성합니다.



TreeView에 디스플레이 시키려고 하는 값은..?아래와 같이



---- a

| |-- c

| |-- e

|

|--- b

|-- d



이렇게 디스플레이 시키려고 합니다...!!^^

아래는 소스코드입니다..한번 확인해보시고 두루 가르침을 주십시요..^^



procedure TForm1.FormShow(Sender: TObject);

var

mRecCnt,mCnt,mCntRR,mInnerCnt : Integer;

strUpperTel : String;

nodRR1, nodIR1, nodTmp : TTreeNode;

begin

mCntRR := 0;

mInnerCnt := 0;

strUpperTel := '';



with CastDataModule.TelInfoQry do

begin

Active := True;



First;

for mCnt := 1 to mRecCnt do

begin

// 부모의 추가..

if (FieldByName('TelType').AsInteger = 0) then

begin

nodRR1 := Tree_of_Relay.Items.AddFirst(nil, FieldByName('Tel').AsString);

end;

----------------> 여기 까지 부모는 올바르게 찾아 TreeView에 보여집니다..



// 자식의 추가..

if (FieldByName('TelType').AsInteger = 1) then

begin

strUpperTel := FieldByName('UpperTel').AsString;



First;

for mInnerCnt:= 1 to mCnt -1 do

begin

if (strUpperIP = FieldByName('RelayIP').AsString) then

begin

MoveBy(mCnt-1);

nodIR1 := Tree_of_Relay.Items.AddChild(nodRR1, FieldByName('RelayName').AsString +

' [' + FieldByName('RelayIP').AsString + ' ]');



------------------> 위에 내용으로 하면 자식Node가 생기긴 하는데 자기 부모를 찾아가지 못합니다..!!위와 같이 하면 결과는



--- b

|--- c ---> 이런 식으로 생깁니다...



제가 원하는 답은 --- b --- a

| |--- | |--- c

| 이거나 |

|-- a |-- b

|--- c |--> 이거 거든요..^^

아직 손자 나타내는 데까지는 작성안해서 자식폼까지만의 결과물을 올려 놓았습니다...

위 내용을 어떻게 하면 원하는 결과물을 얻을수 있을까요..!!

부탁드리겠습니다...^^ 간절히..



아래에 나와 있는내용은 GatNode 라는 함수를 써서 쓴 것인데...

사용 할줄을 잘모르겠네요..!!

아울러 밑에 GetNode 에 대한 설명도 부탁드리겠습니다...^^

제 말이 좀 ..이상한가요..^^ 너그럽게 얘교로 마주세요..^^

요새 안개가 많이 끼더군요..!! 차조심 하시구요...^^ 감기두...







// nodTmp := Tree_of_Relay.Items.GetNode( HTreeItem ( strUpperIP ) );

// ShowMessage(nodRR1.Text);

// nodIR1 := Tree_of_Relay.Items.AddChild(nodTmp, FieldByName('RelayName').AsString);

// break;

end;

next;

end;



end;



Next;

end;

end;



end;



3  COMMENTS
  • Profile
    홍성락 2001.11.24 00:00
    간단한 예라면 자료실에 '트리뷰와DB를연결한간단한예제'라고 검색해보세요

    ///////////////////////////////////////////////////////////////

    열심히. wrote:

    > 안녕하십니까..고수님들..

    > 다름이 아니오라..현재 DB에서 데이타를 읽어와 TreeView에 뿌려주는 작업을 하고 있습니다..그러니까 부모 - 아들 - 손자 ..뭐 이런식이죠..!!

    > 지금 DB구조는 아래와 같이 예를 들어 작성하였습니다..

    >

    > Tel | Name | TelType | UpperTel

    > a A1 0

    > b A2 0

    > c A11 1 a

    > d A21 1 b

    > e A111 2 c

    >

    >

    > 여기서 DB구조에 필드 타입을 보면

    >

    > Tel : CHAR , Name : CHAR , TelType : TINYINT , UpperTel : CHAR

    >

    > 위와 같이 구성되어 있습니다..!!

    > 설명을 간략히 드리자면 TelType에 해당하는 0 : 부모

    > 1 : 자식

    > 2 : 손자

    > 뭐 이런식으로 구성합니다.

    >

    > TreeView에 디스플레이 시키려고 하는 값은..?아래와 같이

    >

    > ---- a

    > | |-- c

    > | |-- e

    > |

    > |--- b

    > |-- d

    >

    > 이렇게 디스플레이 시키려고 합니다...!!^^

    > 아래는 소스코드입니다..한번 확인해보시고 두루 가르침을 주십시요..^^

    >

    > procedure TForm1.FormShow(Sender: TObject);

    > var

    > mRecCnt,mCnt,mCntRR,mInnerCnt : Integer;

    > strUpperTel : String;

    > nodRR1, nodIR1, nodTmp : TTreeNode;

    > begin

    > mCntRR := 0;

    > mInnerCnt := 0;

    > strUpperTel := '';

    >

    > with CastDataModule.TelInfoQry do

    > begin

    > Active := True;

    >

    > First;

    > for mCnt := 1 to mRecCnt do

    > begin

    > // 부모의 추가..

    > if (FieldByName('TelType').AsInteger = 0) then

    > begin

    > nodRR1 := Tree_of_Relay.Items.AddFirst(nil, FieldByName('Tel').AsString);

    > end;

    > ----------------> 여기 까지 부모는 올바르게 찾아 TreeView에 보여집니다..

    >

    > // 자식의 추가..

    > if (FieldByName('TelType').AsInteger = 1) then

    > begin

    > strUpperTel := FieldByName('UpperTel').AsString;

    >

    > First;

    > for mInnerCnt:= 1 to mCnt -1 do

    > begin

    > if (strUpperIP = FieldByName('RelayIP').AsString) then

    > begin

    > MoveBy(mCnt-1);

    > nodIR1 := Tree_of_Relay.Items.AddChild(nodRR1, FieldByName('RelayName').AsString +

    > ' [' + FieldByName('RelayIP').AsString + ' ]');

    >

    > ------------------> 위에 내용으로 하면 자식Node가 생기긴 하는데 자기 부모를 찾아가지 못합니다..!!위와 같이 하면 결과는

    >

    > --- b

    > |--- c ---> 이런 식으로 생깁니다...

    >

    > 제가 원하는 답은 --- b --- a

    > | |--- | |--- c

    > | 이거나 |

    > |-- a |-- b

    > |--- c |--> 이거 거든요..^^

    > 아직 손자 나타내는 데까지는 작성안해서 자식폼까지만의 결과물을 올려 놓았습니다...

    > 위 내용을 어떻게 하면 원하는 결과물을 얻을수 있을까요..!!

    > 부탁드리겠습니다...^^ 간절히..

    >

    > 아래에 나와 있는내용은 GatNode 라는 함수를 써서 쓴 것인데...

    > 사용 할줄을 잘모르겠네요..!!

    > 아울러 밑에 GetNode 에 대한 설명도 부탁드리겠습니다...^^

    > 제 말이 좀 ..이상한가요..^^ 너그럽게 얘교로 마주세요..^^

    > 요새 안개가 많이 끼더군요..!! 차조심 하시구요...^^ 감기두...

    >

    >

    >

    > // nodTmp := Tree_of_Relay.Items.GetNode( HTreeItem ( strUpperIP ) );

    > // ShowMessage(nodRR1.Text);

    > // nodIR1 := Tree_of_Relay.Items.AddChild(nodTmp, FieldByName('RelayName').AsString);

    > // break;

    > end;

    > next;

    > end;

    >

    > end;

    >

    > Next;

    > end;

    > end;

    >

    > end;

    >

  • Profile
    열심히. 2001.11.24 01:46
    감사합니다..!! 도움은 많이 됐습니다..!! 너무도 많이..^^

    근데요..!! 아직 제가 초보 라서요..!!

    거기 예제 보니까...서브아이템 코딩한곳이 있습니다..!!

    유심히 검토해보았습니다..!!

    조금 다르더군요..!!

    제가 좀 잘하면..^^헤~~ 금방 이해가 가겠는데...!!

    거기에 보면..TreeView 안에 ListBox도 추가 되어 있더라구요..!!

    코딩도 ListBox를 사용했..(어캐 한지는 모르지만..T.T)..더군요..^^

    조금 이해가 안갔습니다..서브아이템 노드 추가 하는 부분이요..!!



    ListBox 안쓰고...DB에서 읽어오는 방법은 없습니까..?

    제가 잘몰라서 인지..자꾸..노드 값을 못읽어 옵니다..!!

    첨에 제가 올렸던 글이 짐 현재 작업하고 있는 내용이구요..!!

    찾아보고 완성을 해야되는데..첨인 TreeView에서 막히니..깝깝하고 답답합니다..

    주위에 누구에게 물어볼 사람도 없고 그래서..이렇게 게시판에..

    많은 고수님들에게 여쭤볼려고 이렇게 글을 두서 없이 올렸습니다...^^

    아까..예제는 참으로 도움이 많이
  • Profile
    홍성락 2001.11.24 03:06
    예제에 ListBox를 사용한 이유는 쿼리를 최소화 하려함이였습니다.

    변수를 사용해도되나 그냥 자료구조론에서 스택이나큐처럼 편하게하려 했는데...



    일단 아래소스상에서의 생각해봐야할점입니다.

    1.데이터 순서(쿼리해온 순서)는 레벨순으로(TelType)

    즉 오토바이(order by)태워야

    0라벨부터 생겨 부모를 찾을수있습니다.

    2.0라벨생성후 1라벨 생성시 쿼리한 DB를 다시 First;하시던데요

    이중으로하시지말구 트리뷰에서 0라벨인부모를 찾게하시면됩니다.



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

    아래 소스중 GetNode를 사용한건 아마 DB필드설명중 빠진 RelayIP필드에

    자기 고유아이템번호를 저장해 이로 아이템 핸들을 이용하는것 같은데요.



    /////////////////////////////////////////////////////////////////

    열심히. wrote:

    > 감사합니다..!! 도움은 많이 됐습니다..!! 너무도 많이..^^

    > 근데요..!! 아직 제가 초보 라서요..!!

    > 거기 예제 보니까...서브아이템 코딩한곳이 있습니다..!!

    > 유심히 검토해보았습니다..!!

    > 조금 다르더군요..!!

    > 제가 좀 잘하면..^^헤~~ 금방 이해가 가겠는데...!!

    > 거기에 보면..TreeView 안에 ListBox도 추가 되어 있더라구요..!!

    > 코딩도 ListBox를 사용했..(어캐 한지는 모르지만..T.T)..더군요..^^

    > 조금 이해가 안갔습니다..서브아이템 노드 추가 하는 부분이요..!!

    >

    > ListBox 안쓰고...DB에서 읽어오는 방법은 없습니까..?

    > 제가 잘몰라서 인지..자꾸..노드 값을 못읽어 옵니다..!!

    > 첨에 제가 올렸던 글이 짐 현재 작업하고 있는 내용이구요..!!

    > 찾아보고 완성을 해야되는데..첨인 TreeView에서 막히니..깝깝하고 답답합니다..

    > 주위에 누구에게 물어볼 사람도 없고 그래서..이렇게 게시판에..

    > 많은 고수님들에게 여쭤볼려고 이렇게 글을 두서 없이 올렸습니다...^^

    > 아까..예제는 참으로 도움이 많이