DELPHI中使用RTTI

運行期類型信息(RTTI)是一種語言特征,能使應用程序在運行時得到關于對象的信息。RTTI是Delphi的組件能夠融合到IDE中的關鍵。它在IDE中不僅僅是一個純學術的過程。

由于對象都是從TObject繼承下來的,因此,對象都包含一個指向它們的RTTI的指針以及幾個內建的方法。下面的表列出了TObject的一些方法,用這些方法能獲得某個對象實例的信息。

函數

返回類型

返回值

ClassName( )

string

對象的類名

ClassType()

boolean

對象的類型

InheritsFrom

boolean

判斷對象是否繼承于一個指定的類

ClassParent()

TClass

對象的祖先類型

Instancesize()

word

對象實例的長度(字節數)

ClassInfo()

Pointer

指向RTTI的指針

第一部分:關于as 和 is

Object Pascal提供了兩個運算符as和is,用它們通過RTTI能對對象進行比較和強制類型轉換。

關鍵字as是類型轉換的一種新的形式。它能把一個基層的對象強制類型轉換成它的派生類,如果轉換不合法就産生一個異常。假定有一個過程,想讓它能夠傳遞任何類型的對象,它應該這樣定義:

Procedure Foo(AnObject :Tobject);

在這個過程如果要對AnObject進行操作,要把它轉換爲一個派生對象。假定把AnObject看成是一個TEdit派生類型,並想要改變它所包含的文本,用下列代碼: (AnObject as Tedit).text := 'wudi_1982';

能用比較運算符來判斷兩個對象是否是相兼容的類型,用is運算符把一個未知的對象和一個已知類型或實例進行比較,確定這個未知對象的屬性和行爲。例如,在對(AnObject 進行強制類型轉換前,確定(AnObject 和TEdit是否指針兼容:

if (AnObject is Tedit) then

Tedit(AnObjject).text := 'wudi_1982';

注意在這個例子中不要再使用as進行強制類型轉換,這是因爲它要大量使用RTTI,另外還因爲,在第一行已經判斷Foo就是TEdit,可以通過在第2行進行指針轉換來優化。

這兩個操作符最典型的應用我想應該是在程序需要的部分清空窗體上所有edit的text屬性

DELPHI中使用RTTI
procedure TForm1.ClearEdit(Acontrl: TWinControl);

DELPHI中使用RTTI
var

DELPHI中使用RTTI
i : integer;

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
for i := 0 to Acontrl.ControlCount-1 do

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
if Acontrl.Controls[i] is TEdit then

DELPHI中使用RTTI
((Acontrl.Controls[i]) as TEdit).Text := '';

DELPHI中使用RTTI
if Acontrl.Controls[i] is TCustomControl then

DELPHI中使用RTTI
ClearEdit( (Acontrl.Controls[i] as TCustomControl))

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

第二部分:RTTI

上文中已經多次提到了RTTI,但好像並沒有看到RTTI出現。那麽RTTI是如何表現自己的呢?你將發現, RTTI至少在兩個地方對你有用。第一個地方是DELPHI的IDE,這在前面已提到過。通過RTTI,IDE就會知道你正在使用的對象和組件的任何事情。實際上,不只是RTTI,但爲了這個討論,我們只談RTTI方面。其實上面的as,is操作都間接的使用了RTTI。

還是用個例子來演示吧。在觀看此例子之時,建議你看看typinfo.pas中的內容(DELPHI安裝目錄下\source\rtl\common\TypInfo.pas);

下面的例子主要分爲兩部分,界面上半部分,主要演示通過rtti來顯示用戶選擇類型的信息。(有3個TListBox)。

下面的部分主要通過RTTI來完成通過配置信息對控件進行屬性的賦值操作,這裏將演示文本類型和事件類型的賦值。

窗體文件如下:代碼如下:

DELPHI中使用RTTI
object Form1: TForm1

DELPHI中使用RTTI
Left = 150

DELPHI中使用RTTI
Top = 161

DELPHI中使用RTTI
Width = 639

DELPHI中使用RTTI
Height = 372

DELPHI中使用RTTI
Caption = 'Form1'

DELPHI中使用RTTI
Color = clBtnFace

DELPHI中使用RTTI
Font.Charset = DEFAULT_CHARSET

DELPHI中使用RTTI
Font.Color = clWindowText

DELPHI中使用RTTI
Font.Height = -11

DELPHI中使用RTTI
Font.Name = 'Tahoma'

DELPHI中使用RTTI
Font.Style = []

DELPHI中使用RTTI
OldCreateOrder = False

DELPHI中使用RTTI
OnCreate = FormCreate

DELPHI中使用RTTI
PixelsPerInch = 96

DELPHI中使用RTTI
TextHeight = 13

DELPHI中使用RTTI
object Panel1: TPanel

DELPHI中使用RTTI
Left = 0

DELPHI中使用RTTI
Top = 0

DELPHI中使用RTTI
Width = 631

DELPHI中使用RTTI
Height = 185

DELPHI中使用RTTI
Align = alTop

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
object GroupBox1: TGroupBox

DELPHI中使用RTTI
Left = 1

DELPHI中使用RTTI
Top = 1

DELPHI中使用RTTI
Width = 185

DELPHI中使用RTTI
Height = 183

DELPHI中使用RTTI
Align = alLeft

DELPHI中使用RTTI
Caption = '在這裏選擇要查看類型的信息'

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
object ListBox1: TListBox

DELPHI中使用RTTI
Left = 2

DELPHI中使用RTTI
Top = 15

DELPHI中使用RTTI
Width = 181

DELPHI中使用RTTI
Height = 166

DELPHI中使用RTTI
Align = alClient

DELPHI中使用RTTI
ItemHeight = 13

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
OnClick = ListBox1Click

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object GroupBox2: TGroupBox

DELPHI中使用RTTI
Left = 368

DELPHI中使用RTTI
Top = 1

DELPHI中使用RTTI
Width = 262

DELPHI中使用RTTI
Height = 183

DELPHI中使用RTTI
Align = alRight

DELPHI中使用RTTI
Caption = '屬性信息'

DELPHI中使用RTTI
TabOrder = 1

DELPHI中使用RTTI
object ListBox3: TListBox

DELPHI中使用RTTI
Left = 2

DELPHI中使用RTTI
Top = 15

DELPHI中使用RTTI
Width = 258

DELPHI中使用RTTI
Height = 166

DELPHI中使用RTTI
Align = alClient

DELPHI中使用RTTI
ItemHeight = 13

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object GroupBox3: TGroupBox

DELPHI中使用RTTI
Left = 186

DELPHI中使用RTTI
Top = 1

DELPHI中使用RTTI
Width = 182

DELPHI中使用RTTI
Height = 183

DELPHI中使用RTTI
Align = alClient

DELPHI中使用RTTI
Caption = '基本信息'

DELPHI中使用RTTI
TabOrder = 2

DELPHI中使用RTTI
object ListBox2: TListBox

DELPHI中使用RTTI
Left = 2

DELPHI中使用RTTI
Top = 15

DELPHI中使用RTTI
Width = 178

DELPHI中使用RTTI
Height = 166

DELPHI中使用RTTI
Align = alClient

DELPHI中使用RTTI
ItemHeight = 13

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object TPanel

DELPHI中使用RTTI
Left = 0

DELPHI中使用RTTI
Top = 185

DELPHI中使用RTTI
Width = 631

DELPHI中使用RTTI
Height = 157

DELPHI中使用RTTI
Align = alClient

DELPHI中使用RTTI
TabOrder = 1

DELPHI中使用RTTI
object Panel2: TPanel

DELPHI中使用RTTI
Left = 1

DELPHI中使用RTTI
Top = 1

DELPHI中使用RTTI
Width = 230

DELPHI中使用RTTI
Height = 155

DELPHI中使用RTTI
Align = alLeft

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
object Label2: TLabel

DELPHI中使用RTTI
Left = 10

DELPHI中使用RTTI
Top = 8

DELPHI中使用RTTI
Width = 84

DELPHI中使用RTTI
Height = 13

DELPHI中使用RTTI
Caption = '要修改的控件名'

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object Label3: TLabel

DELPHI中使用RTTI
Left = 8

DELPHI中使用RTTI
Top = 32

DELPHI中使用RTTI
Width = 72

DELPHI中使用RTTI
Height = 13

DELPHI中使用RTTI
Caption = '修改的屬性名'

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object Label4: TLabel

DELPHI中使用RTTI
Left = 8

DELPHI中使用RTTI
Top = 64

DELPHI中使用RTTI
Width = 72

DELPHI中使用RTTI
Height = 13

DELPHI中使用RTTI
Caption = '將屬性修改爲'

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object edComName: TEdit

DELPHI中使用RTTI
Left = 104

DELPHI中使用RTTI
Top = 5

DELPHI中使用RTTI
Width = 78

DELPHI中使用RTTI
Height = 21

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
Text = 'label1'

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object edPproName: TEdit

DELPHI中使用RTTI
Left = 104

DELPHI中使用RTTI
Top = 32

DELPHI中使用RTTI
Width = 81

DELPHI中使用RTTI
Height = 21

DELPHI中使用RTTI
TabOrder = 1

DELPHI中使用RTTI
Text = 'caption'

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object edValue: TEdit

DELPHI中使用RTTI
Left = 104

DELPHI中使用RTTI
Top = 56

DELPHI中使用RTTI
Width = 81

DELPHI中使用RTTI
Height = 21

DELPHI中使用RTTI
TabOrder = 2

DELPHI中使用RTTI
Text = '12345'

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object btnInit: TButton

DELPHI中使用RTTI
Left = 8

DELPHI中使用RTTI
Top = 104

DELPHI中使用RTTI
Width = 75

DELPHI中使用RTTI
Height = 25

DELPHI中使用RTTI
Caption = '初始化'

DELPHI中使用RTTI
TabOrder = 3

DELPHI中使用RTTI
OnClick = btnInitClick

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object btnModify: TButton

DELPHI中使用RTTI
Left = 104

DELPHI中使用RTTI
Top = 104

DELPHI中使用RTTI
Width = 75

DELPHI中使用RTTI
Height = 25

DELPHI中使用RTTI
Caption = '修改'

DELPHI中使用RTTI
TabOrder = 4

DELPHI中使用RTTI
OnClick = btnModifyClick

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object Panel3: TPanel

DELPHI中使用RTTI
Left = 231

DELPHI中使用RTTI
Top = 1

DELPHI中使用RTTI
Width = 399

DELPHI中使用RTTI
Height = 155

DELPHI中使用RTTI
Align = alClient

DELPHI中使用RTTI
TabOrder = 1

DELPHI中使用RTTI
object GroupBox4: TGroupBox

DELPHI中使用RTTI
Left = 1

DELPHI中使用RTTI
Top = 1

DELPHI中使用RTTI
Width = 397

DELPHI中使用RTTI
Height = 153

DELPHI中使用RTTI
Align = alClient

DELPHI中使用RTTI
Caption = '被修改的控件'

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
object Label1: TLabel

DELPHI中使用RTTI
Left = 16

DELPHI中使用RTTI
Top = 32

DELPHI中使用RTTI
Width = 28

DELPHI中使用RTTI
Height = 13

DELPHI中使用RTTI
Caption = 'label1'

DELPHI中使用RTTI
end

DELPHI中使用RTTI
object BitBtn1: TBitBtn

DELPHI中使用RTTI
Left = 8

DELPHI中使用RTTI
Top = 64

DELPHI中使用RTTI
Width = 75

DELPHI中使用RTTI
Height = 25

DELPHI中使用RTTI
Caption = 'BitBtn1'

DELPHI中使用RTTI
TabOrder = 0

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI
end

DELPHI中使用RTTI

DELPHI中使用RTTI
DELPHI中使用RTTI
...{

DELPHI中使用RTTI
作者:wudi_1982

DELPHI中使用RTTI
聯系方式:wudi_1982@hotmail.com

DELPHI中使用RTTI
轉載請注明出處

DELPHI中使用RTTI
}

DELPHI中使用RTTI
unit main;

DELPHI中使用RTTI

DELPHI中使用RTTI
interface

DELPHI中使用RTTI

DELPHI中使用RTTI
uses

DELPHI中使用RTTI
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

DELPHI中使用RTTI

DELPHI中使用RTTI
Forms,

DELPHI中使用RTTI
Dialogs,typinfo, StdCtrls, ExtCtrls, Buttons;

DELPHI中使用RTTI

DELPHI中使用RTTI
type

DELPHI中使用RTTI
InsertCom = record

DELPHI中使用RTTI
Name : string; //要修改屬性的組件名

DELPHI中使用RTTI
PproName : string;//要修改控件的屬性名

DELPHI中使用RTTI
MethodName :string;//要修改or添加給控件的事件名

DELPHI中使用RTTI
text : string; //屬性值,這裏修改的是string類型的數值

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
TForm1 = class(TForm)

DELPHI中使用RTTI
Panel1: TPanel;

DELPHI中使用RTTI
GroupBox1: TGroupBox;

DELPHI中使用RTTI
ListBox1: TListBox;

DELPHI中使用RTTI
GroupBox2: TGroupBox;

DELPHI中使用RTTI
GroupBox3: TGroupBox;

DELPHI中使用RTTI
ListBox2: TListBox;

DELPHI中使用RTTI
ListBox3: TListBox;

DELPHI中使用RTTI
Panel2: TPanel;

DELPHI中使用RTTI
edComName: TEdit;

DELPHI中使用RTTI
Label2: TLabel;

DELPHI中使用RTTI
Label3: TLabel;

DELPHI中使用RTTI
edPproName: TEdit;

DELPHI中使用RTTI
Label4: TLabel;

DELPHI中使用RTTI
edValue: TEdit;

DELPHI中使用RTTI
Panel3: TPanel;

DELPHI中使用RTTI
btnInit: TButton;

DELPHI中使用RTTI
btnModify: TButton;

DELPHI中使用RTTI
GroupBox4: TGroupBox;

DELPHI中使用RTTI
Label1: TLabel;

DELPHI中使用RTTI
BitBtn1: TBitBtn;

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure FormCreate(Sender: TObject);

DELPHI中使用RTTI
procedure ListBox1Click(Sender: TObject);

DELPHI中使用RTTI
procedure btnInitClick(Sender: TObject);

DELPHI中使用RTTI
procedure btnModifyClick(Sender: TObject);

DELPHI中使用RTTI
private

DELPHI中使用RTTI
TestCom : InsertCom;

DELPHI中使用RTTI
procedure MyClick(Sender : TObject); //給控件添加onclick事件

DELPHI中使用RTTI
public

DELPHI中使用RTTI
DELPHI中使用RTTI
...{ Public declarations }

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
var

DELPHI中使用RTTI
Form1: TForm1;

DELPHI中使用RTTI

DELPHI中使用RTTI
implementation

DELPHI中使用RTTI

DELPHI中使用RTTI
DELPHI中使用RTTI
...{$R *.dfm}

DELPHI中使用RTTI

DELPHI中使用RTTI
function CreateClass(const AClassName : string):TObject;//根據名字生成

DELPHI中使用RTTI
var

DELPHI中使用RTTI
tm : TObject;

DELPHI中使用RTTI
t : TFormClass;

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
t := TFormClass(FindClass(AClassName));

DELPHI中使用RTTI
tm := t.Create(nil);

DELPHI中使用RTTI
Result := tm;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure GetBaseClassInfo(AClass : TObject;AStrings : TStrings); //獲

DELPHI中使用RTTI

DELPHI中使用RTTI
得類型的基本信息

DELPHI中使用RTTI
var

DELPHI中使用RTTI
classTypeInfo : PTypeInfo;

DELPHI中使用RTTI
ClassDataInfo : PTypeData;

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
classTypeInfo := AClass.ClassInfo;

DELPHI中使用RTTI
ClassDataInfo := GetTypeData(classTypeInfo);

DELPHI中使用RTTI
with AStrings do

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
Add(Format('name is :%s',[classTypeInfo.Name]));

DELPHI中使用RTTI
Add(format('type kind is :%s',[GetEnumName(TypeInfo

DELPHI中使用RTTI

DELPHI中使用RTTI
(TTypeKind),integer(classTypeInfo.Kind))]));

DELPHI中使用RTTI
Add(Format('in : %s',[ClassDataInfo.UnitName]));

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure GetBaseClassPro(AClass : TObject;Astrings : TStrings); //獲

DELPHI中使用RTTI

DELPHI中使用RTTI
得屬性信息

DELPHI中使用RTTI
var

DELPHI中使用RTTI
NumPro : integer; //用來記錄事件屬性的個數

DELPHI中使用RTTI
Pplst : PPropList; //存放屬性列表

DELPHI中使用RTTI
Classtypeinfo : PTypeInfo;

DELPHI中使用RTTI
classDataInfo: PTypeData;

DELPHI中使用RTTI
i : integer;

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
Classtypeinfo := AClass.ClassInfo;

DELPHI中使用RTTI
classDataInfo := GetTypeData(Classtypeinfo);

DELPHI中使用RTTI
if classDataInfo.PropCount <> 0 then

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
//分配空間

DELPHI中使用RTTI
GetMem(Pplst,sizeof(PpropInfo)*classDataInfo.PropCount);

DELPHI中使用RTTI
try

DELPHI中使用RTTI
//獲得屬性信息到pplst

DELPHI中使用RTTI
GetPropInfos(AClass.ClassInfo,Pplst);

DELPHI中使用RTTI
for I := 0 to classDataInfo.PropCount - 1 do

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
if Pplst[i]^.PropType^.Kind <> tkMethod then

DELPHI中使用RTTI
//這裏過濾掉了事件屬性

DELPHI中使用RTTI
Astrings.Add(Format('%s:%s',[Pplst[i]^.Name,Pplst[i]

DELPHI中使用RTTI

DELPHI中使用RTTI
^.PropType^.Name]));

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
//獲得事件屬性

DELPHI中使用RTTI
NumPro := GetPropList(AClass.ClassInfo,[tkMethod],Pplst);

DELPHI中使用RTTI
if NumPro <> 0 then

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
//給列表添加一些標志

DELPHI中使用RTTI
Astrings.Add('');

DELPHI中使用RTTI
Astrings.Add('-----------EVENT-----------');

DELPHI中使用RTTI
Astrings.Add('');

DELPHI中使用RTTI
for i := 0 to NumPro - 1 do //獲得事件屬性的列表

DELPHI中使用RTTI
Astrings.Add(Format('%s:%s',[Pplst[i]^.Name,Pplst[i]

DELPHI中使用RTTI

DELPHI中使用RTTI
^.PropType^.Name]));

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
finally

DELPHI中使用RTTI
FreeMem(Pplst,sizeof(PpropInfo)*classDataInfo.PropCount);

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure TForm1.btnInitClick(Sender: TObject);

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
//修改label1的caption屬性爲12345

DELPHI中使用RTTI
TestCom.Name := edComName.Text;

DELPHI中使用RTTI
TestCom.PproName := edPproName.Text;

DELPHI中使用RTTI
TestCom.text := edValue.Text;

DELPHI中使用RTTI
TestCom.MethodName := 'OnClick';

DELPHI中使用RTTI
btnModify.Enabled := true;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure TForm1.btnModifyClick(Sender: TObject);

DELPHI中使用RTTI
var

DELPHI中使用RTTI
pp : PPropInfo;

DELPHI中使用RTTI
obj : TComponent;

DELPHI中使用RTTI
a : TMethod;

DELPHI中使用RTTI
tm : TNotifyEvent;

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
obj := FindComponent(TestCom.Name);//通過名字查找此控件

DELPHI中使用RTTI
if not Assigned(obj) then exit; //如果沒有則退出

DELPHI中使用RTTI
//通過getPropInfo獲得指定控件的屬性信息,注意,這裏只能獲得那些公開

DELPHI中使用RTTI

DELPHI中使用RTTI
了的屬性

DELPHI中使用RTTI
pp := GetPropInfo(obj.ClassInfo,TestCom.PproName);

DELPHI中使用RTTI
if Assigned(pp) then

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
//根據kind判斷類型是否爲string類型

DELPHI中使用RTTI
case pp^.PropType^.Kind of

DELPHI中使用RTTI
//這裏使用setStrProp來爲string類型的屬性賦值,對起來類型的賦值

DELPHI中使用RTTI

DELPHI中使用RTTI
,請參考TypInfo.pas

DELPHI中使用RTTI
tkString,tkLString,tkWString : SetStrProp

DELPHI中使用RTTI

DELPHI中使用RTTI
(obj,TestCom.PproName,TestCom.text);

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
//給要修改的控件添加onClick事件,

DELPHI中使用RTTI
pp := GetPropInfo(obj.ClassInfo,TestCom.MethodName);

DELPHI中使用RTTI
if Assigned(pp) then

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
if pp^.PropType^.Kind = tkMethod then

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
tm := MyClick;

DELPHI中使用RTTI
//Tmethod的code爲函數地址,你也可以通過MethodAddress方法獲得

DELPHI中使用RTTI
a.Code := @tm;

DELPHI中使用RTTI
a.Data := Self;

DELPHI中使用RTTI
//對時間賦值

DELPHI中使用RTTI
SetMethodProp(obj,TestCom.MethodName,a);

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure TForm1.FormCreate(Sender: TObject);

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
btnModify.Enabled := false;

DELPHI中使用RTTI
//給listbox1添加一些類型的類名

DELPHI中使用RTTI
with ListBox1.Items do

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
Add('TApplication');

DELPHI中使用RTTI
Add('TEdit');

DELPHI中使用RTTI
Add('TButton');

DELPHI中使用RTTI
Add('Tmemo');

DELPHI中使用RTTI
Add('TForm');

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure TForm1.ListBox1Click(Sender: TObject);

DELPHI中使用RTTI
var

DELPHI中使用RTTI
t : TObject;

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
//當在類型列表中選擇一個類型並用鼠標單擊後,分別得到它的屬性信息和

DELPHI中使用RTTI

DELPHI中使用RTTI
基本信息

DELPHI中使用RTTI
ListBox2.Clear;

DELPHI中使用RTTI
ListBox3.Clear;

DELPHI中使用RTTI
t := CreateClass(ListBox1.Items[ListBox1.ItemIndex]);

DELPHI中使用RTTI
try

DELPHI中使用RTTI
GetBaseClassInfo(t,ListBox2.Items);

DELPHI中使用RTTI
GetBaseClassPro(t,ListBox3.Items);

DELPHI中使用RTTI
finally

DELPHI中使用RTTI
t.Free;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
procedure TForm1.MyClick(Sender: TObject);

DELPHI中使用RTTI
begin

DELPHI中使用RTTI
//給指定控件添加的一個方法

DELPHI中使用RTTI
ShowMessage('wudi_1982');

DELPHI中使用RTTI
end;

DELPHI中使用RTTI

DELPHI中使用RTTI
initialization

DELPHI中使用RTTI
//初始化的時候注冊

DELPHI中使用RTTI
RegisterClasses([TApplication,TButton,TEdit,TMemo,TForm]);

DELPHI中使用RTTI

DELPHI中使用RTTI
end.

DELPHI中使用RTTI

DELPHI中使用RTTI

注:示例程序在winxp+D7以及turbo delphi+winxp下測試通過。Borland文檔中不包含將來也許會有版本變化的功能。當使用如RTTI等無文檔說明的功能時,就不能保證你的程序可以完全移植到Delphi的未來版本。轉載請注明出處!

程序效果圖如下:

DELPHI中使用RTTI

編譯、運行程序,你可以通過點擊左上角列表框中的類型,獲得他們的信息。而在窗體的下部,主要演示了通過讀取配置信息來對控件的屬性賦值(例程中的配置信息是通過edit輸入的,可以在實際運用中改成從配置文件讀取)。當使用下半部分功能時,在默認情況下,點擊初始化按鈕,然後點擊修改,你會發現label1的caption變成了12345,並在在鼠標點擊的時候會彈出一個對話框,你可以嘗試把第一個edit的內容改成bitbtn1試試。

 
用DELPHI的RTTI實現對象的XML持久化
[] 去年我花了很多時間嘗試用DELPHI進行基于XML的WEB應用開發。起初的設想是很美好的,但結果做出來的東西很簡陋。一部分原因就在于XML到Object之間的數據綁定實現太麻煩(另一部分是因爲對XSLT不熟,學習它花了很...查看完整版>>用DELPHI的RTTI實現對象的XML持久化
 
用DELPHI的RTTI實現數據集的簡單對象化
[] 在《》一文中,我說了一下我用DELPHI的RTTI實現了數據集的簡單對象化。本文將詳細介紹一下我的實現方法。 首先從一個簡單的例子說起:假設有一個ADODataSet控件,連接羅斯文數據庫,SQL爲: select * from...查看完整版>>用DELPHI的RTTI實現數據集的簡單對象化
 
強大的DELPHI RTTI--兼談需要了解多種開發語言
風焱在《》中說到他碰上的被多種語言糾纏的問題。我在回複裏說: 很多語言只要能看懂幾分就行了,沒必要每一種都精通 但是如果只會很少的一兩種語言也是不行的。因爲看了一些關于JAVA的反射技術的應用,忽然想到DELP...查看完整版>>強大的DELPHI RTTI--兼談需要了解多種開發語言
 
使用Delphi開發錄音功能程序-DLEPHI
Delphi是Inprise(前Borland)公司的優秀的可視化編程工具,它自帶的Mediaplayer控件是開發多媒體的利器。用它幾分鍾就可以做出一個象解霸一樣可以播放多媒體文件的程序來。但可能很少人知道,用它也可以做一個錄音程...查看完整版>>使用Delphi開發錄音功能程序-DLEPHI
 
在Delphi中使用電子郵件
  一個成熟的軟件,對電子郵件的支持必不可少,用戶可以通過點擊程序界面上的鏈接用Delphi實現這一功能,使用非常簡單。   首先,在程序的interface部分加入uses Shellapi,因爲這個單元封裝了我們要使用的API函...查看完整版>>在Delphi中使用電子郵件