【问题标题】:How to get a method param name array/list in Delphi?如何在 Delphi 中获取方法参数名称数组/列表?
【发布时间】:2016-07-21 14:38:58
【问题描述】:

有没有办法在 Delphi 7 的数组/分隔字符串中获取类/对象的给定方法的参数名称?有点像这样:

var
  s : string;
  aSL : TStringList;
begin
  ...
  // using rtti calls in TMethodUtility.collectParamNames
  s := TMethodUtility.collectParamNames( TStringList.addObject );
  // or
  TMethodUtility.collectParamNames( TStringList.addObject, aSL );
  ...
end;

提前致谢!

【问题讨论】:

  • TString/List 中没有 AddItem() 方法。取而代之的是Add()AddObject()
  • 好的。我已经更正了。

标签: delphi parameters rtti


【解决方案1】:

这在技术上是可行的(否则 IDE 的表单设计器无法在设计时为组件事件处理程序生成代码),但是,有一些重要的警告会阻碍您的目标(并使您的问题中的特定示例无法解决):

  • 只为声明为published(例如组件事件)的属性生成必要的RTTI。不会为方法本身(甚至是published 方法)或不是published 的属性生成RTTI。

  • TObject 有一个公共的MethodAddress() 方法用于获取published 方法的内存地址(DFM 流系统在连接事件处理程序时使用它),但是您无法从单独的方法指针。

IF 您可以将给定的方法指针匹配到published 事件的,然后您可以从事件的RTTI 中提取参数名称。使用TypInfo.GetPropInfo()函数获取事件的TypInfo.PPropInfo指针,然后将其PropType字段值传递给TypInfo.GetTypeData()函数得到TypInfo.PTypeData指针,然后就可以遍历它的ParamList字段(这是一个包含ParamNameTypeName 字段的记录数组。

有关此主题的更多详细信息,请参阅以下博客文章:

Getting the parameters of published methods.

对于您正在尝试的内容,通用解决方案将需要在 Delphi 2010 中引入的 Extended RTTI,因此在 Delphi 7 中不可用。扩展 RTTI 不限于 published 项目,并且是 比旧式 RTTI 提供的更详细。

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 2010-09-17
    • 2015-10-01
    • 2011-10-09
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多