有个菜级问题……一直没有弄明白。。
在调用某Button的事件时,用有ButtonClick(nil);Button.Click;和ButtonClick(Sender);
这三种方法都行……可是就是不知道这之间有什么区别,也不知道在什么情况下,用如个最合适。
还有就是调用参数Nil,Sender,Self,Application等之间有什么区别。
还请会的讲解一下……??多谢了。。

解决方案 »

  1.   

    HEHE~~~偶在群里不都给你说了……
      

  2.   

    1、Nil:
    如果你在一个无窗体的单元中要创建窗体,这时就可以用Nil了创建了。也可以Application,但是你需要引用Forms单元。动态建立控件时Self和Application实参的区别
    许多的Delphi入门类书籍都有讲如何动态生成控件,也就是讲用Create函数动态构造控件,不过这些书一般没有讲所传递的AOwner参数中最常用的两个值Self和Application之间的区别。这就让我们这些初学者刚看到时感到很迷惑!这次我就试着区分一下这两个实参,如果你正好也不清楚他们之间的区别,那么就请看下去,也许能省下您不少查书的时间。 
        首先说说AOwner参数。顾名思义AOwer就是所有者的意思,也就是说您要生成的控件是由谁所有的!在Delphi中控件的所有者是要负责该控件的生成和释放的。也即是说控件的所有者如果调用了Free方法删除自己,那么他所拥有的控件也一样要调用Free方法删除自己。明白了么? 
        Self在Delphi中总是代表实例本类,大概等于是C++中的this指针,如果学过C++的话就很容易明白啦!这个Self和C++中的this指针一样也是隐含于其所在类的所有属性和方法前的,也就是说你对本类的方法的调用和属性访问都是隐含的在最前面加上Self这个前缀的。Delphi中的程序多数都是一个窗体一个类的,所以Self常常是指其所在的窗体的实例。例如我们常常单独用Close方法来关闭本窗口,假设有一个叫Form1的窗口我们要关闭他。现在我们可以试试用Close或者Self.Close来试一试,比较以下就可以明白,他们是等价的! 
        Application在Delphi中是表示整个应用程序,他是TApplication类的一个实例在一个应用程序中有且只有一个,并且是不用用户干预而自动生成的。 
        说到这里也许大家很容易就能看出他们之间的区别来了!我们光说没有意思,来举个例子说明,请跟着下面的说明建立一个程序: 
    打开Delphi5,新建立一个应用程序,加入Form1、Form2和Form3三个窗口,其对应的单元文件分别是Unit1、Unit2和Unit3;在Form1上放两个分别名为Button1和Button2的TButton类按钮,在Form2上放一个名为Button3的TButton类按钮;在Form1的单元文件Unit1中的interface下的uses部分加入对Form2的单元文件Unit2的引用,在Form2的单元文件Unit2中的interface下的uses部分加入对Form3的单元文件Unit3的引用;在Form1的private关键字下定义Form2: TForm2;在Form2的private关键字下定义Form3: TForm3; 
    在Button1的OnClick事件中写如下代码: 
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      Form2:= TForm2.Create(Self); 
      Form2.Show; 
    end; 
    在Button2的OnClick事件中写如下代码: 
    procedure TForm1.Button2Click(Sender: TObject); 
    begin 
      Form2.Free;//将动态建立的Form释放 
    end; 
    在Button3的OnClick事件中写如下代码: 
    procedure TForm2.Button3Click(Sender: TObject); 
    begin 
      Form3:= TForm3.Create(Self); 
      Form3.Show;  
    end; 
        运行后依次点三个按钮试试看,然后把Form3:= TForm3.Create(Self);这句用Form3:= TForm3.Create(Application)代替再试试看有什么不一样,是不是明白了我上面所讲的呢?一定要试试哦!还要提醒一点,谁建立谁释放原则要牢记哦!!! 
    好了,我知道的就这些了
      

  3.   

    Create的参数分别用Nil、Application、Self有何区别constructor Create(AOwner: TComponent); virtual;这里的 AOwner 表示对象之间的拥有关系。也就是说如果一个对象 A 被另一个对象 B 所拥有,在对象 B 析构之前 A 会被自动析构。传入 nil 说明没有其它对象拥有 A,这时 A 必须手工释放: A.Free;
    传入 Application 表示由 Application 全局对象拥有 A,如果应用程序关闭,那么 A 被自动 Free;
    传入 Self 与所在处理方法有关。传入 Self 将于与当前方法所在的对象建立拥有关系。对于 TForm 类,一般可以使用 Application 为参数,
    对于表单上的元件,可以使用表单对象为参数。
    对于临时建立的小对象,可以使用 nil 为参数,但要记得使用 Free 释放对象。
      

  4.   

    非常感谢【hhzqf1980(hh) 】
    谢谢你对我们这些新手的热心关爱。。嘻嘻
      

  5.   

    我用了D快一年了才知道明白,好似柳岸花明又一村的感觉。。嘻嘻。。
    UP...
      

  6.   

    先说一下    
    procedure Button1Click(Sender: TObject)
    重定义上可以看出这是一个传值的一个过程,传值类型是TObjcet !
    Sender 其实这是一个对象,也可理解为当被点击时的对象
    如:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      showmessage(  sender.ClassName);
    end;有以上基础就很容易理解 Button1Click(nil) 的含义了!
    Button1Click(nil) 就是传了一个nil空的对象!而  button1.Click ;则是一个procedure过程!纯粹的调用click事件!
    所以procedure Button1Click(Sender: TObject)是事件的本身
        Button1Click(nil) 是Button1Click(Sender: TObject)其中的一种特例!