delphi BPL编程 RTTI和getClass 之间的脱节,请高手指点

文熊 2012-03-15 09:53:38
delphi先前BPL常用的方式是先在BPL模块中 RegisterClass(TMYForm);
然后在主程序中,使用getclass(TMYForm);再动态生成一个对象使用之.
新的RTTI编程,不需要注册,直接使用,方式如下
var
LContext: TRttiContext;
LPackage: TRttiPackage;
LClass: TRttiType;
aForm: TForm;
hPack: HMODULE;
begin
hPack := LoadPackage('orpFlow.bpl');
if hPack = 0 then
begin
ShowMessage('载入流程模块失败!');
exit;
end;
for LPackage in LContext.GetPackages() do
begin
if SameText(ExtractFileName(LPackage.Name), 'orpFlow.bpl') then
begin
LClass := LPackage.FindType('utMyMain.TMyForm');
if LClass <> nil then
begin
aForm := GetTypeData(LClass.Handle)^.ClassType.Create as TForm;
aForm.Create(Application);
aForm.Show;
这种方法可以实现基本功能.
问题在于:GetClass返回值是 TPersistentClass ,=class of TPersistent;
RTTI方式的返回值是TClass,=Class of TObject;
两者不一致!!!!!
在一些老的接口中,新的RTTI方式无法接上.
请问高手有什么方法,可以打通这个断崖,从而使得BPL编程更加有灵活性?
...全文
285 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
文熊 2012-03-19
  • 打赏
  • 举报
回复
帖子沉了,自己顶顶
我看见佛 2012-03-15
  • 打赏
  • 举报
回复

procedure TSysMainForm.CreateForm(MenuName:string);
var AClass: TPersistentClass;
tempForm:TForm;
Dll_Name:string;
begin
AClass := GetClass(Dll_Name);
tempForm:= TForm(TComponentClass(AClass).Create(Application));
tempForm.Show();
end;
我的做法
wzwcn 2012-03-15
  • 打赏
  • 举报
回复
转换一下不行么。比如有个函数fun参数是TPersistentClass:

var c:TClass;
begin
...
if c.InheritsFrom(TPersistentClass) then
fun(TPersistentClass(c));
end;
文熊 2012-03-15
  • 打赏
  • 举报
回复
主要是这两个不是一般的类,而是Class of TXXXX,不好转换

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧