右键单击 TMemo 控件时如何执行我的自定义操作?

问题描述

在 Delphi 10.4.2 32 位 VCL 应用程序中,当用户(左或右)单击 TMemo 控件(处于 ReadOnly 模式)时,我需要执行不同的操作):

procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
  if Button = mbLeft then
    DoAction1
  else if Button = mbRight then
    DoAction2;
end;

DoAction2 包括调用特定对话框。

但是,当我右键单击 Memo 控件时,会显示 TMemo 控件的本机上下文菜单,并且不会执行 DoAction2

enter image description here

我尝试使用以下代码停用 Memo 控件的右键单击上下文菜单

Memo1.OnContextPopup := nil;

但它不起作用:右键单击 Memo 控件时上下文菜单仍然显示

那么如何在右键单击 Memo 控件时停用本机上下文菜单并执行我的操作?

解决方法

这很简单。

您的代码 Memo1.OnContextPopup := nil; 无效,因为 Memo1.OnContextPopup 属性已经是 nil,正如您在 Object Inspector 中看到的;也就是说,默认情况下您没有自定义处理程序。

您需要做的是添加这样一个自定义处理程序并将 Handled var 属性设置为 True。在设计时,使用对象检查器为您的备忘录创建一个 OnContextPopup 处理程序,代码如下:

procedure TForm1.Memo1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
  Handled := True;
end;

现在默认的上下文菜单被抑制,你可以尝试,例如

procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X,Y: Integer);
begin
  if Button = mbLeft then
    Winapi.Windows.Beep(300,250)
  else if Button = mbRight then
    Winapi.Windows.Beep(300,1000);
end;