Borland C ++ Builder 5 - 通过Escape键取消不起作用
-
03-07-2019 - |
题
我对Borland C ++ Builder 5中的对话框上的Escape键处理程序有一个相当令人困惑的问题。对于触发取消事件的Escape键是否有任何其他要求(除了我在下面列出的那些) ?
- “取消”按钮(TBitBtn)的Cancel属性设置为true。
- “取消”按钮的Default属性设置为false。
- “取消”按钮的modalResult设置为mrCancel。 醇>
注意: 我正在使用仍在Borland C ++ Builder 5中编译的旧版应用程序。我们有一个单独的项目来替换它 - 我只是在做生命周期维护。
<强>更新强>
四个月后,我终于不再挠头了......事实证明,应用程序的父窗体定义了一个运行时OnShortCut处理程序。我只需要禁用Esc处理程序来处理子对话框。
解决方案
您应该检查阻止取消事件的所有可能方式:
-
首先,检查点击取消按钮是否实际关闭了表单。
-
然后检查是否有任何其他按钮的Cancel属性设置为true。
-
之后检查所有关键事件处理程序,不要忘记表单的事件处理程序,特别是如果启用了KeyPreview。
-
如果仍然没有找到问题,请检查另一个组件是否设置了ShortCut属性以处理转义键。
-
同时检查是否有任何键盘挂钩处于活动状态。
醇>
其他提示
可能是Form的KeyPreview属性已设置为true。 这是Escape键经常/可能已被禁用的地方。 KeyPreview属性也经常被启用以捕获[Return]键按下(即OnKeyPress)以前进到下一个字段而不是关闭表单。
您还可以创建另一个对话框,在其中添加“取消”按钮,并查看Escape键是否有效。然后比较两种形式的DFM来源并检查设置的差异。
是否有“CanClose”用逻辑阻止它关闭的类型事件?
还要记住,需要通过ShowModal()调用对话框,而不仅仅是Show()。例如,如果您的表单被命名为“FAskDialog”,那么然后显示它的代码应该像
FAskDialog-&GT;的ShowModal();
而不是
FAskDialog-&gt;显示();
如果通过Show()调用对话框,则点击取消键或设置ModalResult = mrCancel将不会导致对话框关闭。
这是一个老问题,我可以给出答案:
您需要设置KeyPreview = True,然后编写Code以捕获ESC键:
Form1 :: OnKeyUp(...)
{点击
if(Key == 27){
关闭();点击
}结果
}结果