button1有一个click事件 我在另外一个地方想调用这个button1的click事件
是不是有题上的两种方法? 有何区别? 有的时候为什么Button1click(Sender)这样用会出错?

解决方案 »

  1.   

    Sender默认就是button1自己
    Button1.Click;

    Button1.OnClick(Button1);
      

  2.   

    按你的说法,应该有三种
    (1)button1.click
    (2)button1.onclick(sender)
    (3)button1click(sender)
    你说有时候会出现Button1click(Sender)这样用会出错的情况
    那估计是你在某个函数里面调用的,比如说
    procedure x;
    begin
     Button1click(Sender);
    end;
    这样会无法通过编译,因为你没有sender传入。
    或许你是别的情况,但是问题出现的原因很简单,你去看那个sender,只可能是那里有问题。
      

  3.   

    sender一般是被触发调用时被传入的被操作者
      

  4.   

    sender大部分情况下不用的,传nil即可
    Button1Click(nil);
      

  5.   

    //有区别的,看了下边的代码分析你就清楚了。//先说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;
      

  6.   

    方法有多种,主要的区别是:你的代码中关不关心被操作的对象(即有没有用到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;
      

  7.   

    楼上说的很对,关键看你用不用到Sender,如果用不到,那你传不传都无所谓。
    另外,Action这么好用的东西,为什么不用。
      

  8.   

    Button1.click = TNotifyEvent
    Button1click  = TMethod
      

  9.   

    一个是执行控件的方法,另一个是直接执行一个事件的回调,要说区别就是这里了。onclick在click中被调用,所以你觉得看起来差不多。