系统使用了主程序+运行包+带包编译DDL的框架.主程序和DLL都带包便宜:共享Application由于在自定义控件中使用了BDE的TQuery所以
在自定义包里requires了bdertl包,而bdertl包含了DBTables.pas文件问题:
现在想修改DBTables.pas原文件中的返回错误的两个函数,将其返回的错误信息
汉化,我将DBTables.pas文件复制到我的自定义控件的路径下,并在Library path
中设置其路径下优先于$(DELPHI)\Lib,但是编译后,达不到预期效果.
如果使用不带包编译的时候则没问题.引起该问题的原因分析:
1. 由于bdertl是系统包,不能被重编译,而我的系统又要求带包编译,所以当要使用
到DBTables.pas的时候,系统还是连接到bdertl70.bpl,所以提示内容还是英文.
2. 不带包编译的话,由于编译的时候,会自动连接到我修改过的DBTables.pas,所以
能达到效果.尝试过的方法:
1. 将bdertl另存为其他名字,然后编译,例如bdertl_ex.bpl,自定义包去掉原来的
bdertl,requires bdertl_ex.dcp.
出现问题,由于BDE只有dcu没有pas,所以在安装控件的时候会提示BDE已经存在于bdertl中了,
没办法安装.
2.将修改过的DBTables.pas生成dcu后,替换原来$(DELPHI)\Lib下的DBTables.dcu文件,
重编译,失败.问题:
1. 是否bdertl.bpl是不会被重新编译的?
2. 如果另外生成一个bdertl_ex.bpl的话,怎么避免与原来的bdertl冲突,即不会报bdertl已经包含了BDE.dcu了.
3. 是否有其他办法来解决,例如能不能在应用了DBTables.pas的地方加入编译指令,告诉编译器,
如果遇到应用DBTables.pas时,直接连接到DBTables而不要去包bdertl中找.声明:
1. 请不要说什么BDE不好,使用ADO之类的.
2. 希望能有其他的方案,但是要满足要求,例如在TQuery的OnxxxError事件中写代码,try之类的,但这些都存在一些问题,
例如返回一个错误99999 is not a valid value for field '编码'.The allowed range is 0 to 19999
我要如何翻译成:输入的数值99999并不匹配[编码]的取值范围. 允许的范围应该是从0到19999
这些如果修改原代码的情况下,只要DBConsts中的SBcdFieldRangeError的相关内容汉化则行,但是如果通过try之类的话
我们得到的可能只有一串错误信息或错误代码.
期待答案,欢迎讨论.

解决方案 »

  1.   


    带包编译了,与修改单元放到本地就没有什么关系了。你应该将这个单元的BPL重新编译才行。
      

  2.   

    DBTables.pas是属于bdertl70.bpl的,这个包好象是不能够被重编译的。
      

  3.   

    1、必须重新编译包才会有效的,因为最后运行时是看包中的内容,而不是看本地源文件;而且在带包情况下,如果这个单元在DCP里已被引用,编译器是根本不会去理你那个源文件的。
    2、看看这几个字符串是否以资源的形式进行保存(resourcestring),是的话可以从修改资源入手(Delphi大部份提示信息应该都是资源)
      

  4.   

    1.包不能被重新编译
    2.是写在resourcestring中,可以考虑这种方案,今晚回去试试!
      

  5.   

    最终使用了修改dbrtl.bpl里面的资源字符串.也算是一种解决方案.