我对Borland C ++ Builder 5中的对话框上的Escape键处理程序有一个相当令人困惑的问题。对于触发取消事件的Escape键是否有任何其他要求(除了我在下面列出的那些) ?

  1. “取消”按钮(TBitBtn)的Cancel属性设置为true。
  2. “取消”按钮的Default属性设置为false。
  3. “取消”按钮的modalResult设置为mrCancel。
  4. 注意: 我正在使用仍在Borland C ++ Builder 5中编译的旧版应用程序。我们有一个单独的项目来替换它 - 我只是在做生命周期维护。

    <强>更新

    四个月后,我终于不再挠头了......事实证明,应用程序的父窗体定义了一个运行时OnShortCut处理程序。我只需要禁用Esc处理程序来处理子对话框。

有帮助吗?

解决方案

您应该检查阻止取消事件的所有可能方式:

  1. 首先,检查点击取消按钮是否实际关闭了表单。

  2. 然后检查是否有任何其他按钮的Cancel属性设置为true。

  3. 之后检查所有关键事件处理程序,不要忘记表单的事件处理程序,特别是如果启用了KeyPreview。

  4. 如果仍然没有找到问题,请检查另一个组件是否设置了ShortCut属性以处理转义键。

  5. 同时检查是否有任何键盘挂钩处于活动状态。

其他提示

可能是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){
    关闭();点击   }结果 }结果

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top