Delphi 2010引入了可以添加到类型声明和方法的自定义属性。对于哪些语言元素可以使用自定义属性?

我到目前为止发现的例子包括类声明,字段和方法。 (而且AFAIK通用类不支持自定义属性)。

一些例子显示在this article.它看起来像变量(任何类声明外部)也可以有属性。

基于本文,可以使用属性

>类和记录字段和方法
>方法参数
>属性
>非本地枚举声明
>非局部变量声明

是否有其他语言元素可以放置属性?

更新:本文指出自定义属性可以放在属性之前:http://francois-piette.blogspot.de/2013/01/using-custom-attribute-for-data.html

它包含这个代码示例:

type
  TConfig = class(TComponent)
  public
    [PersistAs('Config','Version','1.0')]
    Version : String;
    [PersistAs('Config','Description','No description')]
    Description : String;
    FTest : Integer;
    // No attribute => not persistent
    Count : Integer;
    [PersistAs('Config','Test','0')]
    property Test : Integer read FTest write FTest;
  end;

我猜,还有一种方法读取方法参数上的属性

procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);

解决方法

有趣的问题!你可以在几乎任何东西上声明属性,问题是使用RTTI检索它们。以下是一个快速控制台演示:声明自定义属性:

>枚举
>功能类型
>过程类型
>方法类型(对象)
>别名类型
>记录类型
>类类型
>类的内部的记录类型
>记录字段
>记录方法
>类实例字段
>类类字段(class var)
>类方法
>全局变量
>全局功能
>局部变量

没有找到一种方法来声明一个类的属性的自定义属性。但是自定义属性可以附加到getter或setter方法。

代码,故事后代码继续:

program Project25;

{$APPTYPE CONSOLE}

uses
  Rtti;

type
  TestAttribute = class(TCustomAttribute);

  [TestAttribute] TEnum = (first,second,third);
  [TestAttribute] TFunc = function: Integer;
  [TestAttribute] TEvent = procedure of object;
  [TestAttribute] AliasInteger = Integer;

  [TestAttribute] ARecord = record
    x:Integer;
    [TestAttribute] RecordField: Integer;
    [TestAttribute] procedure DummyProc;
  end;

  [TestAttribute] AClass = class
  strict private
    type [TestAttribute] InnerType = record y:Integer; end;
  private
    [TestAttribute]
    function GetTest: Integer;
  public
    [TestAttribute] x: Integer;
    [TestAttribute] class var z: Integer;
    // Can't find a way to declare attribute for property!
    property Test:Integer read GetTest;
    [TestAttribute] class function ClassFuncTest:Integer;
  end;

var [TestAttribute] GlobalVar: Integer;

[TestAttribute]
procedure GlobalFunction;
var [TestAttribute] LocalVar: Integer;
begin
end;

{ ARecord }

procedure ARecord.DummyProc;
begin
end;

{ AClass }

class function AClass.ClassFuncTest: Integer;
begin
end;

function AClass.GetTest: Integer;
begin
end;

begin
end.

麻烦的是检索这些自定义属性。查看rtti.pas单元,可以检索自定义属性:

>记录类型(TRttirecordtype)
>实例类型(TRttiInstanceType)
>方法类型(TRttiMethodType)
>指针类型(TRttiPointerType) – 用于什么?
>过程类型(TRttiProcedureType)

没有办法为“单元”级别或局部变量和过程检索任何类型的RTTI,因此无法检索有关属性的信息。

哪些语言元素可以使用Delphi的属性语言特性进行注释?的更多相关文章

  1. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 总结html5自定义属性有哪些

    Html5为我们提供了以 "data-" 为前缀定义需要的属性即可设置自定义属性。使用H5自定义属性对象dataset来获取。

  3. ios – 如何在使用隐式动画为CALayer设置动画时继承动画属性

    我试图使用隐式动画在CALayer上设置自定义属性的动画:在-actionForKey:方法我需要返回动画,负责插值.当然,我必须以某种方式告诉动画如何检索动画的其他参数.有关如何实现这一点的任何想法?

  4. ios – 在UITextView上替换属性文本时维护自定义属性

    我有一个可编辑的UITextView,它加载了一个属性String.此属性String加载了应用程序设置的自定义属性.出于这个原因,我总是将这些自定义属性添加到textView的typingAttributes中.每当我输入文本时它按预期工作,添加的文本都设置了自定义属性,但每当我使用预测性建议替换单词时,整个单词都设置为没有自定义属性.据我所知,每次以编程方式设置属性文本时,将自动清除typingAttributes.因此,当选择预测建议时,文本会以编程方式设置,因此我丢失了所有自定义属性.有没有办法解

  5. ios – 我在哪里可以找到用于创建IPad应用程序的Delphi资源?

    我之前一直在使用Delphi并且一直都是Windows家伙.我的妻子为我的生日买了一台新的iPad,我昨晚第一次使用它.哇!…

  6. 如何从命令行部署OSX或IOS Delphi项目?

    我正在使用像这样的脚本构建我的Delphi应用程序现在我想添加一个选项将应用程序部署到OSX系统修改这样的脚本,那么可以从命令行部署OSX或IOSDelphi项目吗?

  7. android – monodroid / xamarin自定义属性使用ObtainStyledAttributes为空

    尝试将自定义属性从父布局传递到子布局.从ObtainStyledAttributes()返回的TypedArray似乎没有我创建的自定义属性的相应自定义值,尽管我可以将它们的ID映射到Resource.designer中的值.Attr.xml:Main.xaml:查看课程:解决方法我认为问题在于您如何指定xmlns:自定义命名空间.您需要在已有的字符串末尾添加应用程序命名空间,以便:您还需要为An

  8. 如何检查Android和iOS上的网络是否可用(Delphi XE5)

    解决方法试试这个:

  9. Html5之自定义属性(data-,dataset)

    这篇文章主要介绍了Html5之自定义属性(data-,dataset),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)

    这篇文章主要介绍了HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性),需要的朋友可以参考下

随机推荐

  1. delphi – 主窗口按进程名称处理

    DelphiXe,Win7x64如何从进程名称(exe文件的完整路径)获取主窗口句柄,或至少一个类或窗口名称(如果该进程只有一个窗口).例:解决方法我同意Petesh的说法,你需要枚举顶级窗口并检查创建它的进程的模块文件名.为了帮助您开始枚举顶级窗口,这是一个delphi实现.首先,当你回调给你时,你需要一些与EnumWindows方法通信的方式.为此声明一条记录,该记录将保存您要查找的模块的文件

  2. 如何在Delphi中纯粹通过RTTI信息(即不使用任何实际对象实例)获取TObjectList的子项类型?

    我正在使用RTTI实现用于流式传输任意Delphi对象的通用代码,并且为了使其工作(更具体地说,为了使加载部分工作),我需要以某种方式获得TObjectList的子项类型<T>不使用任何实际对象实例的字段.要求不使用任何实际对象实例的明显原因是,在从流加载对象的情况下(仅基于要加载的对象的类类型的知识),我将不会有任何实例在加载完成之前完全可用–我宁愿只能访问相关类的纯RTTI数据.我希望能

  3. inno-setup – Inno Setup – 安装程序背景图片

    图像作为安装程序背景如何用inno5.5.9做到这一点?

  4. inno-setup – Inno Setup – 如何添加多个arc文件进行解压缩?

    使用InnoSetup解压缩弧文件.我希望有可能解压缩多个arc文件以从组件选择中安装文件(例如).但仍然显示所有提取的整体进度条.这可能吗?的回答的修改预备是相同的,参考其他答案.在ExtractArc中,为要提取的每个存档调用AddArchive.

  5. delphi – 如何在DataSet的帮助下在TAdvStringGrid中显示数据库中的BLOB图像

    解决方法CreateBlobStream正在创建一个TStream对象,而不是TMemoryStream.由于您不想将JPG写入数据库,因此应使用bmRead而不是bmReadWrite.我不习惯sqlite,但你必须确保使用合适的二进制日期类型.为了确保存储的图像真的是JPG,您应该编写JPG以进行测试,例如:

  6. inno-setup – 在Inno Setup的Code部分下载程序后运行程序

    如何运行我通过Internet下载的应用程序,在代码部分中使用,并等待该应用程序完成运行.我有,使用InnoTools下载程序,下载这两个文件,我想,在第二个完成下载后运行该下载,或jdk-8u111-windows-x64.exe,然后继续安装.解决方法使用其他下载插件,而不是ITD(请参阅下面的原因).例如,InnoDownloadPlugin.当您包含idp.iss时,它定义了一个全局IDP

  7. progress-bar – Inno Setup Run部分的简单进度页面

    我的安装程序非常简单,它基本上是:>欢迎页面>进展页面>最终页面欢迎页面和最终页面是标准页面.在Progress页面,我正在静默安装一堆其他程序.实际的脚本是在[Run]部分中安装每个程序.问题是酒吧达到100%然后停留在那里.我只能更改消息文本.我想要实现的是使用Pascal脚本显示进度,例如:这样我就可以显示更准确的进度条.这就是我所拥有的:问题是,当我构建安装程序时,它不显示欢迎页面.我做错了什么?

  8. delphi – 如何使“显示/隐藏桌面图标”设置生效?

    下面的代码调用SHGetSetSettings函数来隐藏桌面图标但它只是从视图菜单中取消选中“显示桌面图标”.我打电话给SHChangeNotify;更新桌面,但这不起作用?解决方法isa,要刷新桌面,您可以将F5键发送到progman窗口隐藏桌面图标的另一种方法是再次显示

  9. inno-setup – Inno Setup – 避免显示子安装程序的文件名

    我试图使用InnoSetup–Howtohidecertainfilenameswhileinstalling?(FilenameLabel)的想法Theonlysuresolutionistoavoidinstallingthefiles,youdonotwanttoshow,usingthe[Files]section.Installthemusingacodeinstead.UsetheEx

  10. inno-setup – Inno Setup磁力链接下载实施

    我目前正在使用InnoDownloadPlugin为我的安装程序下载文件,这个问题最大的问题是faila正确下载文件.因为连接不良等诸多原因.我想添加一种替代方法来下载文件,因此用户可以选择是否需要常规方式或torrent方式.我知道我可以使用aria2c.exe应用程序(https://aria2.github.io/),有人可以帮我实现它的inno设置代码吗?我需要的是使用torrent(ar

返回
顶部