【发布时间】:2011-08-02 12:56:16
【问题描述】:
在默认的 Windows 设置下,除非用户按下 ALT 键,否则加速键不会显示在对话框中。
Delphi的TLabel控件不遵守这个约定,如下图:
虽然标签和复选框都指定了加速键,但复选框正确地隐藏了它,但标签没有。当然,当ALT被按下时,加速器显示复选框,但这是不正确的行为。
我对为什么会发生这种情况的理解是,实现此行为的 VCL 代码包含在 TWinControl 中,例如 UpdateUIState 方法,并且依赖于向底层窗口控件发送 WM_CHANGEUISTATE 消息。由于TLabel 没有窗口化,它错过了这个处理。
任何人都可以提出一种方法来实现非窗口控件的所需行为吗?
更新 1
我刚刚发现组合框和无线电组也不响应 UI 状态。
更新 2
【问题讨论】:
-
我是否认为您希望将其用于任何非窗口控件,而不仅仅是 TLabels?
-
您是否在父窗口收到 WM_CHANGEUISTATE 时手动尝试设置/清除 TLabel.ShowAccelChar? (显然是残酷的黑客攻击。)
-
@Marjan 原则上我认为所有非窗口控件都需要它。在实践中,我想不出任何带有我使用的不是标签的加速器文本的控件。
-
因此您可以编写一个小的非可视组件,添加所有您希望启用该行为的控件,或者在表单中添加一个列表 (FDynamicLabels:TObjectList)。
-
摆弄 ShowAccelChar 根本无济于事。在 ShowAccelChar=false 的情况下,TLabel 将显示“&”而不是下划线。
标签: delphi