关于RTTI,高人请进!伴水兄,chechy... 你们在吗?

liang_z 2002-04-11 07:42:14
我想在程序运行的时候知道一个结构体有哪几个成员,
并想对它作赋值操作。就象类一样,可以用ClassInfo来取。
{$M+}
type
R_Test = packed record
A : Integer;
B : Double;
end;
{$M-}

但是用TypeInfo(R_Test)时编译器告诉'R_Test' no Type info.
...全文
50 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
liang_z 2002-04-12
  • 打赏
  • 举报
回复
看样子是只能定义类了!
888789 2002-04-12
  • 打赏
  • 举报
回复
首先声明我也不懂,
但个人觉得应该将记录定义改成类定义后才有可能满足你的要求。
因为RTTI是专为类而设计的。参看了一些这方面的书籍后。发现它实际上是在存储类的信息时将RTTI的相关信息一起存进去了。在Borland的机制中好像是放在存在虚函数地方的前面。包含了类名,父亲名等相关信息。而存储记录不使用这种方法。所以赞成用: skyweb2k(skyweb) 的解决方法。
panyiming 2002-04-12
  • 打赏
  • 举报
回复
之所以IDE可以直接访问所有的成员,我猜是因为有DCU(包括内存中的DCU)文件,才会有那样的功能吧。总之和RTTI不是一回事。
VSaber 2002-04-12
  • 打赏
  • 举报
回复
看看侯俊杰的《深入浅出mfc》,关于mfc源码分析,有关于实现rtti的原理,虽然是vc的,但是对你也有帮助。
panyiming 2002-04-12
  • 打赏
  • 举报
回复
记录类型没有RTTI的证据:
type
R_Test = packed record
higklmn222 : Integer;
end;
TMyClass = class(TComponent)
Fabcdefg: Integer;
published
property abcdefg111: Integer read Fabcdefg write Fabcdefg;
end;
在生成的EXE文件中可以找到'abcdefg111'这个字符串(用ultraedit之类的工具打开),但是没有'higklmn222'!即使使用$M+,RTTI中好像也只能访问published的内容,而不能访问其它的成员.
liang_z 2002-04-12
  • 打赏
  • 举报
回复
在我的系统中为每个记录定义一个类的话,好象多了点。
skyweb2k 2002-04-12
  • 打赏
  • 举报
回复
Delphi 帮助文档里提到RTTI{$M+}时说,
The $M switch directive controls generation of runtime type information (RTTI). When a class is declared in the {$M+} state, or is derived from a class that was declared in the {$M+} state, the compiler generates runtime type information for fields, methods, and properties that are declared in a published section.
也就是说,RTTI只对类的Published节下的字段、属性、方法有效。

你可以把你的记录定义改成类定义,再用{$M+},应该就OK了。
liang_z 2002-04-12
  • 打赏
  • 举报
回复
今天啊,
有10个人回复了,
我还以为是有人带我解决了呢?
原来白高兴了!
dancemaple 2002-04-12
  • 打赏
  • 举报
回复
gz
Linux2001 2002-04-12
  • 打赏
  • 举报
回复
RTTI就是运行期类型信息
cz3w 2002-04-12
  • 打赏
  • 举报
回复
去读<<Dissecting MFC>>
冰灯 2002-04-12
  • 打赏
  • 举报
回复
什么是RTTI呀
liang_z 2002-04-12
  • 打赏
  • 举报
回复
再看看有没有人知道
VSaber 2002-04-12
  • 打赏
  • 举报
回复
看看TObject的原代码不就清楚了吗?RTTI的信息都定义在里面呢!!!
王集鹄 2002-04-11
  • 打赏
  • 举报
回复
//记录类型没有RTTI的证据
type
TMyClass = class(TComponent)
private
FRect: TRect;
FCount:Integer;
published
property Rect: TRect read FRect write FRect;
property Count: Integer read FCount write FCount;
end;

//在Object Inspector看不见Rect
liang_z 2002-04-11
  • 打赏
  • 举报
回复
{$M+}根本就没有用处!
liang_z 2002-04-11
  • 打赏
  • 举报
回复
是啊,加了{$M+}根本就没有用!
chechy 2002-04-11
  • 打赏
  • 举报
回复
因为Delphi的IDE利用的是编译信息。就是对于类,RTTI也只存在于published区域。至于{$M+}到底有没有作用,很难说。
Liusp 2002-04-11
  • 打赏
  • 举报
回复
收藏
liang_z 2002-04-11
  • 打赏
  • 举报
回复
为什么DELPHI的IDE在结构变量的一点后
能列出该结构变量的成员名称和成员类型。

5,386

社区成员

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

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