델파이

트리뷰(TTreeView) 노드(Node)의 힌트, THitTest, GetNodeAt, GetHitTestInfoAt 이용

미스터몽키 2013. 11. 22. 12:42

About.com에 좋은 자료가 있어서 공유한다.

TTreeView의 노드(Node)에 힌트를 보여주는 예제로 마우스 올리면 현재 노드의 인덱스를 구한다.

불행하게도 노드별 힌트를 자체 저장하지 못하므로 노드가 아닌 트리뷰의 힌트를 이용하여 표시한다.

노드별로 힌트를 저장하고자 할 경우는 별도의 TListBox TMemo 등을 이용하여 인덱스로 연결하면 될 듯하다.

 

procedure TfrmMyCF.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
   tree: TTreeView;
   hoverNode: TTreeNode;
   hitTest : THitTests;
   ht : THitTest;
 begin
 // TreeView의 ShowHint속성을 True로 설정하고
 
   if (Sender is TTreeView) then
     tree := TTreeView(Sender)
   else
     Exit;
 
   hoverNode := tree.GetNodeAt(X, Y) ;      //현재 위치의 Node를 구한다.
   hitTest := tree.GetHitTestInfoAt(X, Y) ; //현재 위치의 hittest를 구한다

   if (lastHintNode <> hoverNode) then   //Node가 바뀌었으면
   begin
     Application.CancelHint;   //어플리케이션의 힌트를 안보이게

     if (hitTest <= [htOnItem, htOnIcon, htOnLabel, htOnStateIcon]) then
     begin
       lastHintNode := hoverNode;
       tree.Hint := NodeHint(hoverNode) ;
     end;
   end;

 

// 추가로 HitTest의 값 출력
//     THitTest = (htAbove, htBelow, htNowhere, htOnItem, htOnButton, htOnIcon,
//    htOnIndent, htOnLabel, htOnRight, htOnStateIcon, htToLeft, htToRight);

   edHitTest.Text := '';
   for ht in hitTest do
   begin
     edHitTest.Text := edHitTest.Text + GetEnumName(TypeInfo(THitTest), integer(ht)) + ', ';     // uses TypInfo
   end;

end;

 

function TfrmMyCF.NodeHint(tn: TTreeNode): string;  //여러줄로 힌트 표시
begin
  result := Format('노드 힌트 인덱스  ' + #13#10 +
                   'AbsoluteIndex: %d' + #13#10 +
                   'ParentIndex: %d' + #13#10 +
                   'Index: %d', [tn.AbsoluteIndex, tn.Parent.Index, tn.Index]) ;
end;