拿按钮控件来说,我们有两种使用它的方法,一个是在设计阶段在窗体上放一个按钮控件,另外一种方法是在运行阶段用代码来生成 如下
myb:=Tbutton.create(self);
最后还要free
我的问题
1\self是什么意思 还有如果上面的代码写成myb:=Tbutton.create(Application);好像也行,这个self和application之间有什么区别? 2\如果是设计阶段生成的控件,他是怎么FREE的,是不是自己自动Free?3\如果是第二种方法在运行阶段通过代码生成控件,那么怎么编写这个控件的事件处理代码?比如我想实现在通过运行阶段用代码生成的按钮上单击然后弹出一个对话框,怎么来实现,就是这个问题困扰了我很长时间4\这两种方法有没有什么实质上的区别,我现在想在一个程序里动态生成数据库的Tadoquery控件,如果这么做会带来什么局限性?问题挺多的,不好意思

解决方案 »

  1.   

    1、self指的当前对象,如果写在TForm1,指的是TForm1的一个实例。TButton.Create(AOwner: TComponent), Owner不一样,释放的时间点也不一样。Owner被释放时,其子对象会自动释放,无需手工。2、请google 函数atexit()3、
       TForm1.myProcedure(Sender: TObject);
       begin
       end;
       ============================   myb:=Tbutton.create(self);
       myb.OnClick = myProcedure;4、没有不同
      

  2.   

    1,create函数后面的参数是要给创建的控件指定一个所有者,parentclass,具体到某个单元这个参数可以设置的值有application,self,窗体的某个实例-譬如Form1,指定的参数不同;控件释放的位置和时间也就不同;application代表在整个程序结束时释放控件指针,在单元只有一个实例时self和Form1的效果可以等同2,设计阶段生成的控件可以自己手动释放;如果没有手动释放则要等到其拥有者释放时,由拥有者负责释放;3,通过动态生成的按钮点击弹出对话框可以给动态生成的控件的onclick属性赋值;
    procedure TFrmMain.Myclick(sender: TObject);
    begin
      showmessage('test');
    end;...
    var Mybutton: TButton;
      Mybutton := TButton.create(self);
      mybutton.onclick := myclick;...4,静态生成的控件往往会在整个程序执行期间占用内存控件;而动态生成的控件则一般会在使用完毕后马上释放;两者区别就是生存周期不同;占用内存也就不同了;^_^