而且这样  TTest = class(*)任意一个类都不会报错。。怪怪。。

解决方案 »

  1.   

    好象是如果Class内部只定义了方法的话,不需构造也不会出错。
    但是如果定义了变量(比如FTest)而且变理类型是原子类型,在析构时会引起堆错误。如果定义了String类型的话。因为没有调用构造函数。所以会报错。说不明白。想不明白。高手指点?
      

  2.   

    如果将a定义为全局变量,就会出错。
    如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。
    为什么?
    有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?
    是Delphi在编译器上作的手脚或是在Vcl上做的手脚?
      

  3.   

    如果将a定义为全局变量,就会出错。
    如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。
    为什么?
    有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?
    是Delphi在编译器上作的手脚或是在Vcl上做的手脚?
      

  4.   

    a的RTTI和所在Form类的RTTI的指针地址一样。
     showmessage(Format('1:%p  2:%p',[ self.classinfo, a.ClassInfo ]));
      

  5.   

    black_fox(black_fox) :
    a的RTTI和所在Form类的RTTI的指针地址一样。
     showmessage(Format('1:%p  2:%p',[ self.classinfo, a.ClassInfo ]));以上语句有问题,地址不相同!
      

  6.   

    我的没问题啊。是相同的
    type
      TTest = class(Tobject)
      private
        Fmsg:integer;
        Ftest:string;
      public
        function msg():boolean;
        constructor Create;virtual;
        destructor Destroy;override;
      end;
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    implementationuses unit2;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    var
    a:ttest;
    begin
    //       a:=ttest.Create ;
            a.msg ;
            showmessage( a.ClassName    ); showmessage(Format('1:%p  2:%p',[ self.classinfo, a.ClassInfo ]));
      //      a.Free ;end;{ TTest }
    constructor TTest.Create;
    begin
     showmessage('Create');
    end;destructor TTest.Destroy;
    begin
     showmessage('Destroy');
    end;function TTest.msg: boolean;
    begin
            Fmsg:=1;
            Ftest:='ad';
            showmessage(ftest);
    end;end.