请问各位sender到底是什么,怎么判断?(100分)

  • 主题发起人 主题发起人 j5203
  • 开始时间 开始时间
J

j5203

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了如下的程序,运行时点击按钮,出现send=button1的提示框,
但却是form1的caption变为ddd.
还望各位不吝赐教,谢谢.
procedure TForm1.Button1Click(Sender: TObject);
begin
if sender=form1 then
showmessage('sender=form1')
else if sender=button1 then
showmessage('sender=button1');

with sender do
caption:='ddd';

end;
 
with sender do 改为
with TButton(Sender) do
 
(Sender as TButton).caption := 'ddd'
 
To: j5203
老兄,你这段代码没问题呀!

procedure TForm1.Button1Click(Sender: TObject);
begin
if Sender = Form1 then
ShowMessage('Sender is Form1')
else if Sender = Button1 then
ShowMessage('Sender is Button1');
end;

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

end.
 
Cption属性是继承到TControl才有;而Sender是TObject,没有Caption属性
所以你的那句话只能改变TForm1的Caption
with sender do
caption:='ddd';
改成:
(Sender as TControl).Caption:='ddd'
一切将OK
 
sender 告诉用户当前谁在调用这个过程
sender是对象或类,因此:
if sender is tform1
then
showmessage('sender=form1')
else
if sender is tbutton
then
showmessage('sender=button1');
 
同意Kang的说法,如果只写:
Caption:='ddd';
编译器会默认Caption是Form1的属性。(因为Sender本身没有Caption属性)
 
with 是开域的关键字,但是除了开域的sender以外,其他的标识符
的作用域还是跟以前一样的,这里的caption还是form1的,但是如果
(我是说如果)sender有caption这个域的话,就处理的是sender的
caption了,
 
您的回答让我明白了一些

但我还是不明白,click事件发生后我用if sender=button1 tnen....
判断了,sender确实已经等于button1了,然后才用的with...但这时却又和我的判断相反.

如果您觉得不麻烦的话,还望赐教.

非常感谢!
 
因为Sender没有Caption属性,所以程序只好用Form1的Caption来匹配
并不是与你的判断相反

With Sender as TControl do
Caption:='ddd' 就没你说的问题了
 
谢谢。
但是click事件发生后sender确实已经等于button1了...
 
在Onclick中,Sender不管是什么,都是按TObject处理.只有强制转换后,才能有Caption属性
如 var i:integer;
with Form1 do i:=1;
因为Form1没有i属性,所以编译是就把你声明的i放这来了 ,with Form1 do在这对i没用,写不写都一样
With Sender do Caption:='' ,Sender没有Caption属性,
With Sender do Caption:='' 实际就相当于Caption:='' With Sender do 没什么用
With Sender as TControl do Caption:='' 因为TControl有Caption属性,with 语句才起作用
 
我刚才试了试,with sender as tcontrol do
caption:='ddd'
还是不行,而改为 with sender as tbutton do 就行了,why?
 
我认为这时Sender已经是TButton类型了,
你可以把
if sender=button1 then
改成
if sender is TButton then
试试。

但编译器并不这么认为,编译器在编译时已确定Sender是TObject类型,
除非你作显式的强制转换通知程序Sender的属性改变了,否则...
 
强制Sender转换为TButton类型
在BCB中用 (dynamic_cast<TButton *>Sender)->...
 
原来是TWinControl没有继承TControl的Caption属性
我说的都错了 :(
 
天哪,到底怎么回事?
怎么解释:
with sender as Tclientdataset do 呢?
 
kang的说法:Cption属性是继承到TControl才有;而Sender是TObject,
没有Caption属性。我觉得是对的。
之所以sender 知道你Click的是TButton 或是Tform是因为TObject有ClassName。
请大家测试如下代码:
if Sender = Form1 then
ShowMessage('Sender is Form1')
else if sender is TButton then
ShowMessage('Sender is Button1')
else if sender is TPanel then
ShowMessage('Sender is Panel1');
with sender do
showmessage(sender.ClassName);
另:
With Sender as TControl do
Caption:='ddd';
我认为它等效与
self.Caption:='ddd';
因此会有上面的结果。

 
时间太久,强制结束。 wjiachun
 
后退
顶部