mainwndproc 是protected方法,你的form实例之所以能访问到这个方法是因为你的当前单元中包含了form的子类的定义,所以才能访问到 mainwndproc 这个受保护的方法。比如
type
TMyWinCtl = class(TWinControl); // 继承TWinControl的一个子类,什么也不做。
TForm1 = class(TForm)
btn1: TButton; // 一个按钮
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1; { 在当前单元(文件)中,定义了一个Tform1 的子类,继承自TFoem
所以此时当前单元就相当于进入了tform 定义所在的 FORMS 单元,
DELPHI 中,同一个单元内的所有类及它的成员的可见性都是PLUBLIC的,
所以你才可以访问到tform1的受保护的mainwndproc 方法
当前上下文中,如果想要按钮btn1也能访问mainwndproc这个受保护的方法,你可以:
TWinControl(btn1).mainwndproc .... 即可,
这样相当于TWinControl定义所在的单元controls被"inline"到了本单元了一样,
就的吟哦上面讲过同个单元内的各个类的成员都是可见的。 要明确的是,不应该通过实例来调用mainwndproc及其他的任何受保护的方法,这破坏了封装性
}
// 烂键盘打字太痛苦了,新买的键盘送到时都不想打字了。
type
TMyWinCtl = class(TWinControl); // 继承TWinControl的一个子类,什么也不做。
TForm1 = class(TForm)
btn1: TButton; // 一个按钮
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1; { 在当前单元(文件)中,定义了一个Tform1 的子类,继承自TFoem
所以此时当前单元就相当于进入了tform 定义所在的 FORMS 单元,
DELPHI 中,同一个单元内的所有类及它的成员的可见性都是PLUBLIC的,
所以你才可以访问到tform1的受保护的mainwndproc 方法
当前上下文中,如果想要按钮btn1也能访问mainwndproc这个受保护的方法,你可以:
TWinControl(btn1).mainwndproc .... 即可,
这样相当于TWinControl定义所在的单元controls被"inline"到了本单元了一样,
就的吟哦上面讲过同个单元内的各个类的成员都是可见的。 要明确的是,不应该通过实例来调用mainwndproc及其他的任何受保护的方法,这破坏了封装性
}
// 烂键盘打字太痛苦了,新买的键盘送到时都不想打字了。
解决方案 »
- 线程会自己运行?启动一次以后,怎么自己又启动呢?
- 怎么检测usb口设备情况,并且获得usb设备的一些基本信息
- 元数据查询~是什么意思(小问题,只给10分:p)
- 为了建造10艘航母,强烈要求彻查贪官,政府财政透明,同意的进来!
- 这段存储过程怎么写?如果SQL-server的数据库中不存在数据表A就建立它.
- 请教,这是为什么,我在delphi7的Ttreeview中加入几个节点,可出现的是一堆乱字!
- 数据库连接问题
- SOS(如何替换系统文件)
- 可不可在exe文件中加入信息
- 昨在SQL7中手工建了几个表,且追加了几条记录,今天为何表都没了?
- XE5 开发安卓程序 如何读取 Clientdataset的中文字符串
- Delphi如何定义一个能被所有Form调用的函数或过程?
继上面说的, 如果你要 btn1 也能访问 mainwndproc 方法,就用上面那个 TMyWinCtl 强类型转换一下
type
TMyWinCtl = class(TWinControl); // 继承TWinControl的一个子类,什么也不做。
TForm1 = class(TForm)
btn1: TButton; // 一个按钮
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;implementation....
var
m:tmeesage;
begin
TMyWinCtl(btn1).mainwndproc(m);
end;
m:tmeesage;
begin
TMyBTN (btn1).mainwndproc(m);
end;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; TWinControlB=class(TWinControl)
protected
procedure ShowMessageB;
end;var
Form1: TForm1;
WinControlA:TWinControlA ;
WinControlB:TWinControlB;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
WinControlB.ShowMessageB;
WinControlB.MainWndProc()
end;上面是我刚才些的一个类,我发现WinControlB这个对象可以直接调用MainWndProC是因为TWinControl出现在使用的类对象里面吗?
TMyWinCtl = class(TWinControl); // 继承TWinControl的一个子类,什么也不做。你这个就相当于上面
TWinControlB=class(TWinControl) 只要存在一个继承类的定义代码出现,那么这个被继承的基类(这里你是TWinControl)所在的单元(control)
就可以被当前所在单元(这里是unit1)所见,所以就能访问到control单元里所有类中定义的代码如果,你仅仅声明一个变量,而没有一个继承的代码定义,被继承的基类所在的单元就不会被访问到
// TWinControlB=class(TWinControl) 注释掉这行
WinControl:TWinControl ; // 改直接定义一个TWinControl的变量,这样也不能访问到private、protected
WinCOntrol.MainProc... // 错误
同理,因为 TForm1 = class(TForm) ,
var
Form1:TForm1; Form1.MainProc... // 有效
由于这种特性有可能破坏OOP的封装性,所以D2009后就加入了一个新关键字 strict
strict 可以严格规范对象成员的可见性type
MyClass = class(TBassClass)
strict protected
.....
type
TMyClass = class
strict protected // 严格域
procedure func;
end;var
o:tmyclass;
begin
o:=tmyclass.Create;
o.func; // 错误,即便代码都在同一个单元内
end;
你在VCL源码中找到Control单元,在TControl类的protected 前加上 strict 关键字,
然后重新编译Control单元生成新的dcp后,以后任何Control单元内之外的地方都不能访问到protected的成员了,
不过最好不要这样做,官方也没有这样做的原因可能就是为了兼容以前的代码