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

Delphi 右键单击TMemo控件时如何执行自定义操作?,delphi,contextmenu,delphi-10.4-sydney,tmemo,Delphi,Contextmenu,Delphi 10.4 Sydney,Tmemo,在Delphi 10.4.2 32位VCL应用程序中,当用户左键或右键单击处于只读模式的TMemo控件时,我需要执行不同的操作: DoAction2包括调用一个特定的对话框 但是,当我右键单击Memo控件时,会显示TMemo控件的本机上下文菜单,并且不会执行DoAction2: 我已尝试使用以下代码停用备忘录控件的右键单击上下文菜单: Memo1.OnContextPopup := nil; 但它不起作用:右键单击备忘录控件时,上下文菜单仍会显示 因此,当右键单击备忘录控件时,如何停用本机上下

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

DoAction2包括调用一个特定的对话框

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

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

Memo1.OnContextPopup := nil;
但它不起作用:右键单击备忘录控件时,上下文菜单仍会显示

因此,当右键单击备忘录控件时,如何停用本机上下文菜单并执行操作?

这很简单

您的代码Memo1.OnContextPopup:=nil;没有效果,因为Memo1.OnContextPopup属性已经是nil,正如您在对象检查器中看到的那样;也就是说,默认情况下没有自定义处理程序

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

程序TForm1.MEMO1上下文PopusSender:ToObject;鼠标点:TPoint; 变量处理:布尔; 开始 已处理:=真; 终止 现在,默认上下文菜单被抑制,您可以尝试,例如

程序TForm1.1移动式下降装置:TObject;按钮:tmouse按钮; 换档:t换档状态;十、 Y:整数; 开始 如果按钮=英尺,则 Winapi.Windows.beep300250 否则,如果按钮=mbRight,则 Winapi.Windows.beep3001000; 终止 这很容易

您的代码Memo1.OnContextPopup:=nil;没有效果,因为Memo1.OnContextPopup属性已经是nil,正如您在对象检查器中看到的那样;也就是说,默认情况下没有自定义处理程序

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

程序TForm1.MEMO1上下文PopusSender:ToObject;鼠标点:TPoint; 变量处理:布尔; 开始 已处理:=真; 终止 现在,默认上下文菜单被抑制,您可以尝试,例如

程序TForm1.1移动式下降装置:TObject;按钮:tmouse按钮; 换档:t换档状态;十、 Y:整数; 开始 如果按钮=英尺,则 Winapi.Windows.beep300250 否则,如果按钮=mbRight,则 Winapi.Windows.beep3001000; 终止
不幸的是,它在这里不起作用。OnMouseDown事件处理程序被执行,但如果Button=mbLeft或Button=mbRight,则条件都不满足。@user1580348:我对此表示怀疑。Button的值是什么?TMouseButton只定义了3个值,因此如果它不是mbLeft或mblight,那么它必须是mbMiddle。我是类型歧义的受害者:我不得不将类型TMouseButton重命名为Vcl.Controls.TMouseButton,将类型mblight重命名为Vcl.Controls.mblight。现在它可以工作了。不幸的是,它在这里不起作用。OnMouseDown事件处理程序被执行,但如果Button=mbLeft或Button=mbRight,则条件都不满足。@user1580348:我怀疑这一点。Button的值是什么?TMouseButton只定义了3个值,因此如果它不是mbLeft或mblight,那么它必须是mbMiddle。我是类型歧义的受害者:我不得不将类型TMouseButton重命名为Vcl.Controls.TMouseButton,将类型mblight重命名为Vcl.Controls.mblight。现在可以了。您是否考虑过将左键单击操作移动到OnClick事件,将右键单击操作移动到OnContextPopup事件?@RemyLebeau:请记住,您可以通过右键单击以外的其他方式调用上下文菜单。@RemyLebeau您是对的:这是另一种可能性。但是我永远不会发现下面的类型歧义。您是否考虑过将您的左键单击操作移动到OnClick事件,您对OnContextPopup事件的右键单击操作?@RemyLebeau:请记住,您可以通过除右键单击以外的其他方式调用上下文菜单。@RemyLebeau您是对的:这是另一种可能性。但是我永远也不会发现下面的类型歧义。
Memo1.OnContextPopup := nil;