Borland C ++ Builder 5 - 通过Escape键取消不起作用

时间:2008-12-30 17:21:10

标签: c++ event-handling c++builder

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

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

    更新

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

6 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

答案 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){
    关闭();
  }
}