使用Delphi6.0的那些琐事儿

公司目前还在用Delphi6.0的东西,各种控件Bug,造成的问题根本找不到完善的解决方案。但项目上的问题总得解决啊,所以往往到最后,只能退而求其次的使用一些临时的策略进行规避。很多时候,确实能够解决了当下的问题,但埋藏的其他未知的隐患,在不经意间,又会出现。按照同样的处理逻辑,又解决掉这一轮新的问题。但。。。 依此反复,似乎总是别无他法。

言归正传,在本篇文章中说的问题就是一个典型的控件bug。情况是这样的,假如一个界面中,有TListView、TEdit、TLabel等控件。TEdit的父级控件是一个ToolBar,给该TEdit类型的控件建立一个OnExit事件,这就表示,当焦点离开TEdit的时候,OnExit事件函数就会被触发,情况也确实如此。但令人困惑的不是OnExit有没有被触发,而是被触发几次的问题。假设当前,焦点就在该TEdit控件上,按下Tab键后,TEdit失焦,OnExit被调用,这自然没有问题。但是当在TListView上进行鼠标单击操作后,同样造成TEdit控件失焦,只是此时OnExit事件函数被调两次。这就表示此次的单击操作,造成了该TEdit控件两次失焦。

遗憾的是,最终依然没有找到原因。所以尴尬的局面来了,没有定位到原因,如何解决这个问题。或许唯一的办法就是另辟他径,简单的说就是摒弃当前的处理逻辑,如何做呢?

再回到问题本身,我们希望当焦点离开TEdit控件的时候,如果TEdit控件中输入的内容不满足需要,就在OnExit事件函数中,给出弹窗提示。那么好啦,既然弹窗提示存在连续弹出两次的问题(前文说的,OnExit被调两次),那干脆改变一些设计,就是弹窗不要了,如果用户在TEdit控件中的输入非法,直接就输入不进去(注:这里在设计上的改变并无不妥,因为与客户需求不冲突。假如客户一定要弹框提示,那这种改变自然不行了)。举个例子,假如TEdit控件中要求只输入数字,而且限定在闭区间[5, 120]这样的范围。其它非法的输入一律无效,那么该如何实现呢?

这个实现当然不难,只是逻辑控制。但其中一些细节问题相当令人头疼,比如删除键造成的问题。在Delphi6.0中,对控件TEdit建立事件函数OnKeyPress。奇怪的是,这个事件函数能够捕捉到键盘中的BackSpace键,却无法捕捉到Delete键。一开始,我只考虑了BackSpace键进行删除的动作,然而,当用Delete键进行删除,却发现错误百出。比如光标定位就不对,还有delete与BackSpace键不能混用等等。

我们知道,delete是从前往后的删除,而BackSpace则相反。我忽略了这个,但最后才发现,这两个不同的删除键,造成的事件函数的执行顺序完全不一样。简单来说TEdit控件的两个事件函数,一个是 OnKeyPress(前面提到过),另一个是OnChange。你会发现,当你使用BackSpace键之后,先是OnKeyPress被调,再是OnChange,但是Delete键只会触发OnChange,对于OnKeyPress完全不起效(我不大明白,为什么会出现这样的问题,OnKeyPress就是针对键盘按键下压后的事件函数,但为什么对Delete键的下压完全不起效。其实不止是Delete键,Tab键也一样不起效,不过Tab倒能理解,毕竟它的功能与Delete有很大差别)。

最后,为了解决这些问题,我使用了SetWindowsHookEx函数,目的是为了捕捉Delete按键。一开始我只捕捉了Delete按键,然后设置了一个标记,当进行Delete操作的时候,遵循与BackSpace按键不同的逻辑,但还是出问题了。因为Delete的删除操作会导致BackSpace按键失效。如TEdit中目前有输入值120,先使用Delete删掉1,TEdit中就剩20了,再用BackSpace进行删除的时候,发现只有光标在移动,删除失效。为什么会这样,依然不能理解,追踪代码下来,发现代码逻辑完全正确,可结果就是不对,崩溃啊!没有办法,只能在SetWindowsHookEx中又增加了对BackSpace键的捕捉,算是把问题解决了。

解决了一个小问题,却引出了一大堆大问题”,或许编程就是这样,当你真正的深入到细节当中去了,才会发现简单的问题并非预料的那么简单。这篇文章,说了一大堆的废话,却没有讲真正的技术,就先这么开始吧

Delphi6.0的那些相关推荐

  1. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  2. Delphi存取图像完整解决方案

    http://blog.sina.com.cn/s/blog_693cf1cf0100plkq.html 对于涉及图像数据的数据库应用程序,图像数据的存取技术是一个关键.由于缺少技术文档及DEMO例程 ...

  3. 用delphi操作mapinfo

    1.概述 MapInfo Professionnal 6.0是美国MapInfo公司开发的一种桌面地理信息系统开发平台,因为它小巧玲珑.易学易用,同时对空间数据具有强大的采集.存贮.分析等功能,所以成 ...

  4. oracle 库存管理系统,库存管理系统

    内容介绍 原文档由会员 刘阳 发布 库存管理系统 页数 14 字数 9186 [摘要] 库存管理系统是生产.计划和控制的基础.本系统通过对仓库.货位等帐务管理及入/出库类型.入/出库单据的管理,及时反 ...

  5. Delphi手机短信

    目前大多数的企业及学校内部都建有Intranet.并建有内部网站实现资源共享.为了使用户及时的得知网上的最新信息,很多网站都采用了手机短信提醒的方式,但使用中国移动或中国联通的SP方式,会大大的增加企 ...

  6. DBGrid 各属性的设置

    在 Delphi 语言的数据库编程中,DBGrid 是显示数据的主要手段之一.但是 DBGrid 缺省的外观未免显得单调和缺乏创意.其实,我们完全可以在我们的程序中通过编程来达到美化DBGrid 外观 ...

  7. 计算机人事管理参考文献,计算机人事管理系统毕业论文设计.doc

    大学毕业设计(论文)用纸 PAGE PAGE 6 人事管理系统 计算机科学与技术 200年月日目录 TOC \o "1-5" \h \z \u 第一章 概 论 2 1.1 课题来源 ...

  8. delphi控件使用

    Standard页 1-      Tlistbox控件 重要属性items.* 举例,界面设计如下左,执行结果如下右: 代码为 procedure TForm1.Button1Click(Sende ...

  9. 计算机机房管理系统范文,计算机机房管理系统探讨论文

    在信息化教育不断普及和发展的今天,计算机已渗透到了人类社会的各个领域.计算机课程已经成为高等院校和各类各级学校的学科重点,学生的普及课程.上机实训在教学中扮演着越来越重要的角色.如何有效的利用现有的计 ...

  10. KeyLife富翁笔记

    KeyLife富翁笔记 作者 : archonwang 标题 : DBGrid 应用全书(全面修订正在进行时) 关键字: 分类 : 开发经验 密级 : 公开 (评分:★★★★ , 回复: 67, 阅读 ...

最新文章

  1. mysql备份实例攻略
  2. volitile关键字
  3. c语言按行存储数据库,C语言实现按行读写文件
  4. 也分享自己做的JS扫雷小游戏
  5. php+管道+pipe管道,angular2+管道pipe
  6. 使用Apache Drill REST API通过Node构建ASCII仪表板
  7. C#/VB.NET 复制Excel中的指定单元格区域
  8. php商品分类添加字段,zblogPHP分类模板添加自定义字段(调用UEditor编辑器输入法)...
  9. 几种所见所得的在线编辑器
  10. Sublime好看字体
  11. Edge在IE模式下加载网页 - Edge设置IE兼容性
  12. 关于Android学习的三个终极问题
  13. SAP License:公司上一套sap系统得多少钱?
  14. BUU-0CTFpiapiapia(反序列化字符串逃逸)
  15. 怎么实现在FireFox IE Opera Safari 都可以正常播放WMV和MOV的网页播放器代码
  16. 宇视科技C-C++软件开发岗位校招面试过程
  17. 让VMWare拥有Intel千兆网卡
  18. 【云原生 | Kubernetes 系列】--Envoy熔断
  19. linux 文件末尾追加内容
  20. 【Typora】添加水印

热门文章

  1. Flash游戏开发性能优化
  2. 爱普生EPSON打印机 ME1+ (ME1)清零软件及方法
  3. Clion配置MinGW
  4. Kali Linux 暴力破解 Excel密码
  5. odoo16 Windows绿色版 下载就能尝试了
  6. AotucCrawler 快速爬取美女图片
  7. SSM实现会议室预约管理系统
  8. CSM会议室预约系统源码
  9. 计算机公式sin,三角函数计算公式大全
  10. 【仿美团点餐App】—— 首页(二)