Delphi、C++Builder如何让三方控件可以在设计时实例化运行?

ooolinux 2022-01-27 19:09:37

IDE事先(IDE本身被编译发布时)不认识该控件,不知道控件的类型信息。控件被放到窗体上,在设计时就可以实例化运行(不是项目编译以后运行),所以可以设置属性(属性其实是调用成员函数),使控件运行(改变外观,加载图片显示,连接数据库获取数据并显示等),与通过代码编译后运行效果一样,真正的“所见即所得”。
但是我有点不清楚这是如何做到的,好像跟TClass以及虚构造函数有关?还有,IDE如何得知获取三方控件具体的属性和事件信息显示在对象检视器里?

...全文
448 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

关系就是这样的:
function CreateObject(AClass: TClass; AOwner: Tcomponent = nil): TObject;
begin
Result := AClass.NewInstance;
if Result.InheritsFrom(TComponent) then
TComponent(Result).Create(AOwner)
else
Result.Create;
end;

tanqth 2022-01-30
  • 举报
回复
@日立奔腾浪潮微软松下联想 他想了解是的IDE自身。
  • 举报
回复
@tanqth 说的就是IDE如何设计时实例化组件,你的理解力有问题
ooolinux 2022-01-30
  • 举报
回复
@日立奔腾浪潮微软松下联想 TComponent.Create是虚函数所以调用到控件的虚构造函数?help里没有这个函数
6条回复
  • 打赏
  • 举报
回复

编译器会生成rtti信息,然后ide可以通过反射机制获取控件的详细信息,比如类型,属性,成员函数等,然后自然就能实例化控件了。

ooolinux 2022-01-30
  • 举报
回复
@安禄山中兴大唐 实例化控件和虚构造函数是什么样的关系?
  • 举报
回复
@ooolinux 没什么关系吧。就算构造函数不是虚函数也一样可以实例化,这个其实我感觉只要能拿到编译器生成的类型信息,找到该类型的构造函数的地址,调用一下构造函数不就创建了类型的实例了吗。
ooolinux 2022-01-30
  • 举报
回复
@安禄山中兴大唐 就是有点不清楚IDE被编译时如何知道一个未来控件的构造函数地址
4条回复
  • 打赏
  • 举报
回复

IDE通过包中的RTTI获得组件的信息(类名,属性名、类型,方法/事件名、原型等等),所以安装组件可以不需要源码,只需要安装二进制包即可(有源码也要先编译成包)。能设计时实例化是因为Delphi类支持虚构造函数,构造函数的地址可以在运行时确定(非虚函数的地址是在编译时确定的,所以无法实例化在程序自己,比如IDE,编译时未知的类)。
Qt的plugin能够设计时实例化是因为它要求plugin引用它的接口类,Qt设计器通过接口方法间接让组件自己来实例化、析构、设置属性等等),这要求plugin有源码(除非保证下一条),而且plugin和IDE要用同一编译器的同一版本编译(意思是如果安装Qt Creator之后升级了工具链,安装plugin需要Qt Creator本身也重新编译)。

ooolinux 2022-01-28
  • 举报
回复
@日立奔腾浪潮微软松下联想 IDE通过RTTI获得控件的类型信息后,在设计时如何实例化一个控件对象?
  • 举报
回复
@ooolinux FindClass、GetClass可以获得类名对应的元类(meta class)指针,然后调用元类的NewInstance方法就可以创建实例
tanqth 2022-01-29
  • 举报
回复
@ooolinux 他说这个不是在实例化,而是已实例化后去获取对应类(或控件)的各种属性信息。
7条回复
tanqth 2022-01-27
  • 打赏
  • 举报
回复

这个其实就是插件与接口处理的,IDE本身有很多接口,控件本身也分为运行时与设计时,他通过接口注册告诉IDE现在多了一个可以使用的东西。然后IDE就可以调用并运行。

ooolinux 2022-01-27
  • 举报
回复
@tanqth 大概是这样
tanqth 2022-01-27
  • 举报
回复
@ooolinux 是的哈。
ooolinux 2022-01-27
  • 打赏
  • 举报
回复

IDE本身也是一个程序,IDE程序运行要实例化一个类的对象(就是设计时实例化),必须在IDE本身程序被编译时知道该类的类型信息。但是IDE本身被编译时不知道哪些三方控件的类型信息。

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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