1

在 Delphi 11 Alexandria 的 Windows 10 中的 32 位 VCL 应用程序中,我有一个 TreeView (TTreeView后代),其中MultiSelect = FalsePopupMenu = PopupMenu1,所以当我右键单击 TreeView 中的一个节点时,然后PopupMenu1被调用。

PopupMenu1.OnPopup事件处理程序中,我需要以编程方式选择右键单击的节点。我怎样才能做到这一点?

示例:在以下屏幕截图中,预选了第一个节点。当我右键单击最后一个节点以调用弹出菜单时,最后一个节点也会在视觉上被选中(尽管MultiSelect = False!):

在此处输入图像描述

但是,当我尝试在PopupMenu1.OnPopup事件处理程序中检测所选节点时:

procedure TformMain.PopupMenu1Popup(Sender: TObject);
begin
  CodeSite.Send(MyTreeView.Selected.Text', MyTreeView.Selected.Text);
end;

...然后 CodeSite 报告仍然选择了第一个节点!

那么如何设置PopupMenu1.OnPopup要选择的事件处理程序中的右键单击节点?

(请注意,TreeView 的OnMouseDown事件处理程序在PopupMenu1.OnPopup事件处理程序之后执行)

显然,TPopupMenu班级缺少OnBeforePopup活动!

4

1 回答 1

2

我知道的最简单的解决方案是使用OnContextPopup事件:

procedure TForm1.TreeView1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
  var TreeNode := TreeView1.GetNodeAt(MousePos.X, MousePos.Y);
  if Assigned(TreeNode) then
    TreeNode.Selected := True;
end;
于 2022-02-07T12:06:12.027 回答