文档章节

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
PostgreSQL的Delphi组件--PostgreDAC

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

匿名
2012/03/20
2.1K
0
Delphi 2010 中的泛型

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

vga
2016/08/09
19
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql 数据类型及占用字节数

数字类型 TINYINT                           1 字节 SMALLINT                          2 个字节 MEDIUMINT                         3 个字节...

会游泳的鱼_
41分钟前
3
0
高性能mysql:创建高性能的索引

性能优化简介 MySQL性能定义为完成某件任务所需要的时间量度,换句话说,性能即响应时间,这是一个非常重要的原则。我们通过任务和时间而不是资源来测量性能。数据库服务器的目的是执行SQL语...

背后的辛酸
56分钟前
4
0
HTTP get、post 中请求json与map传参格式

import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;im......

寒风中的独狼
今天
3
0
IDEA中tomcat启动慢 耗时10分钟

用idea中的tomcat以debug模式启动,会非常的慢,而正常启动没啥问题;原因是debug模式中View Breakpoints断点代码,断点的是jar包,而现在启动由于jar包发生变化,导致启动时一直处于等待中。...

GoodMarver
今天
5
0
Linux学习-10月18(awk)

9.6/9.7 awk 一、awk简介   1. awk是一种编程语言,用于对文本和数据进行处理的   2. 具有强大的文本格式化能力   3. 利用命令awk,可以将一些文本整理成为我们想要的样子   4. 命令awk...

wxy丶
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部