随笔 - 809  文章 - 0 评论 - 144 阅读 - 770万

报错如下:

  PUBLISHED caused RTTI ($M+) to be added to type

 

 

 

 

 

修改成下面这样之后:

 

 

 

 

 

 

解决问题 方法:

 

 

 

 

 

 

 

 

复制代码
新的published和$M+对比
新的编译器警告“W1055 PUBLISHED caused RTTI ($M+) to be added to type '%s'”非常有趣。它解决了我们之前讨论过的一个问题。在以前的编译器版本中,如果你编写这样的代码:
type
TMyClass = class
private
    FName: string;
published
    property Name: string read FName write FName;
end;
published 属性不会产生RTTI ,它在后台被默认当作public属性来对待。这主要是因为TmyClass不是从一个使用了$M+编译指示字的类继承下来(比如 TPersistent),它自己内部也没有使用$M+。现在,当你在Delphi2007里编译相同的代码时你会得到这样的警告:
[DCC Warning] ThSort.pas(13): W1055 PUBLISHED caused RTTI ($M+) to be added to type 'TMyClass' 
这说明,尽管$M+被漏掉了,但是编译器仍然会将它作为标准published属性来处理,并为它产生RTTI。在类声明前面添加一个$M+指示字,就不会再有这个警告了。如果你只是想使用一个Public属性,那么就把published改成public好了。
复制代码

 

在TPersistent的声明中多了M编译开关,当{$M +}{$TYPEINFO ON} 作用是一样的, 而{$M -}{$TYPEINFO OFF}
相同。当一个类在{$M +}{$M -}间声明时,程序编译器将为类生成与RTTI(Runtime Type Information)相关的代码来完成
类的published的属性,方法和事件的存储工作。并且该类子类的published属性,方法和事件也具有存取特性。如果一个类
或祖先类都没有在{$M +}{$M -}间声明时,则该类不能有published的实行,事件和方法。

 

 

posted on   del88  阅读(669)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2013-05-23 FastReport Page与Page#区别
2013-05-23 FastReport 增加自定义函数的时候,如果函数有默认参数,一定不要忘记下方的也增加下参数,否则默认参数无效
2012-05-23 checklistbox 显示多列
点击右上角即可分享
微信分享提示