如何获取触发弹出菜单的树视图项?

时间:2013-12-25 13:37:37

标签: delphi firemonkey firemonkey-fm2

它可能是一个愚蠢的问题,但我有一个与许多TTreeViewItems链接的弹出菜单。问题是TTreeView.Selected属性永远不会在右键单击时设置。 GetMousePos倾向于返回下一个或前一个TTreeViewItem的坐标。如何获得实际触发弹出窗口的项目?

2 个答案:

答案 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)

当你在PopupMenu中单击项目时,

似乎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)