1

在 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不会执行:

在此处输入图像描述

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

Memo1.OnContextPopup := nil;

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

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

4

1 回答 1

4

这很简单。

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

您需要做的是添加这样一个自定义处理程序并将Handled var属性设置为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;
于 2021-05-18T18:47:56.817 回答