public和published有何不同? 糊涂了。 (100分)

  • 主题发起人 主题发起人 BlackDragon
  • 开始时间 开始时间
B

BlackDragon

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TCustomProc = procedure(const Msg: string) of object;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);

private

{ Private declarations }
public

published
procedure MyRoutine(const Msg: string);
{ Public declarations }
end;

var
Form1: TForm1;


implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.MyRoutine(const Msg: string);
begin
MessageDlg(Msg, mtInformation, [mbOk], 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('A button was pushed... or was it?');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Proc: TNotifyEvent;
begin
@Proc := MethodAddress('Button1Click');
if Assigned(Proc) then
Proc(nil);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
Proc1: TCustomProc;
begin
@Proc1 :=self.MethodAddress('MyRoutine');

if Assigned(Proc1) then
Proc1('Hello world');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
MyRoutine('');
end;

end.

大家看看
声明改成
public
procedure MyRoutine(const Msg: string);
published

{ Public declarations }
end;
则地址找不到了。为什么?
 
大家是不是觉得简单啊?我觉得糊涂。
 
public
procedure TForm1.MyRoutine(const Msg: string);//加上即可
published

{ Public declarations }
end;
 
pubished
为什么可以不加?
生命其他过程也要加父吗?
 
根据类的定义
两者都是对外公开的,但 published 可以在属性编辑器中编辑
 
Published是运行时信息(RTTI)产生的,而Public却没有RTTI。
运行时信息允许应用程序动态访问属于某一对象的域和属性、定位该对象的方法。
在保存和装入窗体文件时,Delphi利用运行时信息存取属性值、
在对象查看器中显示属性、使指定的方法和相关联。
 
published 可以在属性编辑器中编辑
 
我这个声明为什么在public处声明前面要加TForm1?而published就不用?大家讲的在
帮助里有啊。我也看了,帮助里没讲public啊。
 
两者之间没有什么区别,published只是delphi自己的一种保护机制!
 
老大们,看看我上面的例子啊。
 
public 要公布的属性,过程等,当设计时不可见;
published 要公布的属性,过程等,设计时可见;即运行时的属性等禁止公布为该区域。
 
建议看看Delphi in a netshell
特别是对象模型部分/RTTI部分。
别看不起Published这个关键字 DELPHI的可视化编辑能力可全靠它呀
lightwood兄说得很清楚,要点都提到了,佩服!

————the end.
 
什么啊。。
//DELPHI ABUOUT METHODADDRESS
If Name does not specify a published method for the object,
MethodAddress returns nil.

要获取PUBLIC中的方法地址就不能用这个啦。。黑黑。。
这个才是关键。。。PUBLICSHED和PUBLIC的区别大家应该都知道了。
 
接受答案了.
 
真是晕倒,帮助就MethodAddress的没看,搞错地方了.[:(!]
 
后退
顶部