VCL源码改造之小试牛刀

某日,利用TDBNavigator为同学编写一个数据库演示程序,因为对方并不熟悉所有的操作,所以,我给每样按钮都添加了Hint,为了美观还更改了Hint的外观,颜色,字体。正当我为自己的中文提示作的如此出色而高兴时,却有一个没有想到的问题出现了,见下图:



删除记录的提示框还有英文,虽然不影响用户理解,可我不甘心他就这么留在那,怎么办?

首先,我可以很清楚的知道,TDBNavigator封装了所有的操作,引发该提示框出现的条件,肯定是按钮的点击事件,或者鼠标的点击事件,因此我必须在TDBNavigator类的所有事件中找出与关键字Click类似的过程,又因为该过程可以被外部调用,因此,他必然存在于类声明的Public部分。

将鼠标挪到代码中TDBNavigator的字符串上,按下Ctrl键,然后按下鼠标左键,Delphi会自动打开TDBNavigator类的声明文件,并将光标定位于TDBNavigator类的声明位置。此时,在代码编辑框左侧的类树图中找到TDBNavigator类打开它,再选择Public,哈哈,真幸运,只有一个与Click有关的过程-BtnClick,双击它,光标定位在BtnClick的实现代码处(见下图)。简单的分析一下代码,BtnClick中的参数Index,是TNavigateBtn类型,该类型已经枚举定义了TDBNavigator中每个按钮,定义代码如下:

TNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast,
                  nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);

当该事件被触发时,函数中的Case语句通过传入的Index值判断,按下的是哪个按钮,接着调用相应地处理函数,其中nbDelete就是删除按钮,很明显,提示框就是由此处的MessageDlg函数产生,



函数的第一个参数SdeleteRecordQuestion即为提示框中显示内容,再次跟踪进入SdeleteRecordQuestion的定义文件中,终于找到了我们需要的东西。此时,你便可以直接修改字符串中的内容(如果你愿意,你可以将里面的所有英文都汉化),最后保存。



到这一步并没有完全结束,因为还需要将这个.pas文件生成.dcu文件,才能够使用。请将保存后的VDBConsts.pas(位于Source\VCL目录下)拷贝至Lib目录下,然后关闭Delphi,再打开Delphi(每次Delphi启动时,都会自动搜索Lib目录,当它发现VDBConsts.pas文件后,会自动把它编译成.dcu文件以供使用),重新编译使用TDBNavigator类的工程,一切完成(效果图如下)。



最后,我们可以做个总结:
1.通过这次修改,我们大致知道如何跟踪VCL代码。
2.明白如何编译自己修改后的VCL代码,使其生效。
3.case语句中除了整型外,枚举类型的使用技巧,尽管很多教科书中都提到这点,但是它仍容易被初学者忽略。

posted @ 2004-06-12 20:09  monkeyking  阅读(788)  评论(0)    收藏  举报