2

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

  1. “取消”按钮(一个 TBitBtn)的 Cancel 属性设置为 true。
  2. “取消”按钮的默认属性设置为 false。
  3. “取消”按钮的 modalResult 设置为 mrCancel。

注意:我正在使用仍在 Borland C++ Builder 5 中编译的旧遗留应用程序。我们有一个单独的项目来替换它 - 我只是在进行生命周期结束维护。

更新

四个月后,我终于不再摸不着头脑了……事实证明,应用程序的父窗体定义了一个运行时 OnShortCut 处理程序。我只需要禁用 Esc 处理程序就可以在子对话框上工作。

4

6 回答 6

4

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

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

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

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

  4. 如果您仍然没有发现问题,请检查另一个组件是否将其 ShortCut 属性设置为处理转义键。

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

于 2008-12-30T21:07:18.587 回答
1

可能是 Form 的 KeyPreview 属性已设置为 true。这是 Escape 键经常/可能被禁用的地方。KeyPreview 属性也经常被启用以捕捉 [Return] 按键按下(即 OnKeyPress)以前进到下一个字段而不是关闭表单。

于 2008-12-30T23:49:20.040 回答
1

您还可以创建另一个对话框,在其中添加取消按钮,然后查看 Escape 键是否有效。然后比较两种形式的DFM源,检查设置的差异。

于 2009-01-02T09:53:03.297 回答
1

是否存在带有逻辑阻止其关闭的“CanClose”类型事件?

于 2009-01-18T14:12:01.460 回答
1

还要记住,对话框需要通过 ShowModal() 而不仅仅是 Show() 调用。例如,如果您的表单名为“FAskDialog”,那么显示它的代码应该是

FAskDialog->ShowModal();

而不是

FAskDialog->显示();

如果对话框是通过 Show() 调用的,那么点击取消键或设置 ModalResult = mrCancel 将不会导致对话框关闭。

于 2009-01-27T20:47:17.233 回答
1

这是一个老问题,我可以给出答案:

您需要设置 KeyPreview = True 然后编写代码来捕获 ESC 键:

Form1::OnKeyUp(...)
{
if (Key == 27) {
Close();
}
}

于 2010-07-16T11:38:40.940 回答