Delphi虽然是一个相当棒的RAD工具,但是难免也有小的瑕疵。遇到这种情况我们往往会找到Delphi/Source中的源代码进行修改,把这个源代码加入我们的Application,重新编译一下可执行程序就解决了这些小虫子。
但是如果我们要发布的是应用程序是“Build with runtime packages”(就是说,要连同该应用用到的BPL一起发布才能正常运行应用程序),我们可能需要把诸如VCL70.bpl,RTL70.bpl一起发布。可是这些BPL都是安装Delphi时自带的,如果发布这些BPL的话,其中的BUG也会一起发布,有没有办法打造一个没有BUG的BPL文件呢,就是说如何修改并重新生成系统已有的BPL呢?
下面我们就演示一下修改VCL70.bpl的方法:New 一个Package,在这个Package中创建一个普通的Form,Compile一下这个Package,会提示加入VCL,当然要同意了。这个时候可以看到在Requires里有一个vcl.dcp,双击它,会自动产生一个vcl.dpk,另存为vcl70.dpk,可能会有其他提示不管它。然后再编译一下(编译有问题的话,用dcc32命令行编译),缺省生成的vcl70.bpl存放在Delphi/Projects/Bpl下。这个就是你修改过Delphi源代码生成的无BUG的BPL,拷出来随便发布吧,如果怕和系统的弄混,可以改一下这个Package的版本号再生成。
如果要修改的是其他的包呢?很简单,刚才是New了一个Form,因为TForm在VCL中所以会看到Requires里增加了VCL,如果增加的是另一个包里的内容,或者引用了另一个包的单元,自然就会提示你并自动在Requires里加入相应的DCP了,其实最终目的还是要看到这个DCP双击它自动打开一个DPK工程。
另外,这个方法只能适用于有源代码的包,废话啦,没有源代码怎么修改BUG。
有的同志会把vcl.dpk命名成其他的名字,这样也没问题,随自己高兴怎么改就怎么改。
BPL包无法调试的问题
由于系统结构是Host主程序动态加载BPL包的模式。所以用到了Package的调试,但无论如何有一个包就是无法调试(加断点不起作用)。经过N久的查找,发现:
1.包Package在编译,生成的时候会自动产生DCP和BPL文件,缺省产生到Delphi/Projects/BPL下。
2.BPL文件的生成路径可以在Project/Options/Directories中修改
3.多个Package联合调试时,最好把DCP生成在同一个路径下,并且在Tools/Invironment Options/Library的Library Path中添加。
4.调试时Delphi在Library中按从上到下的顺序搜索DCP文件,如果第一个搜索到的DCP和最新的源代码是配套的,会进入调试,否则不会进入调试。
我遇到的问题是这样造成的:首先保存了一个包,顺手Build了一下,这时候生成的BPL和DCP都在Delphi/Projects/BPL下。后来又改了Project中的DCP生成路径,生成到专门放DCP的文件夹。在后来的运行调试中,由于系统第一个会找到我生成到Delphi/Projects/BPL下的那个没有任何功能的DCP,自然和我目前的BPL是不匹配的,所以就无法调试。
做开发不能调试实在是太痛苦了,终于在忍耐了一周之后要彻底解决这个问题,吃过晚饭七点多搞到现在凌晨两点,才算是搞清楚了,以后再也不会被包的调试困住了。