gpt4 book ai didi

delphi - TMenuItem-Shortcuts 覆盖 Controls 中的 Shortcuts (TMemo)

转载 作者:行者123 更新时间:2023-12-03 19:36:08 24 4
gpt4 key购买 nike

我该怎么做才能使菜单项的快捷方式不会覆盖本地控件的快捷方式?
想象一下屏幕截图中的这个简单的应用程序。它有一个“撤消”菜单项,并分配有快捷键 CTRL+Z(德语中的 Strg+Z)。当我在备忘录中编辑一些文本并按 CTRL+Z 时,我假设备忘录中的最后一个输入被还原,而是执行菜单项。

这在这个虚构的应用程序中尤其糟糕,因为撤消功能现在将删除我上次添加的“项目 3”,我正在编辑哪些属性。

CTRL+Z 只是一个例子。其他流行的快捷方式会导致类似的问题(复制和粘贴:CTRL+X/C/V,全选:CTRL+A)。

Mini Demo with menu item with CTRL+Z short-cut http://img31.imageshack.us/img31/9074/ctrlzproblem.png

最佳答案

VCL 旨在为菜单项快捷方式提供优先级。但是,当 ActiveControl 为 TCustomEdit(调用 Undo 等)时,您可以编写您的项目单击处理程序(或操作执行处理程序)来执行一些特殊处理。

编辑:我知道您不喜欢在代码的许多地方(所有菜单项或操作处理程序)处理所有可能的特殊情况。恐怕我不能给你一个完全满意的答案,但也许这会帮助你找到更通用的解决方案。在您的表单上尝试以下 OnShortCut 事件处理程序:

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
Message: TMessage absolute Msg;
Shift: TShiftState;
begin
Handled := False;
if ActiveControl is TCustomEdit then
begin
Shift := KeyDataToShiftState(Msg.KeyData);
// add more cases if needed
Handled := (Shift = [ssCtrl]) and (Msg.CharCode in [Ord('C'), Ord('X'), Ord('V'), Ord('Z')]);
if Handled then
TCustomEdit(ActiveControl).DefaultHandler(Message);
end
else if ActiveControl is ... then ... // add more cases as needed
end;

您还可以以类似的方式覆盖 IsShortCut 方法,并从这个新的 TCustomForm 后代派生项目的表单。

关于delphi - TMenuItem-Shortcuts 覆盖 Controls 中的 Shortcuts (TMemo),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com