VCL继承树查看器

draculamx 2019-07-28 12:32:04
ooolinux
这个家伙问题特别多。。。

他的有个问题,导致了这个软件的产生。。



链接:https://pan.baidu.com/s/1dZJqoBq7qwzUD4olOTJjUg
提取码:9k6b

目前只支持原生的VCL类型,赞不支持第三方控件,原因很简单,我懒。。。。。

使用方法:在文本框里输入一个类名,比如TEdit,点击“show”,右边就会从上至下,显示该类的派生树。。

...全文
134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
draculamx 2019-07-29
  • 打赏
  • 举报
回复
其实这涉及到一个问题,我们在编程的时候,要使用某个控件,就必须完成以下步骤,引用该控件的头文件,#pragma link "XXXX"。当我们在窗体上放入某个控件的时候,这些工作是IDE自动完成的。

现在要实现继承树对任意控件的查看,就存在一个问题,本身继承树的代码,就只引用了VCL最基本的控件。如果要查看VCL的扩展控件,或者第三方控件,那么在编写继承树的时候,就要把这些控件的头文件引用进去。要不然怎么编译呢?

还是以FastReport控件为例,我在写代码的时候,没有引用这个控件的任何头文件,现在程序运行起来了,能在运行时载入这个控件吗??好像不行吧。。。
draculamx 2019-07-29
  • 打赏
  • 举报
回复
我又试了一下,不需要在CPP中添加#pragma link "frxClass",只需要在头文件中,引用那些控件的头文件就行了。

那么就有一个很笨,但是很懒的办法:
把所有控件相关的.h都写到头文件中去,包括第三方的

这样就可以查看所有控件的继承树了
draculamx 2019-07-29
  • 打赏
  • 举报
回复
引用 8 楼 早打大打打核战争 的回复:
我说的运行时使用未知的类是像Delphi、CB的IDE那样,是基于包的,未知的类必须先编译到BPL,在初始化的时候调用RegisterClass/RegisterClasses注册了自己,然后使用包的程序就可以FindClass从字符串名获得类引用。但是前提是对方必须先把自己编译为二进制,在编译的时候还是需要知道相应的单元,所以如果要做到一个程序,输入任意类名,可以显示对应信息,那肯定是不行的。

和我想的一样,这就是个悖论,要看继承树,还是直接去帮助文档。。

还好这个东西只有十几行代码。。。不对,还好我懒。。
  • 打赏
  • 举报
回复
我说的运行时使用未知的类是像Delphi、CB的IDE那样,是基于包的,未知的类必须先编译到BPL,在初始化的时候调用RegisterClass/RegisterClasses注册了自己,然后使用包的程序就可以FindClass从字符串名获得类引用。但是前提是对方必须先把自己编译为二进制,在编译的时候还是需要知道相应的单元,所以如果要做到一个程序,输入任意类名,可以显示对应信息,那肯定是不行的。
draculamx 2019-07-28
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
Delphi类都有ClassParent、ClassName方法,所以列继承树是很简单的,运行时使用一个未知的类,要先RegisterClass/RegisterClasses


不好弄,就算是未知的类,如果你在编译的时候,没有引用该类所要用到的头文件,运行的时候,也不能正确的识别这个类吧。。
ooolinux 2019-07-28
  • 打赏
  • 举报
回复
引用 2 楼 draculamx 的回复:
是啊,RTTI,不过有个问题,其实是可以查看任意组件的,包括原生的和第三方的,但是有个问题,必须在Form中添加对应的头文件和对应的Link。。。我不知道怎么动态添加 比如,第三方控件,FastReport,你必须添加任意一个 Fastreport 的控件到窗体上,然后窗体的头文件就会自动添加: #include "frxClass.hpp" 窗体的CPP文件就会自动添加一句: #pragma link "frxClass" 然后就可以查看了: [img=https://img-bbs.csdn.net/upload/201907/28/1564295734_535924. 但是,程序运行的时候,怎么添加啊。。 交给你们了,我懒。。。
引用 3 楼 早打大打打核战争 的回复:
Delphi类都有ClassParent、ClassName方法,所以列继承树是很简单的,运行时使用一个未知的类,要先RegisterClass/RegisterClasses
试试老概的方法。 另外,你这个界面太宽了。
  • 打赏
  • 举报
回复
Delphi类都有ClassParent、ClassName方法,所以列继承树是很简单的,运行时使用一个未知的类,要先RegisterClass/RegisterClasses

draculamx 2019-07-28
  • 打赏
  • 举报
回复
是啊,RTTI,不过有个问题,其实是可以查看任意组件的,包括原生的和第三方的,但是有个问题,必须在Form中添加对应的头文件和对应的Link。。。我不知道怎么动态添加

比如,第三方控件,FastReport,你必须添加任意一个 Fastreport 的控件到窗体上,然后窗体的头文件就会自动添加:
#include "frxClass.hpp"
窗体的CPP文件就会自动添加一句:
#pragma link "frxClass"

然后就可以查看了:


但是,程序运行的时候,怎么添加啊。。
交给你们了,我懒。。。
ooolinux 2019-07-28
  • 打赏
  • 举报
回复
不错不错,其实Help里头也能看,没你这个方便,你这个用的RTTI?

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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