今天在csdn上遇見一貼,是關於vcl屬性的問題,胡亂給人家答了一通,發現自己反而糊塗了
那貼是說在他自己動態生成的一個空件里加屬性
type
MYStaticText=class(TStaticText)
published
property onMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;
end;
我回貼:
這三個屬性在TControl中聲明如下
protected
property OnMouseWheel: TMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
property OnMouseWheelDown: TMouseWheelUpDownEvent read FOnMouseWheelDown
write FOnMouseWheelDown;
property OnMouseWheelUp: TMouseWheelUpDownEvent read FOnMouseWheelUp write
FOnMouseWheelUp;
因爲是protected,所以可以被它的派生類訪問,
TControl->TWinControl->TCustomStaticText->TStaticText->MYStaticText
所以onMouseWheel; OnMouseWheelDown; OnMouseWheelUp;你就不用再……
其實這裡已經錯了,打開一個StaticText,發現它的事件里根本沒有這三個屬性
其實這裡還能理解,因爲看StaticText的定義,publish部分沒有這三個屬性。
好,所以
他回貼:
我看了TForm的声明,其中就有MouseWheel属性,而TForm也是由TControl派生而来的。
我一看是真的!但是只是
property OnMouseWheel;
沒有像TControl那樣複雜的從屬性域中去讀寫,
那麽按照這個道理,我就離所應當的理解成派生類里不需重新定義一個屬性的讀寫域
只要做一下聲明就行了
但是打開一個基本的form,會看到Tform1並沒有聲明這些屬性,但是在屬性列表里照樣可以看見
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
所以我現在糊塗了,
同樣一個定義
TStaticText = class(TCustomStaticText)
TForm1 = class(TForm)
且TCustomStaticText和TForm都是從TControl中派生的,
爲什麽在TControl中聲明的一些屬性會丟掉,就像 OnMouseWheel;
如果是因爲在派生類里沒有聲明的原因,那麽類死
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
tform1怎麽不丟屬性? 這是怎麽回事?
嗯,这位仁兄真有鲁迅先生遗风哈
本就如此,是你理解错误,Protected部分声明只是让其在派生类中可见,但不可有可用,而只有在Published和Public部分声明才能在派生类中使用,当然这里如果不是做成控见,没必要加入运行期信息,应该在Public部分声明,而非Published
up
阿德你的信誉值怎么少了?
那么还有个疑问就是如果在派生类里面没有将其Published
那么这个属性就不能用吗?
在类的继承树上的任何一个位置public或者published了这个属性,那么从此以后它就能用了
protected的只能被子类使用,private的外部不可见
但是如果在同一单元内,就都是可见的了。
published和public的区别仅仅在于如果你将它作为控件发布的时候在不在object inspertor中出现而已...
真是的 ,吾人子弟1!!!真是的 ,吾人子弟1!!!真是的 ,吾人子弟1!!!真是的 ,吾人子弟1!!!
因为label1接收不到这个消息啊
不然borland为什么不公开这个...
哈哈,信誉值少了,呵呵,好高兴啊,呵呵楼主的信誉值少了,呵呵!!!!
unit Unit1;
interface
uses
Forms, Dialogs, StdCtrls, Controls;
type
TLabelxxx = class(Tlabel)
private
procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL;
end;
TForm1 = class(TForm)
procedure Label1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
xxx: TLabelxxx;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Label1Click(Sender: TObject);
begin
end;
{ TLabelxxx }
procedure TLabelxxx.CMMouseWheel(var Message: TCMMouseWheel);
begin
ShowMessage(xxx);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
xxx := TLabelxxx.Create(Self);
xxx.Parent := self;
xxx.Left := 0;
xxx. := 0;
xxx.Width := self.Width;
xxx.Height := self.Height;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
xxx.Free;
end;
end.
onmousewheel事件是,通过CM_MOUSEWHEEL触发的,而作为TLabel并不接收到这个消息,上面的程序演示了这一点,所以borland并不公开Onmousewheel,Tbutton是可以接收到的,但是对于Button,OnmouseWheel没有意思,所以同样不公开...
over...
你可以将上面的TLabel换成其他的试试...