文档章节

Delphi 2010 新增功能之: Rtti 单元(2)

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 343
阅读 10
收藏 1

通过 Rtti 还能够调用一个类的方法, 也能读取或设置其属性值.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

  {自定义的类}
  TMyClass = class(TComponent)
  public
    procedure msg(const str: string);
    function Add(const a,b: Integer): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Rtti;

{ MyClass 类的实现 -----------------------------------------------------------}

procedure TMyClass.msg(const str: string);
begin
  MessageDlg(str, mtInformation, [mbYes], 0);
end;

function TMyClass.Add(const a, b: Integer): Integer;
begin
  Result := a + b;
end;

//通过 Rtti 的手段使用 TMyClass 类的方法 --------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  obj: TMyClass;
  t: TRttiType;
  m1,m2: TRttiMethod;
  r: TValue; //TRttiMethod.Invoke 的返回类型
begin
  t := TRttiContext.Create.GetType(TMyClass);

  {获取 TMyClass 类的两个方法}
  m1 := t.GetMethod('msg'); {procedure}
  m2 := t.GetMethod('Add'); {function}

  obj := TMyClass.Create(Self); {调用需要依赖一个已存在的对象}

  {调用 msg 过程}
  m1.Invoke(obj, ['Delphi 2010']); {将弹出信息框}

  {调用 Add 函数}
  r := m2.Invoke(obj, [1, 2]); {其返回值是个 TValue 类型的结构}
  ShowMessage(IntToStr(r.AsInteger)); {3}

  obj.Free;
end;

//通过 Rtti 的手段修改并获取 TMyClass 类的属性 --------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  obj: TMyClass;
  t: TRttiType;
  p: TRttiProperty;
  r: TValue;
begin
  obj := TMyClass.Create(Self);

  t := TRttiContext.Create.GetType(TMyClass);

  p := t.GetProperty('Name');
  p.SetValue(obj, 'NewName');

  r := p.GetValue(obj);
  ShowMessage(r.AsString); {NewName}

  obj.Free;
end;

end.

 
 
 
 
 

 

 

  

回复下面的问题:如何设置枚举值:

procedure TForm1.Button3Click(Sender: TObject);
var
  t: TRttiType;
  p: TRttiProperty;
  r: TValue;
begin
  t := TRttiContext.Create.GetType(TButton);

  p := t.GetProperty('Align');
  p.SetValue(Button1, TValue.FromOrdinal(TypeInfo(TAlign), Ord(alLeft)));

  r := p.GetValue(Button1);
  ShowMessage(IntToStr(r.AsOrdinal)); {3}
end;

本文转载自:http://www.cnblogs.com/del/archive/2009/10/15/1584038.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
减小Delphi XE 以上版 编译出来的程序体积

减小Delphi XE 以上版 编译出来的程序体积 . 默认Delphi XE, XE2, XE3,XE4,XE5, XE6 ... 编译出来的程序体积很大。 一般用两个方法可以很大程度上减少程序体积。 一、在工程中用编译指令禁用...

vga
2014/08/02
0
2
Delphi调用 C# 写的webservice

Delphi调用 C# webservice总结 用delphi的THTTPRIO控件调用了c#写的webservice。 下面是我调试时遇到的一些问题: 1:导入wsdl文件:file--new----other----webservice---WSDLimporter---输入...

vga
2014/11/25
0
0
Delphi组件开发教程指南(2)简单扩充TEdit

上一篇,介绍了组件开发的一般概述,以及组件类层次结构的各个类的大致信息!现在就开始通过实例进行来简单的讲述一下一般组件的开发过程!我这里先采用最基本的方式来创建一个组件!也就是使...

技术小美
2017/11/12
0
0
Delphi 2010 中的泛型

Delphi 2010 中的泛型日期:2010年5月31日 作者: 人气:10504 查看:[大字体 中字体 小字体]2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了...

vga
2016/08/09
19
0
PostgreSQL的Delphi组件--PostgreDAC

PostgreDAC 是适合 Delphi/C++ Builder 操作 PostgreSQL 数据库的功能非常强大的组件包,允许你创建直连 PostgreSQL 数据库的 Delphi/C++ Builder 应用,无需 BDE 和 ODBC 支持。 使用 Post...

匿名
2012/03/20
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

arts-week5

Algorithm 824. Goat Latin - LeetCode 152. Maximum Product Subarray - LeetCode 110. Balanced Binary Tree - LeetCode 67. Two Sum II - Input array is sorted - LeetCode 665. Non-dec......

yysue
23分钟前
0
0
iOS开发之AddressBook框架详解

iOS开发之AddressBook框架详解 一、写在前面 首先,AddressBook框架是一个已经过时的框架,iOS9之后官方提供了Contacts框架来进行用户通讯录相关操作。尽管如此,AddressBook框架依然是一个非...

珲少
53分钟前
1
0
两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot...

Java填坑之路
今天
4
0
《Spring5学习》04 - 面向切面编程

一、Spring面向切面编程的基本概念 面向切面编程(即AOP):把项目中需要再多处使用的功能比如日志、安全和事务等集中到一个类中处理,而不用在每个需要用到该功能的地方显式调用。 横切关注...

老韭菜
今天
2
0
day61-20180819-流利阅读笔记

跑道没了,它们还在跑:澳门赛狗业的遗孤 Daniel 2018-08-19 1.今日导读 相信你早就知道香港有个赛马会,可是你听说过香港的邻居澳门原本有个赛狗会吗?其实,对于澳门人来说,赛狗这项活动历...

aibinxiao
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部