如何 select 在 PopupMenu.OnPopup 事件处理程序中右键单击 TreeView 节点?

How to select the right-clicked TreeView node in PopupMenu.OnPopup event-handler?

在 Windows 10 in Delphi 11 Alexandria 中的 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 class 缺少 OnBeforePopup 事件!

我知道的最简单的解决方案是使用 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;