Q&A

  • Treeview에 관한 좋은 예제 없을까요?
listview는 델파이 demo/virtual listview에 있는

예제 프로그램을 보고 잘 사용하고 있습니다만

treeview는 예제 프로그램도 없고..

리스트 뷰하고는 또 다르네요.. 무슨 좋은 예제같은거 없을까요?

그리고 질문입니다.

더블 클릭 이벤트를 이용했을 때 마우스 위치를 알 방법이 없을까요?

MOUSE DOWN에는 X,Y로 마우스 위치가 넘어오던데 더블클릭은 아니더군요

트리뷰아무 곳에서나 더블 클릭을 해도 영역이 셀렉트가 되데요.

마우스 위치를 잡아 노드 위에서 더블 클릭할 때만 셀렉트 되게 해주고 싶습니다. 그럼 부탁드립니다.
4  COMMENTS
  • Profile
    별볼일없는 2003.04.19 02:19
    treeview 예제는 예전 답글 게시판에 20page 가량 있는걸로 아는데요

    거기있는 자료만큼 좋은 예제가 또 어디 있을까요... ^^;;


  • Profile
    깔쌈보이 2003.04.19 01:02
    좋은 예제에 대한 건은 사실 뭐라고 말하기가 힘드네요...

    사용법을 말하는지... 어떤걸 말하는지요...

    사실 Treeview정도면 예제같은게 필요없지 않나 합니다.
    저도 굳이 이것을 신경써보지 않아서 모르겠네요..

    그리고 더블클릭 문제는 아래와 같이 해결할수가 있습니다.

    더블클릭 이벤트에서요...

    var
        P: TPoint;
        aNode: TTreeNode;
    begin
         GetCursorPos(P);
         aNode := TTreeview(Sender).GetNodeAt(P.x, P.y);
         if aNode = nil then
         begin
            // nil에 대한 처리
         end
         else begin
                // 구한 노드에 대한 처리
         end


    앗~ GetCursorPos(P)... 이걸 쓰고 아무런 처리를 하지 않아도 되던가?
    아니면 뒤에 그 좌표계를 변환해줘야 되던가?
    갑자기 떠오르지 않네요... ^^
    직접 테스트해보시고 필요하면 조금 고쳐보세요... ^^
  • Profile
    고가람 2003.04.19 01:59
    procedure TForm1.TreeView1DblClick(Sender: TObject);
    var
      CurPos: TPoint;
      Node: TTreeNode;
    begin
        GetCursorPos(CurPos);
        Node := nil;
        CurPos := treeview1.ScreenToClient(CurPos);
        Node := Treeview1.GetNodeAt(CurPos.X, CurPos.Y);
        if Node <> nil then
        begin
          Treeview1.Selected := Node;
          showMessage(node.text);
        end;
    end;

    procedure TForm1.TreeView2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      Node: TTreeNode;
    begin
        Node := nil;
        Node := Treeview2.GetNodeAt(X, Y);
        if Node <> nil then
        begin
          Treeview2.Selected := Node;
          showMessage(node.text);
        end;
    end;

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

    두놈이 다 똑같은 문제가 있습니다. GetNodeAt을 할 때 Y축 좌표는 인식을 하는데

    X축 좌표는 인식을 못하네요.

    +아이템1                                                            @

    이런 식으로 있으면 +에서 1까지의 범위가 눌릴경우 node를 가지고 와야 하는데 엉뚱하게 @위치를 클릭해도 노드를 가지고 와버리네요

    즉 노드의 x좌표와 y좌표를 다 체크하는게 아니라 y좌표만 체크하고

    그 라인의 어떤 곳을 클릭하더라도 노드를 가져와 버리게 됩니다.

    대체 왜 이러는지 모르겠습니다. 함수 자체가 getNode(X,Y)인데 왜 X축 좌표를 무시하는걸까요? 답변 부탁드릴게요
  • Profile
    [++曰+] 2003.04.22 04:25
    아래와 같이 함 해보세여~

    즐코!!~


    procedure TForm1.TreeView1DblClick(Sender: TObject);
    var
      CurPos: TPoint;
      HitTests: THitTests;
    begin
      GetCursorPos(CurPos);
      CurPos := treeview1.ScreenToClient(CurPos);
      HitTests := TreeView1.GetHitTestInfoAt(CurPos.X, CurPos.Y);

      if htOnItem in HitTests then begin
        ShowMessage(Treeview1.Selected.text);
      end;
    end;

    procedure TForm1.TreeView2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      HitTests: THitTests;
    begin
      HitTests := TreeView2.GetHitTestInfoAt(X, Y);

      if htOnItem in HitTests then begin
        ShowMessage(Treeview2.Selected.text);
      end;
    end;