研究心得------->Delphi(C++Builder)包(Package)动态加载和动态注册类技术的深入探索 (0分)

  • 主题发起人 主题发起人 wr960204
  • 开始时间 开始时间
原来是这样,怪不知道我一开始不能GetClass出来啦,原来在不同的空间上。
果然是高手,呵呵。。。
 
请问wr960204兄,
A.exe是主程序,B.bpl是包
为什么在编译A.exe的时候必须选中"Build with runtime packages"呢?能否不选中,也就是
将VCL.bpl这样的基本包文件包含在A.exe中。
 
wr960204不是说了吗
“不带VCL.BPL包的话Classes在Exe中有一份,而BPL用也有一份。但是带VCL.BPL后,EXE和BPL就共享一个Classes包。
Delphi的IDE也是这样实现的”
 
你也可以通过这个思想作个代理包,以后有什么新的包,就把代理包加进去就行了,
就能达到共享一个Classess包
 
to 小笨笨,你的想法真得很好,不过好像根本不可能实现
我在想,能不能让主程序本身不依赖任何一个包,能够独立运行,而且还可以动态加载别的包
 
真热闹,看看
 
也可以,不过要加载在的包要和你的程序约定好一个调用关系
 
经过在实际应用后,我发现如果做得项目不是很大的话,建议不要用包,如果是比较大的话使用
包好。
 
小笨笨
你不是想脱离VCLXX.BPL吗?首先说明这样你的BPL就要又统一的接口,而不能是任意的BPL。
unit Unit1;

interface
uses
Classes, Buttons;
Type
TBtn=Class(TBitBtn)

end;
procedure RegisterA(ClassList:TList);
implementation

procedure RegisterA(ClassList:TList);
begin
ClassList.Clear;
ClassList.Add(TBtn);
end;
例如把这个单元放到一个包中。那么我们编译完该包后就会有一个RegisterA的导出函数。
但是名字已经改变了。规则是:
@+单元名(首字母大写)+@+过程名称+$qqrp13Classes+@+参数类型
那么上面的过程就变成了
@Unit1@RegisterA$qqrp13Classes@TList
参照我最开始写的就可以得到这个过程的地址。
然后把返回的TList所指的类逐个注册就行了。
 
wr960204:
我在Delphi 6下做了以下一个Demo.dpk文件
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, Grids;

type
TMyTest = class(TForm)
StringGrid1: TStringGrid;
private
{ Private declarations }
public
{ Public declarations }
end;

procedure register;

var
MyTest: TMyTest;

implementation

{$R *.dfm}

procedure register;
begin
RegisterComponents('RxLib',[TMyTest]);
//RegisterClass(Tmytest);
end;

end.

Unit2.dfm内容:
object MyTest: TMyTest
Left = 363
Top = 257
Width = 389
Height = 288
Caption = 'MyTest'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object StringGrid1: TStringGrid
Left = 0
Top = 0
Width = 381
Height = 261
Align = alClient
TabOrder = 0
end
end

编译成Demp.bpl后,用你的程序调入包是可以,可是就是无法在Panel-->创建所选中的类的实例在Panel上
由于ListBox1上无对象。
不知是哪错了?
谢谢!
 
也就是 MyTest窗体中的内容无法在Panel上显示出来。不知是为什么,请高手帮忙。
 
窗体不要用RegistryComponent而是要用
RegisterCustomModule();
 
WR960204:
谢谢您的回答。可是我按你说的改了:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, Grids,DesignIntf,DesignEditors;

type
TMyTest = class(TForm)
StringGrid1: TStringGrid;
private
{ Private declarations }
public
{ Public declarations }
end;

procedure register;

var
MyTest: TMyTest;

implementation

{$R *.dfm}

procedure register;
begin
//RegisterComponents('RxLib',[TMyTest]);
//RegisterClass(Tmytest);
RegisterCustomModule(TMyTest,TCustomModule);//Borland/Delphi6/Source/ToolsAPI
end;

end.

可是一调用ListBox1上还是空空的。Panel1上根本不能显示TMyTest窗体的内容。
不知是什么原因,请大哥帮帮忙。谢谢!
 
请帮我把正确的register过程写出来,好吗?
谢谢!
 
wr960204:
或者能不能把你的Demo发一个让小弟学习学习。
 
我这边可以的呀
 
好东西,收藏
 
我用的是Delphi 6(Build 6.163)
就是不可以。不知各位可以的用的是什么版本的Delphi。
 
不知会不会与我在编译后的执行文件Project1.exe目录下只放
vcl60.bpl

designide60.bpl
两个文件有没有关系呢?
请问各位大侠
 
后退
顶部