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