트리뷰(TTreeView) 노드(Node)의 힌트, THitTest, GetNodeAt, GetHitTestInfoAt 이용
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;