self就是你procedure TForm1.Button1Click(Sender: TObject)中的sender
:tform1

解决方案 »

  1.   

    A:变量可以被他的子类实例化,反之不可以;implementation 部分定义的变量不可以被其他的UNIT使用,interface部分可以B:self相当于this,可以理解为输出该方法的对象实例的指针,本例中为;AOwner是所有者,
    to  delphi0302(dr) :
    该例中sender是Button1,self是form1,Tform1是类而不是对象
      

  2.   

    A:变量可以被他的子类实例化,反之不可以;implementation 部分定义的变量不可以被其他的UNIT使用,interface部分可以B:self相当于this,可以理解为输出该方法的对象实例的指针,本例中为form1;AOwner是所有者,
    to  delphi0302(dr) :
    该例中sender是Button1,self是form1,Tform1是类而不是对象
      

  3.   

    A:
    如果从TForm类创建实例,是系统默认的窗体对象,因此不是你需要的,而利用TForm1(你自己创建的)创建实例,则属性都与TForm1一样;
    B:
    AOwner其实就是你创建的实例的对应类,Self是个隐含的指针,指向实例对应的类
    你可以看一下Delphi的Oop思想!
      

  4.   


    var
      Form1: TForm1;
      Temp: TForm;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      Temp := TForm.Create(Button1);  // 这段代码可以用, 但是那个按钮用不起
      ShowMessage (Temp.Owner.Name);  // 这个 owner 好像不起任何作用,看起来好像是某种多态性
      Temp.Color := Form1.Color;
      Temp.Left := 200;
      Temp.Top := 100;
      Temp.Destroy;
    end;end.我知道如果一个窗体上有一个按钮, 那么按钮的Owner 就是 那个窗体, 但是对于这种Create 的Owner 确实抓不过弯了
      

  5.   

    self 可以换成nil和Application.在这种情况下最好不用nil因为这样不利于资源管理。
    self :是一个指针变量,相当于C++中的this,指向创建它的类,如你的例子中都指向TForm1,因为你就是在Tform1一中创建的,上面的TButton当然行是不对只能反过来,创建Button时指向Tform1。采用self时当form1关闭Temp的资源也会随之释放
      

  6.   

    owner是负责销毁你创建的类
    即若某类的owner被销毁了,则该类也被销毁
    不知我表达清楚了吗:)
      

  7.   

    to yanyading (退休的Turbo Basic 编译器) 感觉你还是没有搞清楚Owner和Parent的区别
    很多类实例化时要求指定一个Owner,Owner是负责被创建的实例的自动创建和销毁的,特别是销毁(当Owner销毁时,它会要求所有“属于”它的对象销毁,最后销毁自己),一般来说可以用Application(表示整个应用程序),当前窗体(在你的例子里就是Self,等价于Form1),nil(这个时候你自己记得销毁它!!)
    Parent是负责显示组件的,类似于“容器”的概念,当一个Parent刷新时他会负责其上(或叫其内--视觉上的)的组件的相关动作,因此你直观上看到的A控件在B控件上,则B控件是A控件的Parent,但不一定是Owner!!
      

  8.   

    我觉得你的说有些不对self是一类指针变量,不是一个实例变量,parent是一个实例变量,两者的性质是不同的
      

  9.   

    问题解答:
    问题‘A’:如果这段写成 Temp := TForm.Create(Self); 那么出现的窗体是一个在左上角冒出来的,大概300X250大小的,为什么呢?,但是如果成为Temp := TForm1.Create(Self);那么出现的窗体是一个和Form1一模一样的窗体(显然这是一种继承)。首先,这不是一种继承!!!继承只能用于描述类和类之间的关系。这是一个实例化过程。
    你的TForm1是从TForm继承来的,也就是说你TForm是TForm1的父类,所有的父类指针是可以指向其子类的对象(请注意:对象是实例化的类)
    所以你的Temp := TForm1.Create(self)是可以编译通过的(这样就不行啦:Form1 := TForm.Create(self),因为子类的指针是不是能访问父类的对象的)
    这一过程的实现时这么一个过程:首先,TForm1.Create(..)实例化了一个TForm1的类对象,所以该实例化的对象和From1的形式是一模一样的。但是你将不能使用Temp来访问在TForm1中新增的方法和属性,因为在TForm类型的指针结构中不包含这些行增的东东。
    如:Temp:TForm
    Temp := TForm1.Create(nil)
    如果实现的 proceduer TForm1.NewFun
    是不可以使用:Temp.NewFun所以Temp := TForm.create(self)
    和Temp := TForm1.Create(self)
    是指用temp引用一实例化的类---对象。
      

  10.   

    问题‘B’:在括号里面的是应该输入 AOwner: TCompounts,我随便写了一个Self,如何理解这个AOwner呢?我的理解是...(事实上我还没有理解呢)...在Create(AOwner:TComponent)参数,如果你看过Vcl的实现,你会知道,在每次Create一个对象的时候,就会把该对象的self指针传给AOwner,这个指针将保持在AOwner的Controls指针数组当中,当AOwner指定的对象被释放时,他首先会释放Controls中所有对象,这就实现了内存自动管理。如果你在Create(nil),那么这个对象你将自己手工管理。
    Parent属性,该属性是用来指定该控件的父窗体,如TButton这样的类,他们是必须显示在某个窗体之上的,具体是哪一个窗体,就使用Parent属性来指定。
    但是你注意到:在你的Form这样的类对象是可以不指定Parent的。因为他不一定依靠其他的窗体来显示自己(不过对于MDI的机制我不了解)。
    所以AOwner只是一种内存管理策略。