Delphi中的published

Delphi中类的published属性则是可以在属性列表中看到并使用的属性

公布成员(published)和公共成员(public)具有相同的可见度,但published中声明的会显示在属性栏,public   不会!

    published和public的限制访问属性是一样的 ;不过,published一般用于组件编程中,而不常用于应用程序中。

转自OBJECT   PASCAL

     "公布成员(published)和公共成员(public)具有相同的可见度。不同的是,运行时信息RTTI(runtime   type   information)为公布成员产生。RTTI允许应用程序动态地查询对象的域和属性、定位对象的方法。RTTI用于在下列情形下访问属性的值:保存 和加载文件时,在对象检查器(Object   Inspector)中显示属性时,将指定的方法(即事件处理程序)与指定的属性(即事件)关联时。

    公布属性只限于某些数据类型。序数、串、类、接口和方法指针等类型可以被公布;由此可见,提供的基类型其上下界范围的序数值在0到31之间的集合类型也可 以被公布,即集合必需适合于字节、字或双字(Byte,Word或Double   Word);除Real48之外,任何实数类型都可以被公布。数组类型的属性(不同于下面述及的数组属性array   properties)不能被公布。"

通过RTTI可以获得一个类的所有Published属性
var
mTypeInfo: PTypeInfo;
mTypeData: PTypeData;
mPropList: PPropList;
mPropInfo: PPropInfo;
mPropCount, i: Integer;
begin
mTypeInfo := Form1.ClassInfo;

mTypeData := GetTypeData(mTypeInfo);
if mTypeInfo^.Kind <> tkClass then Exit;

mPropCount := mTypeData^.PropCount;
if mPropCount <= 0 then Exit;

GetMem(mPropList, mPropCount * SizeOf(PPropList));
try
GetPropInfos(mTypeInfo, mPropList);
for i := 0 to mPropCount - 1 do
begin
mPropInfo := mPropList^[i];
ShowMessage(mPropInfo^.Name);
end;
finally
FreeMem(mPropList, mPropCount * SizeOf(PPropList));
end;
end; 

在TForm1 = class(TForm)下面多了Button1变量和Button1Click方法,它们其实是published类型的,当该类或父类使用了“{$M+}”编译指令的情况下,默认为published成员。published成员可以在Object Inspector看到,我们可以手工加上将代码改为:

type

  TForm1 = class(TForm)

  published

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    procedure PriShowMsg();

    { Private declarations }

  public

    procedure PubShowMsg();

    { Public declarations }

  end;

在implementation中对上述方法进行定义:

procedure TForm1.PriShowMsg;

begin

  ShowMessage('私有方法调用');

end;

procedure TForm1.PubShowMsg;

begin

ShowMessage('公共方法调用');

end;

在Button1的OnClick事件方法中调用上述两个方法:

procedure TForm1.Button1Click(Sender: TObject);

 begin

   PriShowMsg;

   PubShowMsg;

end;

猜你喜欢

转载自www.cnblogs.com/QuincyYi/p/12729143.html