sender在程序中如何应用 

解决方案 »

  1.   

    sender就是激发该事件的对象,
    在程序中经过转换后同该对象相同。
      

  2.   

    In an event handler, the Sender parameter indicates which component received the event and therefore called the handler. Sometimes it is useful to have several components share an event handler that behaves differently depending on which component calls it. You can do this by using the Sender parameter in an if...then...else statement. For example, the following code displays the title of the application in the caption of a dialog box only if the OnClick event was received by Button1.
      

  3.   

    procedure TMainForm.Button1Click(Sender: TObject);begin
    if Sender = Button1 then
      AboutBox.Caption := 'About ' + Application.Title
    else 
      AboutBox.Caption := '';
    AboutBox.ShowModal;
    end;
      

  4.   

    我觉得就是本身,我没仔细想过,应该和C++的this差不多吧!
      

  5.   

    Sender表示当前方法指针指向的方法所属的对象例如对于TForm的对象Form1,起OnClick事件中包含参数Sender,如下procedure TForm1.FormClick(Sender:TObject);这里的FormClick实际是Delphi的IDE在设计期为你在窗口类的初始化未命名部分自动建立的方法,但他的可见性是Pulished的,因此具有RTTI信息!!!!在运行期间,当前的方法指针FClick指向的方法属性(即事件)OnClick所属于的对象为TForm1的实例Form1,因此Sender代表的就是对象Form1,但由于Sender的类型为TObject,因此实际使用的时候最好进行类型转换!!!!使用As运算符!!!!
      

  6.   

    if Sender = Button1 then
    这句话什么意思。我不明白的,能不能说的详细一点谢谢
      

  7.   

    sender等同于event吗???
    那么form的event是否都可以使用sender!!!
      

  8.   

    In an event handler, the Sender parameter indicates which component received the event and therefore called the handler. ....if Sender = Button1 then...也就是说如果..'Button1'.. received the event and therefore called the handler
      

  9.   

    -------------------------
    我觉得就是本身,我没仔细想过,应该和C++的this差不多吧!
    ------------------------------------
    不对,那是self,不过self好像不是指针
      

  10.   

    if Sender = Button1 then
    的意思就是事件触发者是不是Button1
      

  11.   

    那么handler又是什么呢?
    我是初学者,请大家多多关照
      

  12.   

    handler是句柄,每个控件、窗体都有句柄,windwos靠句柄与控件、窗体通讯。
      

  13.   

    sender就是触发事件的控件、句炳吧
      

  14.   

    Sorry,楼主,上面我说错了...,更正如下:**********************************************************************************Sender表示触发当前事件代码的对象,而Self才表示当前方法指针指向的方法所属的对象例如对于TForm的对象Form1,起OnClick事件中包含参数Sender,如下procedure TForm1.FormClick(Sender:TObject);这里的FormClick实际是Delphi的IDE在设计期为你在窗口类的初始化未命名部分自动建立的方法,但他的可见性是Pulished的,因此具有RTTI信息!!!!在运行期间,当前的方法指针FClick指向的方法属性(即事件)OnClick所属于的对象为TForm1的实例Form1,因此Self代表的就是对象Form1,而触发这个事件的对象不一定是Form1,有可能是Button1,所以Sender需要进行判断。你可以在Button1的OnClick事件中调用如下代码:
    Form1.OnClick(Button1);
    这个时候在Form1的OnClick事件中对Sender进行判断就是Button1,而不是Form1了!需要注意的是,由于Sender的类型为TObject,因此实际使用的时候最好进行类型转换!!!!使用As运算符!!!!**********************************************************************************另外,你问Sender和Event是否可以等同:个人认为,虽然都是指针,但具体代表的事物不同!如果你要强制转换,我没有试验过!!!!只要对存储空间要求一致,应该可以转换,但最好不要简单的等同!!!!
      

  15.   

    不知楼上各位高手小弟想知道那有sender 或 handle的详细介绍谢谢。给个网址或给我发mail: [email protected]
      

  16.   

    Sender是对象,和句柄是不搭嘎的两个东西Sender是一个四个字节的指针变量,里面存放的指针内容是(堆)栈中对象实体的首字节地址。我们在每次在设计APP的时候,会在Object Inspector里面双击事件属性来建立我们需要的代码,以完成预期的功能。当我们进行双击的时候,Delphi的IDE(Integreted Development Environment)会为我们自动建立与事件属性对应的过程,例如,当我们双击Form1变量的OnClick属性时,IDE会自动在TForm1类的初始化部分创建如下的代码:
    procedure TForm1.Form1Click(Sender:TObject);
    同时在实现部分创建上述过程的框架,如下:
    procedure TForm1.Form1Click(Sender:TObject);
    begin
      //初始情况下,这里并没有任何代码!
    end;
    然后我们在程序中可以调用这个建立好的方法,例如我们在窗体上的Button1的OnClick方法中执行如下代码:
    ...
      Self.Form1Click(Button1);
    ...
    同时,我们假设在Form1Click中代码如下:
    ...
      if Sender=Button1 then
        ShowMessage(TButton(Sender).Caption);  //这里在判断条件为真的情况下使用强制转换
    ...
    可以看到在代用Form1Click时,为其传递的Sender参数可以自己定义,因此严格来讲Sender参数并不代表真正触发此事件对应方法的对象,确切的说应该是用户指定的触发此事件对应方法的对象!
      

  17.   

    To Cjfzy  “handler是句柄,每个控件、窗体都有句柄,windwos靠句柄与控件、窗体通讯。”所有从TWinControl派生的类的实例都有Handle属性,这个属性封装了Windows中对应对象的句柄(类似指针的一个东西,但个人认为并不完全等于指针!)同时,Windows为每个线程维持着一个消息队列,通过这个消息队列来和线程对应窗体对象交互。因此,句柄仅仅是Windows辨别其对象的一种手段、工具,并不是用来通讯的!
      

  18.   

    sender就是激发该事件的对象,
      

  19.   

    //Sender其实就是函数的一个参数,你看看VCL中触发事件的代码,就会发现Sender往往代表了
    //“事件的触发者”,或者说“这个外挂的事件处理函数的调用者”,目的是为了让事件处理函数有一个参考
    //尤其是当一个事件处理函数挂接到多个实例时。//看个例子
    procedure THappy.MakeLove;
    var
      bCancel :Boolean;
      bNeedBath :Boolean;
      bHappy :Boolean;
    begin
      bCancel := False;
      bNeedBath := True;  if assigned(FOnBeforeMakeLove) then
        FOnBeforeMakeLove(Self, bNeedBath, bCancel);  if bCancel then Exit;
      if bNeedBath then GotoBath;  bHappy := DoMakeLove(Self.Boy, Self.Girl);  if assigned(FOnAfterMakeLove) then
        FOnAfterMakeLove(Self, bHappy);
    end;procedure XXXBeforeMakeLove(Sender :TObject; var ANeedBath, ACancel :Boolean);
    begin
      if Sender is THappy then begin
        if (THappy(Sender).Boy <> me) or (THappy(Sender).Girl.Age < 16)
                        or (THappy(Sender).Girl.Age > 25) then
        begin
          ACancel := True;
        end;
        ANeedBath := OfCourseTrue;
      end;
    end;procedure XXXAfterMakeLove(Sender :TObject; const AHappy :Boolean);
    begin
      if AHappy then
      begin
        ShowMessage('爽歪歪...');
      end
      else begin
        ShowMessage('555...');
      end;
    end;-------
      

  20.   

    sender就是触发事件的对象,是TObject(即被定义为所有类的基类)
    我记得在csdn的文档中心(其实很早前我在其他地方看过)有讲sender,self等联系和区别的文章,你可以看看。