Delphi 使用 RTTI 动态通过名称调用函数和设置控件属性值

应用Delphi 表达式引擎 这里只是简单的入门介绍,因为还有象绑定表达式并允许绑定控件及允许注册通知(一种回调机制)等需求,我将找更多的演示,并将尽快尝试在博客中介绍它们。 阅读详情

// 设置控件的属性名
uses TypInfo, JclAnsiStrings;

function GetObject(obj:TObject; path:String): TObject;
var objName:String;
begin
  Result := obj;

  while System.Length(path) > 0 do begin
    objName := JclAnsiStrings.StrToken(path, '.');
    if obj is TComponent then begin
      Result := TComponent(Result).FindComponent(objName);
    end else begin
      Result := TypInfo.GetObjectProp(Result, objName);
    end;
  end;
end;

procedure SetPropValue(obj:TObject; path:String; value:Variant);
var tk:TTypeKind;
    i:Integer;
    propName:String;
begin
  i := JclAnsiStrings.StrLastPos('.', path);
  if i > 0 then begin
    obj:= GetObject(obj, JclAnsiStrings.StrLeft(path, i-1));
    propName:= JclAnsiStrings.StrRestOf(path, i+1);
  end else begin
    propName := path;
  end;
  TypInfo.SetPropValue(obj, propName, value);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetPropValue(Self, 'button1.caption', 'test');
  SetPropValue(Self, 'button1.width', '200');
  SetPropValue(Self, 'label1.Visible', false);
end;


// 动态调用函数/过程

type
  TMyProcedure = procedure of object;
  TMyMethod =  function(x, y: Integer): integer of object;

function GetMethod(obj: TObject; MethodName: string): TMethod;
var Rounte: TMethod;
begin
  Result := nil;
  Rounte.Data := Pointer(obj);
  Rounte.Code := obj.MethodAddress(MethodName);
  if not System.Assigned(Rounte.Code) then Exit;
  Result := Rounte;
end;


procedure Form1.Button1Click(Sender:TObject);
var m1: TMyProcedure;
    m2: TMyMethod;
    i:Integer;
begin
  m1 := TMyProcedure(GetMethod(Self, 'show'));
  m1(); // execute
 
  m2 := TMyMethod(GetMethod(), 'Add');
  i := m2(1,2); // execute
end;

 

 

 

Delphi反编译实战:从EXE黑盒到可读代码的完整指南 软件逆向工程是理解、分析重构已编译程序内部逻辑的关键技术,其核心原理在于通过静态与动态分析手段,解析二进制文件的指令、数据结构执行流程。这项技术的工程价值在于能够恢复丢失的源代码、进行安全审计、漏洞挖掘以及遗留系统的维护与二次开发,广泛应用于软件维护、安全研究数字取证等领域。本文聚焦于Delphi语言生态,深入探讨如何利用IDR等工具链对编译后的Windows桌面应用进行反编译与重构,重点解析PE文件结构分析、RTTI信息提取Pascal伪代码生成等核心环节,并结合实际案例演示如何从可执行文件中恢复 阅读详情

相关推荐

9、深入探索Delphi编程中的RTTI技术应用

本文深入探讨了DelphiRTTI(运行时类型信息)技术的三大核心应用:动态计算引擎的灵活配置、基于鸭子类型的通用属性操作,以及使用自定义属性实现业务对象的声明式验证。通过实际代码示例,展示了如何利用RTTI提升代码的灵活性、可维护性扩展性,并介绍了在实际开发中的拓展用法与未来应用前景。

palm99的专栏 50

delphi学习点滴(四)

1.SetValue方法妙用        系统默认生成的代码如下,但我们可以在这里增添更多的东西,比如针对Value判断执行一些相关操作,或者触发一些事件等。 procedure TForm1.SetTestPro(const Value: string); begin FTestPro := Value; end; 2.Image问题       图片在窗体最大化时不能铺满界

Just Do It 1100

Delphi动态加载DFM界面小程序实战教程

Delphi作为一款成熟的集成开发环境,其提供的动态加载界面技术为开发者打开了创建灵活用户界面的新大门。动态加载界面技术允许开发者在程序运行时创建、修改或删除界面元素,从而提供更加丰富动态的用户体验。这种技术可以优化应用程序的性能,尤其是在资源受限的情况下,因为它能够仅在需要时加载界面组件,减少了内存的占用。本章将揭开Delphi动态加载界面技术的神秘面纱,为理解后续章节打下坚实的基础。DFM(Design Form)文件是Delphi用于存储界面设计信息的一种特定格式的文件。

weixin_30700095的博客 1048

DelphiRTTI机制浅探3

转自:http://blog.sina.com.cn/s/blog_53d1e9210100uke4.html 目录 =============================================================================== ⊙ RTTI 简介 ⊙ 类(class) VMT 的关系 ⊙ 类(class)、类的类(class

一片荷叶的专栏 3743

DelphiRTTI机制浅探

DelphiRTTI机制浅探  目 录===============================================================================⊙ DFM 文件与持续机制(persistent)⊙ ReadComponentResFile / WriteComponentResFile 函数⊙ Delphi 持续机制框架简述⊙ 一个 TFor

jian704的专栏 2143

DelphiRTTI机制浅探 (二)

⊙ GetObjectPropClass 函数 ============================================================== GetObjectPropClass 函数用于返回对象类型的属性所属的类(class)。 function GetObjectPropClass(Instance: TObject; PropInfo: PPropInfo):

turbocc 因程序而激情 883

DelphiRTTI机制浅探(续)

DelphiRTTI机制浅探(续)savetime2k@yahoo.com  2004.1.22http://savetime.delphibbs.com本文是《DelphiRTTI机制浅探》的续篇,上篇地址在:  http://www.delphibbs.com/delphibbs/dispq.asp?lid=2420610本文上篇基本上是 RTTI 入门介绍,续篇介绍了所有 TypIn

Qi_jianzhou的资料室 883

delphi android动态权限,Delphi XE 新功能试用:多种皮肤样式静、动态设置方法

静态方式:1、新建VCLFormsApplication;2、打开菜单Project-Application-Appearance;3、在CustomStyles中可选择所有默认带的皮肤样式;4、设置Defaultstyle后,启动软件后便以默认的样式显示界面。动态方式:1、完成静态方式的1-3步;2、引用Vcl.Themes;3、使用方法TStyleManager.SetStyl...

weixin_29809497的博客 626

delphi RTTI

self 类对象指针--当前执行的类对象指针 tform1: 类 { No. 17 } {在TypInfo单元中,有若干函数可以让我们操作Dephi管理的类的VMT。通过,属性名称对象VTM直接访问或改变属性值。 公共的属性访问函数:GetPropValue;公共的属性设置函数:SetPropValue。其中,对事件属性信息的读取可以使用GetPropValue,但是却不能通

hrdzkj的专栏 579

了解运行时类型信息(RTTI)

翻阅近期的帖子,发现类似如下的问题被提及多次:如何根据名称找到控件如何根据名称找到对应的属性如何根据名称执行某个方法或事件那我们能不能做到呢,当然可以,那就让我们了解一下RTTI吧.运行时类型信(以下简称RTTI)是在运行时保存检索对象数据类型的手段.通过RTTI我们可以了解正在使用的对象或组件的信息,并对它们进行一些处理. RTTI需要引用单元TypeIn

bdmh的专栏 2370

Delphi通过 RTTI信息重构类方法的原始声明

(一)运行时获得类方法的原始声明 当我们在窗体上放置一个控件,在Object Inspector的Events中双击该控件的某个方法时,IDE会自动产生该控件相应的方法声明,形如: procedure TForm1.Button1Click(Sender: TObject); begin   | end; 该声明来自类方法属性声明段的事件构造定义,形如: TButton = cl

LandyKing的专栏 1174

RO代码跟踪 之 应用RTTI

RO RTTI

henreash的专栏 2554

Delphi类型区分——枚举

// ####Delphi枚举 // 枚举————代表值的名字列表。 // 用内建类型(如:Integer)也可以存储状态,枚举比内建数据更安全、更见名知义。 // 枚举是有序类型。 // 基于在类型定义中的出现次序,枚举元素自动地分配连续值。从第一个位置的0 开始到最后一个位置的n-1 结束。 // ##枚举类型的定义 // type 枚举类型标识符=(标识符1,标识符2,…,标识符n);

liang08114的专栏 2302

《深入核心——VCL架构剖析》Delphi开发实战源码解析

写了组件还不算完,必须让它“被看见”。Delphi使用一个叫的全局过程来完成注册:interfaceusesbeginend;end.只要把这个单元放进.dpk包并安装,你的组件就会出现在名为“My Components”的选项卡里👇A[用户编写组件类] --> B[创建注册单元]B --> C[调用RegisterComponents]C --> D[编译为BPL设计包]D --> E[IDE加载BPL]E --> F[扫描Register过程]

weixin_42560991的博客 323

5 分钟跑通第一个 AgentScope ReAct 智能体:内置工具与终端调试全指南

想找一个能自己读文件、跑命令、查资料,而不只是陪你聊天的 AI 助手?AgentScope 的 ReAct 智能体就是干这个的:它在一个"推理—调用工具—看结果"的循环里干活,直到把问题做完。读完这篇,你能在终端里搭出这样一个助手,还会改它的工具、模型记忆。内容覆盖三块: - 最小代码把 AgentScope 智能体跑起来 - 工具、模型、记忆三个扩展点各改几行 - 新手最容易踩的 3 个坑

gitblog_00653的博客 252

Delphi 2010 新增功能之: Rtti 单元(5): 获取方法的更多信息

====================================================== 注:本文源代码点此下载 ====================================================== #1楼 2009-10-26 19:55 lemon666[未注册用户] 请问老师,trichedit的方法找不出来?别的可以,不知道为什么?

javazhuanzai的专栏 458

如何快速掌握IDR:Delphi程序逆向分析的完整指南

IDR(Interactive Delphi Reconstructor)是一款专业的Delphi程序逆向工程工具,专门用于分析反编译Windows环境下用Delphi语言编写的可执行文件(EXE)动态链接库(DLL)。这款强大的逆向分析工具能够帮助安全研究人员、软件工程师逆向爱好者深入理解Delphi程序的内部结构逻辑流程。 ## 📋 项目概览与核心价值 **IDR**是一款专注于

gitblog_00190的博客 880
上一篇: JAVA 进程异常高的 CPU 占用率
下一篇: 用 Java 把 html 转成 pdf
subchen
博客等级 码龄25年 33粉丝 77原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值