呵呵,你这个问题我以前问过,自己也做过不少试验,结果还是不行,大概是“鱼和熊掌不可兼得吧”,因为Install Packages中的Builde with runtime packages只有两种状态,要么选中,要么不选;所以你要使用自己的Bpl,其实就是Delphi意义上的动态链接库文件,而且要实现你所说的功能,只能选中的同时把原始设置都删去,但随着又会有新的问题出现。其实你的问题换个说法是这样:到底应该怎么做,可以使得Delphi默认的Builde with runtime packages那些原始参数中加入自己定义的Bpl文件,对吗?很抱歉,我也不会——废话!:(,如果谁知道也请告诉我一声。
>>我想将vcl的那些库加入exe中而我的BPL单独调用,怎么实现? 选中Builder with runtime package 在下面的编辑框内,只写上你的Yours.BPLIt's all right!
唉,笨呀,上述方法不行!Delphi Bug!只有动态Load Package了: procedure TForm1.Button1Click(Sender: TObject); var PackageModule: HModule; AClass: TPersistentClass; begin PackageModule := LoadPackage('YourPackage.bpl'); if PackageModule <> 0 then begin AClass := GetClass('TYourClassInPackage'); if AClass <> nil then with TComponentClass(AClass).Create(Application) do begin {Call the method of your class} Free; end; UnloadPackage(PackageModule); end; end;
没有办法了!要么你把所有的bpl都打包在Exe文件中,要么都不!如果你没有选中Builder with runtime package,Delphi会把你用到的所有BPL包含在内. 而一旦你选中Builder with runtime package,会把你用到的所有BPL排除在外.可恨!下面的Edit选项什么作用也不起!Delphi bug !
刚才深入研究了一下Package的编译及加载处理过程,现总结如下: 1.不选Build with runtime package,会把程序所用到的所有包(BPL)静态编译至这个Exe中.其中包括最常用的vcl,rtl包等. 2.选中Build with runtime package后,在Edit中填写上程序所用到的自定制的包(比如MyCustomPkg.BPL).如果这个包中包含(Requires)了其它运行时刻包(如vcl,rtl等),其中rtl肯定会被包含在内(因为一旦使用了Object类,必引用Classes单元),那么编译后的Exe将自动将自定制包,rtl和其它自定制包所引用的BPL排除在外.发布程序时,必须将这些BPL和自定制包一同随Exe发布. 3.所以如果选择了Build with runtime package,至少应该发布rtl.bpl.如果自定制的包引用了vcl控件,则还得发布vcl.bpl等. Delphi在这方面处理的还不够智能...
Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;SynEdit_D5
这是运行时间的包文件,删除你想编译进去的文件。
[email protected]
我说的是
菜单-〉工程-〉选项-〉包 的那一页
以运行时间库编译 -选中之后
下面的文本框变成可编辑样式,删除所有的文字,添加你的dcp进去。
别忘记设置搜寻路径,否则就会找不到。
路径设置在 -〉路径 那一页。会了吧!
LoadPackage
InitializePakage
UnloadPackage等
先用编译指令{$RunOnly ON} //把包编译成运行期包。
LoadPackage
UnloadPackage等
方法调用
选中Builder with runtime package
在下面的编辑框内,只写上你的Yours.BPLIt's all right!
procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule: HModule;
AClass: TPersistentClass;
begin
PackageModule := LoadPackage('YourPackage.bpl');
if PackageModule <> 0 then
begin
AClass := GetClass('TYourClassInPackage'); if AClass <> nil then
with TComponentClass(AClass).Create(Application) do
begin
{Call the method of your class}
Free;
end; UnloadPackage(PackageModule);
end;
end;
没有其它方法吗?
而且我只能得到TComponentclass而得不到我要的类啊。
如果是可视化控件可能会在form上放很多,不能设计会很麻烦的。
而一旦你选中Builder with runtime package,会把你用到的所有BPL排除在外.可恨!下面的Edit选项什么作用也不起!Delphi bug !
1.不选Build with runtime package,会把程序所用到的所有包(BPL)静态编译至这个Exe中.其中包括最常用的vcl,rtl包等.
2.选中Build with runtime package后,在Edit中填写上程序所用到的自定制的包(比如MyCustomPkg.BPL).如果这个包中包含(Requires)了其它运行时刻包(如vcl,rtl等),其中rtl肯定会被包含在内(因为一旦使用了Object类,必引用Classes单元),那么编译后的Exe将自动将自定制包,rtl和其它自定制包所引用的BPL排除在外.发布程序时,必须将这些BPL和自定制包一同随Exe发布.
3.所以如果选择了Build with runtime package,至少应该发布rtl.bpl.如果自定制的包引用了vcl控件,则还得发布vcl.bpl等.
Delphi在这方面处理的还不够智能...