请教:Button1.click与Button1click(Sender)的区别 button1有一个click事件 我在另外一个地方想调用这个button1的click事件是不是有题上的两种方法? 有何区别? 有的时候为什么Button1click(Sender)这样用会出错? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Sender默认就是button1自己Button1.Click;或Button1.OnClick(Button1); 按你的说法,应该有三种(1)button1.click(2)button1.onclick(sender)(3)button1click(sender)你说有时候会出现Button1click(Sender)这样用会出错的情况那估计是你在某个函数里面调用的,比如说procedure x;begin Button1click(Sender);end;这样会无法通过编译,因为你没有sender传入。或许你是别的情况,但是问题出现的原因很简单,你去看那个sender,只可能是那里有问题。 sender一般是被触发调用时被传入的被操作者 sender大部分情况下不用的,传nil即可Button1Click(nil); //有区别的,看了下边的代码分析你就清楚了。//先说Button1.Click, TButton = class(TCustomButton) TCustomButton = class(TButtonControl) public procedure Click; override; procedure TCustomButton.Click; var Form: TCustomForm; begin Form := GetParentForm(Self); if Form <> nil then Form.ModalResult := ModalResult; inherited Click; //这里Inherited 父类的Click方法 end; TCustomButton = class(TButtonControl) TButtonControl = class(TWinControl) TWinControl = class(TControl) TControl = class(TComponent) protected procedure Click; dynamic; //TControl有个动态的保护的Click方法 procedure TControl.Click; begin //这里写的很清楚了,呼叫 OnClick事件 //此时说明Button1click(Sender: TObject); //IDE窗体点右键,有个ViewAsText,点开它会会发现有如下的代码 //object btn2: TButton // ... ... // OnClick = btn2Click // end //我们再看TControl定义的一个属性 //property OnClick: TNotifyEvent read FOnClick write FOnClick // stored IsOnClickStored; //此时关系已很明了,即FOnClick = Btn2Click; //Assigned(FOnClick)为真。 { Call OnClick if assigned and not equal to associated action's OnExecute. If associated action's OnExecute assigned then call it, otherwise, call OnClick. } //下面这句在Button1里面即是 If Assigned(Btn1Click) and (TButton.Action <> nil) and if Assigned(FOnClick) and (Action <> nil) and not DelegatesEqual(@FOnClick, @Action.OnExecute) then //转换一下 Btn1Click(Button1) FOnClick(Self) else if not (csDesigning in ComponentState) and (ActionLink <> nil) then ActionLink.Execute(Self) else if Assigned(FOnClick) then //转换一下 Btn1Click(Button1) FOnClick(Self); end; 方法有多种,主要的区别是:你的代码中关不关心被操作的对象(即有没有用到Sender)1. Button1Click(nil);2. Button1Click(Button2);3. Button1.Click;4. Button1.OnClick(nil);5. Button1.OnClick(Button2);6. 其它...procedure Button1Click(Sender:TObject);begin Button1.Caption:='张三'; {如果单独这一句,那么上面5种调用的方法都可以使用} {TButton(Sender).Caption:='张三';} {若有这样的代码,那么调用的时候就要传入Sender了,上面的2,5方法可用,其它会报错}end; 楼上说的很对,关键看你用不用到Sender,如果用不到,那你传不传都无所谓。另外,Action这么好用的东西,为什么不用。 Button1.click = TNotifyEventButton1click = TMethod 一个是执行控件的方法,另一个是直接执行一个事件的回调,要说区别就是这里了。onclick在click中被调用,所以你觉得看起来差不多。 dll中如何动态创建对象? 怎样才能将word中的表格存成图片 delphi 函数 输入问题? 在delphi6中使用PrintRange 枚举! delphi7在WinXP + SP1上的安装问题 调用ScrollBox的scaleby之后,他的子控件如果落在ClientRect之外,属性不刷新怎么办? 关于窗口的超级简单属性问题 我想问一下,如何在菜单条中加入图片? 各位急,在线等侯你的回答 EXCEL之间复制 我用timer 定时触发一个button事件,但是在程序运行中确无法关闭 窗体 谢谢了 急
Button1.Click;
或
Button1.OnClick(Button1);
(1)button1.click
(2)button1.onclick(sender)
(3)button1click(sender)
你说有时候会出现Button1click(Sender)这样用会出错的情况
那估计是你在某个函数里面调用的,比如说
procedure x;
begin
Button1click(Sender);
end;
这样会无法通过编译,因为你没有sender传入。
或许你是别的情况,但是问题出现的原因很简单,你去看那个sender,只可能是那里有问题。
Button1Click(nil);
TButton = class(TCustomButton)
TCustomButton = class(TButtonControl)
public
procedure Click; override; procedure TCustomButton.Click;
var
Form: TCustomForm;
begin
Form := GetParentForm(Self);
if Form <> nil then Form.ModalResult := ModalResult;
inherited Click; //这里Inherited 父类的Click方法
end; TCustomButton = class(TButtonControl)
TButtonControl = class(TWinControl)
TWinControl = class(TControl)
TControl = class(TComponent)
protected
procedure Click; dynamic; //TControl有个动态的保护的Click方法 procedure TControl.Click;
begin
//这里写的很清楚了,呼叫 OnClick事件
//此时说明Button1click(Sender: TObject);
//IDE窗体点右键,有个ViewAsText,点开它会会发现有如下的代码
//object btn2: TButton
// ... ...
// OnClick = btn2Click
// end
//我们再看TControl定义的一个属性
//property OnClick: TNotifyEvent read FOnClick write FOnClick
// stored IsOnClickStored;
//此时关系已很明了,即FOnClick = Btn2Click;
//Assigned(FOnClick)为真。
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
//下面这句在Button1里面即是 If Assigned(Btn1Click) and (TButton.Action <> nil) and
if Assigned(FOnClick) and (Action <> nil) and
not DelegatesEqual(@FOnClick, @Action.OnExecute) then
//转换一下 Btn1Click(Button1)
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute(Self)
else if Assigned(FOnClick) then
//转换一下 Btn1Click(Button1)
FOnClick(Self);
end;
2. Button1Click(Button2);
3. Button1.Click;
4. Button1.OnClick(nil);
5. Button1.OnClick(Button2);
6. 其它...procedure Button1Click(Sender:TObject);
begin
Button1.Caption:='张三';
{如果单独这一句,那么上面5种调用的方法都可以使用} {TButton(Sender).Caption:='张三';}
{若有这样的代码,那么调用的时候就要传入Sender了,上面的2,5方法可用,其它会报错}
end;
另外,Action这么好用的东西,为什么不用。
Button1click = TMethod