我现在在看以前的一个老程序,除了主界面外,全部都是动态加载包,调用里面的窗体。主程序中菜单项对应的窗体类,是从数据库表中得到的,当我点击菜单时,首先判断这个窗体类是不是已经存在,如果不存在,则加载这个窗体类对应的包(包和窗体类的对应关系也是存储在数据库表中),然后在获得这个窗体类,在显示这个窗体。菜单对应窗体类,没办法,只能手工加入到数据库表中。
包和窗体类的对应,是通过一个exe文件执行的,而这个exe文件,则没有源代码。但执行效果可以看得到。当选择了一个bpl文件后,列表框中显示这个包中有哪些窗体类。我现在就比较困惑,这个功能是怎么实现的。
因为我查找了很多资料,说如果要超找包中的类,必须首先要对类进行注册,执行诸如下面的代码:
initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);
才能用FindClass或者GetClass根据类名得到相应的类。procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule : HModule;
AClass : TPersistentClass;
begin
PackageModule := LoadPackage('Package1.bpl');
if PackageModule <> 0 then
begin
//AClass := GetClass('TForm2');
AClass := FindClass('TForm2');
if AClass <> nil then
with TComponentClass(AClass).Create(Application) as TCustomForm do
begin
ShowModal;
Free;
end;
UnLoadPackage(PackageModule);
end;
end;
以上代码测试过,如果注释掉Form2中的那4行代码,以上代码根本无法找到TForm2。
而以前老程序留下的包中的窗体的源代码,根本就没有关于注册的那部分代码,
那他是如何得到bpl中的窗体类呢?
包和窗体类的对应,是通过一个exe文件执行的,而这个exe文件,则没有源代码。但执行效果可以看得到。当选择了一个bpl文件后,列表框中显示这个包中有哪些窗体类。我现在就比较困惑,这个功能是怎么实现的。
因为我查找了很多资料,说如果要超找包中的类,必须首先要对类进行注册,执行诸如下面的代码:
initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);
才能用FindClass或者GetClass根据类名得到相应的类。procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule : HModule;
AClass : TPersistentClass;
begin
PackageModule := LoadPackage('Package1.bpl');
if PackageModule <> 0 then
begin
//AClass := GetClass('TForm2');
AClass := FindClass('TForm2');
if AClass <> nil then
with TComponentClass(AClass).Create(Application) as TCustomForm do
begin
ShowModal;
Free;
end;
UnLoadPackage(PackageModule);
end;
end;
以上代码测试过,如果注释掉Form2中的那4行代码,以上代码根本无法找到TForm2。
而以前老程序留下的包中的窗体的源代码,根本就没有关于注册的那部分代码,
那他是如何得到bpl中的窗体类呢?
解决方案 »
- 请问 MediaPlayer filename 问题
- 造假数一数........................
- 初学者的烦恼
- Delphi2010和C#,如何共用压缩算法,比如ZLib
- 麻烦各位到这里看看,
- DELPHI的断点跟踪是怎么用的,我只知道F8是断点跟踪,但不知道是怎么用的,作用是什么
- 急!!在DELPHI5中如何以只读的方式打开excel,word文件
- 在DLL中怎样调用MDI窗体
- cobi (小新)请进
- 对DbGrid的小问题,请问各位大虾,70分。
- 怎么在后台打开IE并保留句柄用来关掉它??
- [DBMSSOCN] 一般性网络错误。请检查网络文档 (delphi7 + mssql2000 远程服务器访问)
Application.CreateForm(窗体类, 窗体名);就可以了
我想知道的是,给你一个bpl文件,如何得到这个文件中包含的窗体类。而这个bpl中窗体中的pas文件中,没有类似如下的代码:
initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);
以上代码是放在你的BPL里的,使用loadpackage('Package1.bpl')函数的时候,会自动执行
Package1这个BPL中的
initialization
RegisterClass(TForm2);在调用unloadpackage('Package1.bpl')函数时会执行BPL中的
finalization
UnRegisterClass(TForm2);用兴趣的话你可以看一下RegisterClass()函数和UnregisterClass()的源代码。另外注意在build的时候要把option里的勾打上,这样才能够动态的加载。
bpl文件是编译后生成的吧,而关于注册代码,是写到pas文件里的吧?