在Windows应用程序,很多都有快捷键功能,这个Delphi也有,就是一个按钮上面有一个比如剪切(&X),这个时候剪切的快捷键就是Alt+X,这个功能有时候还是挺好用的,最近,公司中有同事,好些使用了SpeedButton,然后使用本方式整的快捷键,都不能用,于是问我,这个是神马问题,实际上确切的说,也不是不能用,而是在某些情况下不能用,比如说使用PageControl等一类控件,然后再TabSheet下面再放一个Panel,然后再Panel上放SpeedButton,这个时候,使用快捷键就会导致响应有问题,比如说TabSheet1中直接就有一个SpeedButton就在TabSheet1上,TabSheet2上的SpeedButton在Panel上,两个TabSheet的SpeedButton的快捷键都是Alt+A,此时按道理来说,应该快捷键,哪个TabSheet是激活状态,就应该响应那个TabSheet上的SpeedButton的快捷键事件,可是实际上,只要有Panel的那个SpeedButton页面激活过之后,就会一直响应那个页面的SpeedButton的快捷键激活。而且会导致混乱。

针对这个问题,啥办法呢,自然不能盲目的去整,Delphi比较好的一点就是VCL源码都带了,所以直接去VCL中去找答案就行了,通过跟踪发现Alt+X这类快捷键模式实际上是响应的Delphi的CM_DIALOGCHAR这个消息,然后查看TwinControl中的实现

procedure TWinControl.CMDialogChar(var Message: TCMDialogChar);
begin
  Broadcast(Message);
end;

可知,他会向全局广播这个快捷消息,所有的控件都会获得这个消息,此时谁先获得,拦截处理之后,消息就不再继续。然后俺们看看SpeedButton的此消息处理过程

procedure TSpeedButton.CMDialogChar(var Message: TCMDialogChar);
begin
with Message do
if IsAccel(CharCode, Caption) and Enabled and Visible and
(Parent <> nil) and Parent.Showing then
begin
Click;
Result := ;
end else
inherited;
end;

IsAccel函数,实际上就是根据Caption来判定是否和快捷键匹配的,如果匹配,并且Enabled并且可视,并且Parent可视,那么就会触发了,于是问题根源找到了,就是这个parent可视,因为TabSheet上的Parent一直是可视的,所以这个就会触发,但是Parent的TabSheet确实隐藏了,所以,就导致了这个乱了。既然找到问题所在,那么针对此消息

过程进行拦截处理就行了。实现过程如下:

TSpeedButton = class(Buttons.TSpeedButton)
protected
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
end; procedure TSpeedButton.CMDialogChar(var Message: TCMDialogChar);
var
p: TWinControl;
CanDlgChar: Boolean;
begin
CanDlgChar := False;
p := Parent;
while P <> nil do
begin
CanDlgChar := IsWindowVisible(P.Handle);
if not CanDlgChar then
Break;
p := p.Parent;
end; if CanDlgChar then
with Message do
if IsAccel(CharCode, Caption) and Enabled and Visible and
(Parent <> nil) and IsWindowVisible(Parent.Handle) and Parent.Showing then
begin
Click;
Result := ;
end else
inherited;
end;

再去使用,则触发正常

关于SpeedButton中使用下划线快捷键不响应的问题的更多相关文章

  1. 详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  2. [转]关于python中带下划线的变量和函数的意义

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  3. [转帖]Go中的下划线

    Go中的下划线 https://blog.csdn.net/wanglei9876/article/details/50475864 下划线的作用: 在import 时 是仅引入 init 函数 在正 ...

  4. 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题

    1. 问题 由于在http请求头的头部中设置了一些自定义字段,刚好这些字段中含有下划线,比如bundle_name这种,后端在进去获取头部信息时,发现取不到对应的值 2. 原因及解决办法 分析 首先看 ...

  5. 为什么Java7开始在数字中使用下划线

    JDK1.7的发布已经介绍了一些有用的特征,尽管大部分都是一些语法糖,但仍然极大地提高了代码的可读性和质量.其中的一个特征是介绍字面常量数字的下划线.从Java7开始,你就可以在你的Java代码里把长 ...

  6. Scala中_(下划线)的常见用法

    Scala中_(下划线)的常见用法 地址:https://www.jianshu.com/p/0497583ec538

  7. Oracle中转义下划线

    原意是查询出所有的月粒度模型,但是在oracle中,下划线也代表匹配单一任何字符,导致15分钟粒度的模型也被查询出来,在此,需要对下划线做转义,使其只表示下划线的含义,可以使用ESCAPE()函数. ...

  8. 自定义T4模板去掉实体对象中的下划线

            在EF Power Tool 默认使用的T4模板中,如果数据库表有下划线,那么生成的实体也有下划线,但是我们实际使用的过程中,是不希望有下划线的,要解决这个问题,可以自定义这个T4模板 ...

  9. Python 数值中的下划线是怎么回事?

    花下猫语:Python 中下划线的用法令人叹为观止,相信你已在各种文章或教程中见识过了.在 2016 年的 3.6 版本之后,Python 还引入了一种新的语法,使得下划线也可以出现在数值中.这篇翻译 ...

随机推荐

  1. SQL优化笔记—CPU优化

    补充:常规服务器动态管理对象包括,下面有些资料可能会应用到 dm_db_*:数据库和数据库对象dm_exec_*:执行用户代码和关联的连接dm_os_*:内存.锁定和时间安排dm_tran_*:事务和 ...

  2. 黑马程序员_Java基础:实现多线程对共有数据的同步操作

    ------- android培训.java培训.期待与您交流! ---------- 实现多线程对共有数据的同步操作,主要涉及到多线程和同步. 虽然都是基础,但是这把刀还是要用熟练,等到使用的时候才 ...

  3. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...

  4. Coins(HDU 2844):一个会超时的多重背包

    Coins  HDU 2844 不能用最基础的多重背包模板:会超时的!!! 之后看了二进制优化了的多重背包. 就是把多重转变成01背包: 具体思路见:http://www.cnblogs.com/tt ...

  5. EJB到底是什么,真的那么神秘吗??

    1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...

  6. WinRAR安装、破解与去除弹窗广告

    本教程教大家怎么破解WinRAR压缩软件和去除广告(教程属于总结类,总结网上给出的方法,并且亲测有效,非本人原创)WinRAR5.40 2016.10.06 首先下载WinRAR软件,去它的官方英文网 ...

  7. mteclipse中运行的分页,搜索,列表批量删除的界面,它的源代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  8. unity3d asset store下载的代码所在位置

    Asset Store下载了官方的示例,却找不到了,又不想重新下载 PC:C:\Users\PCNAME\AppData\Roaming\Unity\Asset StoreMAC:"~/Li ...

  9. 微软BI 之SSRS 系列 - 巧用 RunningValue 函数在分组中排序并设置 RANK 排名

    开篇介绍 经常有像类似于这样的排序需求,以及设置分组下的排序序号.比如此图中要求城市 City 在省份下按照 Internet Sales Amount 总销售额进行排序,并标识在各省份下的排名. 实 ...

  10. jQuery.Callbacks之源码解读

    在上一篇jQuery.Callbacks之demo主要说了Callbacks对象初始化常见的选项,这一篇主要分析下Callbacks对象的源代码,对给出两个较为繁琐的demo // String to ...