一个运行期包的问题。(100分)

  • 主题发起人 主题发起人 rockxu
  • 开始时间 开始时间
R

rockxu

Unregistered / Unconfirmed
GUEST, unregistred user!
在使用LOADPACKAGE函数装载包后,我可不可以在运行时更改包内窗体控件的属性?比如
说把一个数据模块打包后,我在调用它的窗体下可不可以加入更改它连接属性或是数据源
属性的语句?如果可以,该如何做?
我的分不多,请高手见谅!
 
你可以用消息机制实现,不过,千万别用Uses *****,那样,你的包是静态装载而不是动态
装载了。
 
请说的具体些,最好能举个例子,谢谢!
 
LoadPackage 的动态调用的实际应用意义不是很大, 使用动态调用时要注意以下几个
问题:

1. 你的Project Options中必须设置成使用 runtime package
2. 你想动态生成的 classes 所在的 unit 必须在 interface 的 uses 说明中, 这
样你的程序才能识别要生成的 class name
3. 在 使用 loadpackage 前必须 使用 UnLoadPackage 将要使用的 package 卸载
注意: 卸载一个 package 相应的使用它的所有 class 将会丢失
4. 使用 loadpackage 后, 可以直接创建 package 中的 class 不需要 registerclass
因为 registerclass 只是用来为 Component Palette 注册 component 的
<hr>
<a href="/delphi/attachments/pkgdemo.zip">下载答案程序</a>。
 
例子的下载有问题,请重发一下,谢谢!
 
to:晓风月
1:包没必要是Runtime Package的。
2:Uses了单元,包就是静态装载的了。
4:不用Uses单元,动态产生的类必须用RegisterClass的,不然,Class根本无法找到。
同时,RegisterClass是注册类,不是注册Component的,注册Component用
RegisterComponents

谢谢 Ares

To Rockxu:
要改变控件属性,用消息机制可以防止单元间相互引用。例如

Package中BaseForm的代码
Procedure TBaseForm.WNDPROC(var Message:TMessage);
begin
try
with Message do
Case Msg of
WM_User+$300: Button1.Caption:=String(WParam);//设置Button1的Caption
end;
except
end;
inherited;
end;

注意,在TBaseForm的初始化代码中加入RegisterClass(TBaseForm);

主程序:
type
FormClass=Class of TForm;
Procedure ShowBaseFmt;
var
h:THandle;
v:FormClass;
f:TForm;
s:String;
begin
h:=LoadPackage('MyPkg.bpl');
if h<>0 then
begin
v:=FormClass(GetClass('TBaseForm'));//得到TBaseForm类
f:=v.create(self); //创建类窗体实例
s:='AAAAAAAAAAAA';
sendMessage(f.Handle,wm_user+$300,integer(s),0);//发送消息,设置按钮Caption
f.showmodal;
f.free;
unloadPackage(h);
end;
end;
 
谢谢以上各位的解答,我还想问一句:如果一个BPL文件内是FORM是数据模块,那么要
f:=v.create(self);吗?还是要别的方法?
 
还有,打到包里的数据控件不能再更改了吗?比如说我在程序中动态改TQUERY控件中的SQL属性。谢谢
 
写法因实际而定,比如一个数据模块(TDataModule),你完全可以在包中单元初始化代码中
生成实例(DataModuleInst:=TDataModule.Create(Application.MainForm),未必要在主程序中用GetClass等去生成。
数据控件是可以改变SQL属性的,由于TDataModule没有Handle,因此你在你的TDataModule
中分配一个Handle,然后在主程序中向TDataModule发送消息。
要分配一个Handle,你首先必须写一个消息处理函数(与WNDPROC格式相同),然后用AllocateHWND
(WNDPROC)得到一个Handle。记住,在释放TDataModule时,要释放Handle(DeAllocateHWND)
 
分已经发出,非常感谢你的解答,能举个例子吗?
 
告诉我你的邮箱,我发例子给你。
 
rockxu@yeah.net
非常感谢。
 
后退
顶部