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;