百思不得其解,求助(50分)

  • 主题发起人 主题发起人 abnertan
  • 开始时间 开始时间
A

abnertan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在delphi的form上加了一个button,产生如下代码:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
[red]Button1: TButton;
procedure Button1Click(Sender: TObject);
[/red]
private
{ Private declarations }
public
{ Public declarations }
end
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
end;
end.

为什么Button1: TButton;
procedure Button1Click(Sender: TObject);不属于private,protect,public的任何一个,
并且如果把他们改写到private或public中去后,编译将无法通过,为什么,能不能说一说其中的原理,
我想是否和vcl的消息处理机制有关?

 
另外还有一个访问指令—Published。
Published是默认的访问指令。
也就是说如果类的某些元素前没有特殊关键字,就
缺省地属于Published部分。
使用Published关键字可以使属性或方法出现在Object Inspector
(对象观察器)中。
 
补充:
类成员缺省的访问修饰符是 public,只当类的祖先类之一以 {M+} 编译指令编译时,类成员
缺省的访问修饰符才是 published 的。编译器会为 published 的字段,属性和方法生成
RTTI 信息。Object Inspector 就是利用 RTTI 信息存取对象的published的属性。设计时
IDE 将你赋给组件事件的事件处理过程的名字存到 dfm 文件中,dfm 文件作为资源链接到
Exe 文件中,运行时 Form 创建时从相应资源中读出过程的名字,利用 TObject.MethodAddress
方法查找到过程的代码入口再赋给组件的事件指针(注意事件是指针)。因此将 Button1Click
移到非 published 段,则编译器不会为它生成 RTTI 信息,用 MethodAddress 方法则无法
在运行时还原事件指针,将会出错。
 
如果改写到private或public中,要在运行时再指定Button1的OnClick
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.OnClick := Button1Click;
end;
这样也可以用
 
后退
顶部