delphi中的类都是动态类,它是一个指针!

解决方案 »

  1.   

    Myclass1是对象类TMyclass的一个实例变量(instance)
    实际上是一个指向该类对象的指针
    所以必须由类初始化create之类的构造函数来创建实例!!!!
      

  2.   

    (1)myclass1:=myclass.create(self)
    (2)不是,用法和一样控件
      

  3.   

    还有第二个问题
    你的写法好象是C++的
    用法和指针基本一致,象我刚才说的,
    它本身是一种特殊指针
    释放时调用FREE即可
      

  4.   


    我想你是不理解 類 與 實例 的區別﹖ 在這﹐我就不解釋。myclass 是個類﹐而 myclass1 則是這個類的實例.
      

  5.   

    应该养成Free掉以后再MyClass1 := nil;的习惯
      

  6.   

    用不着,
    直接freeandnil(object)即可
    但只有DELPHI5及以上有这个函数
      

  7.   

    看看这个:procedure TForm1.Button1Click(Sender: TObject);
    var
      x:TButton;
    begin
      x.NewInstance;
      x.Name := 'Why';
      x.Left:=0;
      x.top:=0;
      x.Parent:=Self;
      x.Visible:=true;
    end;
      

  8.   

    to WilliamGui(寒锋): 
      类与类的实例我当然分得清楚,请看清我的问题。
    to TechnoFantasy(www.applevb.com) :
      什么意思?
      

  9.   

    要彻底的释放对象可以使用FreeAndNil();如:
    myclass1:=myclass.create;
    //........
    FreeAndNil(myclass1);
    以下转贴自http://www.csdn.net/develop/article/10/10404.shtm对象是类的一个动态的实例。这个动态实例包含了该类及其祖先类的所有字段。对象还包含一个隐含的字段用来保存对象所属类的一个类引用。对象总是从堆中分配到内存,因此对象引用实际上是指向该对象的一个指针。程序设计人员负有在合适的时间创建和释放对象的责任。为了创建一个对象,我们使用类引用并调用构造器方法,如下例所示:Obj := TSomeClass.Create;
    大多数的构造器命名为Create,但这只是一个约定,并不是Delphi所一定要求的。有时你会发现其他名称的构造器,特别是在Delphi还不支持方法的重载之前定义的一些陈旧的类。为了最大限度的与C++Builder保持兼容(因为C++Builder不允许自定义构造器名称),最好仍旧使用Create,重载原先的构造器方法。
      

  10.   

    使用FreeAndNil要先uses Sysutils
      

  11.   

    不用
    哪一个UNIT不是自己加上的sysutils???
      

  12.   

    "彻底的释放对象"与一般的释放有什么区别?不能直接调用基类的FREE吗?
      

  13.   

    Free只是将一个对象释放掉,但是没有将指针清空(设为nil)。看下面的代码:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      x:TButton;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);begin
      x:=TButton.Create(self);
      x.parent:=self;
      x.free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if assigned(x) then
        x.caption:='Error';
    end;end.在点击button1建立对象并释放后点击Button2会出现错误,这是因为对象free后没有设定
    未nil 使用FreeAndNil函数可以避免上面的问题。
      

  14.   

    我来回答:
      1、这样写可以,但没什么实际用处,你创建了myclass1,但并未将它赋给一个变量实例,
     所以你失去了对对象的控制。如果这样写还说的过去:with myclass1.create do 最起码你有机会去处理你创建出来的对象。
      2、声明myclass1:myclass并未分配内存,Create后才分配内存,在Delphi中对象就是一个指针,只不过编译器为你做了好多事,使得我们并不象处理指针那样去处理它,释放时需调用对象自己的free才可以。 
      
      

  15.   

    补充一句:用MyClass1.Create在逻辑上也有问题,因为在一个对象没有被Create之前,任何对其成员函数或变量的引用都视为非法
      

  16.   

    myclass=class(tobject)
    ……var
    myclass1:myclass;<---myclass1其实是指针implemtion:
      
      myclass1:=myclass.create;<--初始化myclass的对象myclass1,并取得其地址。
      

  17.   

    如果你有机会看 坚果系列 中的Delphi技术手册就可以比较明白,其中有代码模拟说明了在调用
    对象的构造函数时Delphi会做什么工作。在这里我就不敲了,比较长。
      

  18.   

    书店有,最显著的标识就是每本书封面都比较素,上面有一个动物。 该系列是
    O'Reilly出版社出版,中国电力出版社引进的。
      

  19.   

    "引用当作对象"?引用只不过是指针的高级形式,而对象是一旦声明,就分配了对象实际占用的内存,而声明一个指针,只不过有4个byte的指针域而已。
      

  20.   

    类就是一个对象!tMyClass=Class of TClass和tMyClass=Class(TClass)一样,意思是:
    tMyClass引用TClass这个类,并且继承TClass类中所有的属性和方法。“引用”只是OOP引入的一个概念,对于CPU来说是没有意义的。而实际上,
    tMyClass:=TClass.Create的执行过程是:(以下语句部分地引用自李维的文章)
        用TClass对应的VMT(虚拟方法表)为依据,调用TClass的
    Create构造函数。而在Create构造函数调用了系统的ClassCreate过程,系统
    的ClassCreate过程又通过存储在类VMT调用NewInstance虚方法。调用
    NewInstance方法的目的是要建立对象的实例空间,因为我们没有重载该方法,
    所以,它就是TClass类的NewInstance。TClass类的NewInstance方法将根据
    编译器在VMT表中初始化的对象实例尺寸(InstanceSize),调用GetMem过程
    为该对象分配内存,然后调用InitInstance方法将分配的空间初始化。
    InitInstance方法首先将对象空间的头4个字节初始化为指向对象类对应VMT的
                                             ^^^^^^^^^^^^^^^^^^^^^^^
    指针,然后将其余的空间清零。建立对象实例之后,还调用了一个虚方法
    ^^^^
    AfterConstruction。最后,将对象实例数据的地址指针保存到tMyClass变量
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    中,这样,tMyClass对象就诞生了。
    ^^所以简单地说,tMyClass是一个继承自TClass的实例(OOP说法),也即是指向
    对象类对就VMT的指针。
      

  21.   

    类就是一个对象!tMyClass=Class of TClass和tMyClass=Class(TClass)一样,意思是:
    tMyClass引用TClass这个类,并且继承TClass类中所有的属性和方法。“引用”只是OOP引入的一个概念,对于CPU来说是没有意义的。而实际上,
    tMyClass:=TClass.Create的执行过程是:(以下语句部分地引用自李维的文章)
        用TClass对应的VMT(虚拟方法表)为依据,调用TClass的
    Create构造函数。而在Create构造函数调用了系统的ClassCreate过程,系统
    的ClassCreate过程又通过存储在类VMT调用NewInstance虚方法。调用
    NewInstance方法的目的是要建立对象的实例空间,因为我们没有重载该方法,
    所以,它就是TClass类的NewInstance。TClass类的NewInstance方法将根据
    编译器在VMT表中初始化的对象实例尺寸(InstanceSize),调用GetMem过程
    为该对象分配内存,然后调用InitInstance方法将分配的空间初始化。
    InitInstance方法首先将对象空间的头4个字节初始化为指向对象类对应VMT的
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    指针,然后将其余的空间清零。建立对象实例之后,还调用了一个虚方法
    ^^^^
    AfterConstruction。最后,将对象实例数据的地址指针保存到tMyClass变量
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    中,这样,tMyClass对象就诞生了。
    ^^所以简单地说,tMyClass是一个继承自TClass的实例(OOP说法),也即是指向
    对象类对应VMT的指针。 
      

  22.   

    呵呵,有意思,在DELPHI中,对象的使用就是通过引用的呀?
      

  23.   

    引用、继承、封装......等等都只是OOP引入的概念而矣。
    实际上,对象是指向某块内存空间的指针。
      

  24.   

    来个java+delphi的高手说说“类”这个东西吧
      

  25.   

    Delphi对象模型(Part II) (Musicwind翻译)    
    http://www.csdn.net/develop/article/10/10404.shtm