DELPHI RTTI

时间:2022-03-25 21:32:44

    运行期类型信息(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属性

procedure TForm1.ClearEdit(Acontrl: TWinControl);
var
i : integer;
begin
   for i := 0 to Acontrl.ControlCount-1 do
   begin
      if Acontrl.Controls[i] is TEdit then
        ((Acontrl.Controls[i]) as TEdit).Text := ‘‘;
      if Acontrl.Controls[i] is TCustomControl then
       ClearEdit( (Acontrl.Controls[i] as TCustomControl))
   end;
end;

第二部分:RTTI