它可能是一个愚蠢的问题,但我有一个与许多TTreeViewItems链接的弹出菜单。问题是TTreeView.Selected属性永远不会在右键单击时设置。 GetMousePos倾向于返回下一个或前一个TTreeViewItem的坐标。如何获得实际触发弹出窗口的项目?
答案 0 :(得分:2)
你可以像这样使用TPopupMenu的 OnPopup 事件:
procedure TForm7.PopupMenu1Popup(Sender: TObject);
var
aNode: TTreeNode;
p: TPoint;
begin
p := TreeView1.ScreenToClient(PopupMenu1.PopupPoint);
aNode := TreeView1.GetNodeAt(p.X, p.Y);
if aNode <> Nil then
caption := aNode.Text;
end;
答案 1 :(得分:2)
似乎TPopupMenu.PopupPoint
返回(0,0)
点(在Delphi XE2 中,docwiki说它在内部用于设置菜单的位置,似乎它菜单消失时设置为0)。
所以在这种情况下,在我看来,最简单的方法是处理TreeView.OnMouseDown
,你可以保存对所选项的引用,然后在弹出项事件处理程序中使用它;
所以,在下面的exmaple代码中,我已将FClickedItem : TTreeViewItem
添加到表单类中;
procedure TSampleForm.SampleTreeViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
if button = TMouseButton.mbRight then
FClickedItem := SampleTreeView.ItemByPoint(x,y)
else FClickedItem := nil;
end;
procedure TSampleForm.TestMenuItemClick(Sender: TObject);
begin
if Assigned(FClickedItem) then
ShowMessage(Format('Item `%s (%s)` was selected!', [FClickedItem.Text, FClickedItem.Name]))
else ShowMessage('there is nothing to show');
end;
更新:我刚刚浏览了源代码,私有变量TPopupMenu.FPopupPoint
(readonly属性)未在实现代码中使用,这就是为什么它总是= (0,0)