unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
 Tkk=class(Tobject)
 procedure kill(a,b:integer);
 end;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  kk:Tkk;implementation{$R *.dfm}
procedure Tkk.kill(a,b:integer);
var
sum:integer;
begin
sum:=a+b;
showmessage(format('the sum is %d',[sum]));
end;procedure TForm1.Button1Click(Sender: TObject);
begin
kk.Create;
kk.kill(2,3);
end;end.
在上面的程序中我创建了一个类,Tkk
申明了一个类的变量:kk
我知道对象要创建需要kk:=Tkk.create;
但是我发现在没创建对象之前kk本身就有Create方法。
于是上面的 程序中我用kk.create;可以编译,但是有错误
我不明白kk.create代表什么?和kk:=Tkk.create有什么区别

解决方案 »

  1.   

    你跟蹤一下程式的運行,你會發現Create是祖先的方法.這是個繼承的問題,你還可以試試destroy也是可用的.
      

  2.   

    个人看法!
    kk.create代表由对象创建一个对象?而kk:=Tkk.create是由类创建一个对象
      

  3.   

    kk是Tkk类的一个对象名,
    kk.create表示调用这个对象的构造函数,
    Tkk的create是继承的TObject的,
    没创建对象kk时就调用kk.create,内存里找
    不到地址,编译当然就会出错了。
      

  4.   

    首先给搂主一个建议,编程的格式最好采用退格方式,这样比较明了。
    kk.create这个方法是你继承tobject这个基本类的方法,但是这个方法需要一个参数
    kk.create(nil)就没问题了。
    我记得看过一本书中介绍过这两个得最基本区别
    kk.create(nil)和kk:=Tkk.create
    前者创建后需要手动调用kk.destory才能释放,后者会在程序超过kk的作用域时自动调用析构函数释放所占用的控件。
    具体的记不太清了,好像是上面的说法,但是有一个是肯定的,就是最好使用kk:=Tkk.create,然后再作用域结束的时候手动释放变量。