如何在 Delphi 2010 中使用 RTTI 设置任意类型的事件处理程序?

2024-04-17

读完帖子后如何通过新的 RTTI 设置事件处理程序? https://stackoverflow.com/questions/1482461/how-to-set-event-handlers-via-new-rtti-d2010,我想知道是否可以更动态地解决这个问题。例如,我想将任何组件的所有事件处理程序设置为 nil。

Using TValue.From <TNotifyEvent> (SomeMethod)不起作用有两个原因: 1. 类型未知(可能是 TNotifyEvent、TMouseEvent 等) 2.我无法将“SomeMethod”设置为nil(无效转换)

在旧的 RTTI 风格中,我会做类似的事情:

var
  NilMethod: TMethod;
begin
[...]
NilMethod.Data := nil;
NilMethod.Code := nil;
SetMethodProp (AComponent,PropertyName,NilMethod);

下面的代码应该可以工作:

procedure NilAllEventHandlers(myObject: TObject);
var
   context: TRttiContext;
   rType: TRttiType;
   field: TRttiField;
   value: TValue;
   nilMethod: TMethod;
begin
   nilMethod.Code := nil;
   nilMethod.Data := nil;

   context := TRttiContext.Create;
   rType := context.GetType(TButton);
   for field in rType.GetFields do
   begin
      if field.FieldType.TypeKind = tkMethod then
      begin
         TValue.Make(@nilMethod, field.FieldType.Handle, value);
         field.SetValue(myObject, value);
      end;
   end;
end;

但事实并非如此,因为在使用 .Code 参数为的 TMethod 值时,TValue.TryCast 中存在错误nil。我会将其报告给QC。希望它能在 D2011 或更新中得到修复。在那之前,尝试一下旧的风格。

编辑:报告为QC# 81416 http://qc.embarcadero.com/wc/qcmain.aspx?d=81416。如果您想修复它,请投票。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Delphi 2010 中使用 RTTI 设置任意类型的事件处理程序? 的相关文章

随机推荐

  • 如何在VB.net中使用字典?

    我编写了这个函数来自动将字符串数组中的不同值的性别更正为 M 或 F 它工作得很好 但我的经理告诉我使用字典 他说这更有效 但我不知道 有人愿意帮助我了解如何做到这一点吗 谢谢 Public Function AutoGender ByVa
  • 获取任何枚举值的扩展方法

    我一直在尝试创建一个适用于任何枚举的扩展方法 以返回其值 而不是这样做 Enum GetValues typeof BiasCode Cast
  • 与查找数据集连接后进行多列值查找

    我正在使用spark sql 2 4 1v如何根据列的值进行各种连接 我需要获得多个查找值map val给定值列的列 如下所示 样本数据 val data List 20 score school 2018 03 31 14 12 21 s
  • Google Tasks API:403 禁止,超出服务限制

    您好 Google Tasks API 团队 从几天前开始 我们就开始 403 Forbidden 对于我们的许多用户来说 您能检查一下发生了什么事吗 我们的 API 控制台很干净 calls 远低于配额 Caused by com goo
  • 分析 Windbg 中的故障转储

    我正在使用第三方闭源 API 它会抛出一个异常 指出 所有命名管道都忙 我想进一步调试 而不是单步调试 这样我就可以真正了解幕后发生的事情 我使用 WinDbg 转储了这个过程 我现在应该使用什么命令来分析此转储 Thanks 您可以开始执
  • 在联合查询中使用 Wikidata 标签服务

    我想知道是否可以在联合查询中使用维基数据标签服务 例如 以下查询 Query from a local SPARQL enpoint select item itemLabel where SERVICE
  • 如何计算 RectTransform 中的 sizeDelta?

    我编写了自定义布局所需的自定义内容适配程序 所以 我需要控制RectTransform sizeDelta当锚点不同时属性 但我无法显示该值 我不需要Unity3D API参考资料 我读了它 但什么也没得到 因为它只说 此 RectTran
  • minHeight 不适用于 Linearlayout 中的 Weight=“1”

    我想要一个视图 如果屏幕尺寸较小 则可以具有最小高度或wrap content 如果屏幕尺寸较大 则占据其余空间 该视图是其父视图的中间子视图 目前 我正在使用 LinearLayout 的权重 它在大屏幕上工作正常 但在小屏幕上它不显示视
  • java.lang.ClassCastException:java.util.LinkedHashMap无法转换为com.testing.models.Account

    我收到以下错误 java lang ClassCastException java util LinkedHashMap cannot be cast to com testing models Account 用下面的代码 final i
  • ImportError:无法从“tensorflow.python.keras.engine”导入名称“keras_tensor”

    我在加载张量流插件库时收到此错误 import tensorflow addons as tfa ImportError cannot import name keras tensor from tensorflow python kera
  • 是否可以通过 TCP 连接到正在侦听 3G 网络端口的 iPhone?

    我正在开发一个严重依赖 P2P 的应用程序 但我目前没有任何 SIM 卡可供实验 因此我正在 wifi 网络上进行测试 我想知道 3G 网络上的 iPhone 是否可以连接以及是否需要穿越 NAT 设备 您位于提供商的路由器后面 您的 IP
  • EJB3 Glassfish JNDI 查找

    我正在使用 Glassfish 捆绑的 Eclipse IDE 我编写了一个简单的 EJB 应用程序 但它不起作用 Stateless Remote CalculatorRemote class Local CalculatorLocal
  • Bootstrap 下拉菜单切断

    我正在尝试将下拉设置菜单添加到我一直在处理的项目中的评论部分 下拉菜单似乎自行切断 我不知道为什么会这样 I tried overflow visible and z index 999 但它们似乎都不起作用 这是一个基本的评论块 我试图在
  • AEM/CQ 中删除子组件的事件处理程序

    如何为 Adob e AEM6 组件添加在删除子组件时触发的事件处理程序 我可以将事件处理程序附加到多个侦听器 列在cq listeners 的文档 http dev day com docs en cq current developin
  • 使用 Java EE 将文件存储在云中

    我正在使用 CloudBees 部署我的 Java EE 应用程序 因为我需要写入和读取文件 但我找不到 CloudBees 中的任何云文件系统 请向我推荐任何免费的云文件系统存储和用于访问该文件系统的java代码 使用 jclouds 您
  • Django通过最后创建的对象进行反向查询

    我有两个模型 class SomeActivity models Model name models ChartField max length 100 class SomeStatus models Model name models C
  • Maven:在不同源级别上进行编译和测试

    我目前正在开发一个将在嵌入式设备上运行的项目 该设备运行 Java ME JRE 相当于 Java 1 4 因此 maven 配置为针对源级别和目标级别 1 4 进行编译 是否可以在不同的源 目标级别上运行 Maven 测试阶段 因为这样我
  • std::string 和 std::wstring 的前向声明

    无法转发声明 std string 和 std wstring 的问题经常被讨论 据我了解 原因是这些类型是模板类 basic string 实例化的类型定义 namespace std typedef basic string
  • 在 Android 中使用带有 post 参数的 HttpClient 和 HttpPost

    我正在为一个 Android 应用程序编写代码 该应用程序应该获取数据 将其打包为 Json 并将其发布到 Web 服务器 而 Web 服务器又应该使用 json 进行响应 使用 GET 请求工作正常 但由于某种原因 使用 POST 时所有
  • 如何在 Delphi 2010 中使用 RTTI 设置任意类型的事件处理程序?

    读完帖子后如何通过新的 RTTI 设置事件处理程序 https stackoverflow com questions 1482461 how to set event handlers via new rtti d2010 我想知道是否可