还有派生类析构的时候基类的DESTRUCTOR是不是会被自动调用?
调用的是哪一个?类似的CONSTRUCTOR是怎么调用的?

解决方案 »

  1.   

    1、应该是指向同一对象,如果要复制,使用Assign方法
    2、使用TMyClass.Destory,如果TMyClass没有实现Destory,则上朔父类,直到TObject,则一定会实现,在Delphi中TObject是所有类的父类。
    3、Application释放罢?
    4、不清楚
    5、是,相反的次序
    6、Parent和Owner是两种概念
      Label[i] := TLable.Create(Form1); 只是指定了OwnerSender,Self,Owner,parent 
    -----------------------------------------------------
    Sender--意义:指本对象。Sender在什么对象相关代码里,那么Sender就是什么。
    Self--意义:指本类,也就是Self被引用的类。比如若在类TMyClass内引用了Self,那么Self=TMyClass.
    Owner--意义:哪个对象释放我的内存啊?如:Pan:=TPanel.Create(Self);其中Create的参数是:AOwner:TComponent。Owner释放Pan的内存。因为窗口释放Pan的内存,但窗口类的对象是Self.一般给Owner传Self就可以。
    比如:
    代码段一:
    pan:=TPanel.Create(Self);
    with Pan do begin
    try
    Left:=20;
    Top:=20;
    parent:=Self; //Parent:=Form1也可以。
    Visible:=true;
    ShowMessage('Created');
    finally
    Pan.free;
    end;
    end;
    -----------------------------------------------------
    Parent--
    意义:此对象包括在哪个对象里那?
    说明:若组件不是从TControl继承来的,那么在创建组件后不必声明此属性。
      

  2.   

    1: A和B指向同一对象
    2: 用TMyClass的
    3: 异常由delphi自己管理,不用释放,delphi会自动从里到外
    处理所有的异常
    5: 不是!而是按创建的次序
     Application.CreateForm(TForm1, Form1);
    退出时基本按后建先释放的原则
    Parent是指明这个控件放在哪个控件的里面
    比如一个Button的Parent为一Panel
    则Buton只能在Panel里活动,不能移出Panel
    而Owner是指对象由谁创建的!
    Form1定会释放Label,只是你可能没有真正释放Form1
      

  3.   

    1、同一个,两个都可以使用,相当于指针。如果用Assign(或者AssignTo),则是两个。
    2、用Destroy。
    3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。
    6、Parent用于控件布局。它的Left等等都是相对于Parent的。—————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
    I.Desire := '加不加分随你';
    —————————————————————————————————
        
      

  4.   

    1、同一个,两个都可以使用,相当于指针。如果用Assign(或者AssignTo),则是两个。
    2、用Destroy。
    3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。
    6、Parent用于控件布局。它的Left等等都是相对于Parent的。—————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
    I.Desire := '加不加分随你';
    —————————————————————————————————
        
      

  5.   

    是自动调用
    如果你加了inherite的话

    DESTRUCTOR中

    ....先处理自己
    再调用父类的DESTRUCTOR在CONSTRUCTOR中
    先调用
    父类的CONSTRUCTOR
    再初始化自己
      

  6.   

    1、同一个,两个都可以使用,相当于指针。如果用Assign(或者AssignTo),则是两个。
    2、用Destroy。
    3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。
    4、一个是实例模式,一个是线程类型
    5、我认为都是按照dpr定义的次序来。
    6、Parent用于控件布局。它的Left等等都是相对于Parent的。Owner是负责内存管理的。—————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
    I.Desire := '加不加分随你';
    —————————————————————————————————
        
      

  7.   

    1: 同一对象
    2: 可以自己释放TMyClass.free;
    3: 异常自动的,你不用管
    4:
    5: 按创建的次序,form1再form2... 
    6:Parent是指明父级(上级):label属于panel属于form
    (在form上放panel,在panel上放label)
      

  8.   

    关于DESTRUCTOR和CONSTRUCTOR我是问如果自动调用
    会调用基类里的哪个CONSTRUCTOR,参数是怎么传的?比如Base = class
      constructor A(s:string);
      constructor A(i:integer);
      constructor A(b:boolean);
      constructor A(s:short);
      constructor B;
    end;被自动调用的会是哪个?
      

  9.   

    1:对象、接口都是引用,Record不是。B和A结果成了一个对象,原来的B就丢了,直到进程结束才会释放它的内存。
    2:
      B.Destroy;//调用TMyClass的。
      B.Free;//如果TMyClass的Destroy声明成override,调用它的,否则调用TApplication的。
    3:异常被截获到后就自动释放。
    4:
      Instancing:
        Single Instance:一个对象起动一个进程,对进程外组件(EXE)有效。
        Multiple Instance:所有对象用一个进程,对进程外组件有效。
        Internal:不允许其它程序直接创建它。
      Threading Model:
        Single:所有对象在一个线程内运行。最安全,效率最低。
        Apartment:每个对象在一个线程内运行。成员变量安全。最常用。 
        Free:对象在调用线程内运行。效率最高,不安全适用于无状态对象。
        Both:对象可以是Apartment或Free,由创建都决定。
        进程外组件只能是Apartment或Free,并且一个程序中的所有对象都相同。只要你编写对象时有一个是Free或Both类型的,就都是Free模式。
    5:初始化按顺序,退出时相反。
    6:TComponent.Create(AOwner:TComponent)中的AOwner表明在AOwner被释放时,该对象会被自动释放。TControl.Parent属性是指它的父控件(容器控件)。
    如在Form上放一个Panel,在Panel上放一个Edit,则Panel的Owner和Parent都是Form,Edit的Owner是Form,而Parent是Panel.    
      

  10.   

    Base = class
      constructor A(s:string);
    0A  constructor A(i:integer);
      constructor A(b:boolean);
      constructor A(s:short);
    0A  constructor B;
    end;
    上面表示多态函数,根据调用参数的类型自动选择。—————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
    I.Desire := '加不加分随你';
    —————————————————————————————————
        
      

  11.   

    Constructor可以有多个,名字或参数不同,根据你创建时使用哪个而决定调用哪个。
    如果你的基类有多个constructor,调用哪个是由子类的constroctor决定的:
    TA=class
      public
        constructor Create;
        constructor CreateMe(a,b:Integer);
      end;
    TB = class(TA)
      public
       constructor Create;
      end;constructor TB.Create;
    begin
      inherited;调用TA.Create;
      或inherited Create;调用TA.Create;
      或inherited CreateMe(1,2);调用TA.CreateMe;
      或不写inherited;不调用TA的constroctor
    end;
    destructor一定要起名为Destroy,并且是override的,这样才会被TObject.Free调用。在destructor的代码中一定要写inherited,否则可能会导致内存泄露,甚至出现内存访问错。
      

  12.   

    我本来以为我还明白一点东西,经几位大哥一指点我更糊涂了debussy(debussy) :
    SELF到底是什么?
    Self--意义:指本类
    那就是说通过SELF只能调用STATIC过程了?
    pan:=TPanel.Create(Self);
    给CREATE的是什么?是对类的引用,还是一个对象(别告诉我是元类的对象)
    在OBJECT PASCAL里怎么用对类的引用,变量怎么声明?zhangpeigao(东部一绝):
    2: 可以自己释放TMyClass.free;
    这是什么意思?把一个类给free了?综合上面两位的意思,是不是说在OBJECT PASCAL里和SMALLTALK一样
    类是元类的对象?这样DELPHI也忒猛了,好象现在实用的语言里只有
    OBJECT PASCAL能做到这么高的抽象对于异常对象,怎么有人说要释放,有人说不释放
    如果是系统释放,那么什么时候释放?
      

  13.   

    比如对于
    MyObject :TMyClass;procedure  MyObject.XXXXX();
    begin   Self.YYY;//就是调用TMyClass.YYY方法,Self就是自己嘛,要看当前作用范围,上句等同于 MyObject.YYY.end;你在看这句
    pan:=TPanel.Create(Self);
    通常这句所处的作用域例如为
    procedure TForm1.Button1Click(Sender);
    begin
    ...
    pan:=TPanel.Create(Self);
    ...
    end;
    这里的Self就表示TForm1啦,这句话的意思是pan的Owner是TForm1不是TPanel.类不能释放,只有对象可以释放,上面的可能是笔误