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

How to execute my custom action when right-clicking on a TMemo control?

在 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:

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

Memo1.OnContextPopup := nil;

但它不起作用:右键单击“备忘录”控件时,上下文菜单仍然显示。

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

这很简单。

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

你需要做的是添加这样一个自定义处理程序并将Handledvar属性设置为True.在设计时,使用 Object Inspector 为您的备忘录创建一个 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;