一个关于对象模型的问题 而且这样 TTest = class(*)任意一个类都不会报错。。怪怪。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 好象是如果Class内部只定义了方法的话,不需构造也不会出错。但是如果定义了变量(比如FTest)而且变理类型是原子类型,在析构时会引起堆错误。如果定义了String类型的话。因为没有调用构造函数。所以会报错。说不明白。想不明白。高手指点? 如果将a定义为全局变量,就会出错。如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。为什么?有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?是Delphi在编译器上作的手脚或是在Vcl上做的手脚? 如果将a定义为全局变量,就会出错。如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。为什么?有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?是Delphi在编译器上作的手脚或是在Vcl上做的手脚? a的RTTI和所在Form类的RTTI的指针地址一样。 showmessage(Format('1:%p 2:%p',[ self.classinfo, a.ClassInfo ])); black_fox(black_fox) :a的RTTI和所在Form类的RTTI的指针地址一样。 showmessage(Format('1:%p 2:%p',[ self.classinfo, a.ClassInfo ]));以上语句有问题,地址不相同! 我的没问题啊。是相同的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);vara: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. 各位,再问一个模拟键盘的问题。 获取系统分配端口输入输出范围 帮看看 为什么我用的delphi的 demo中maildemo不能发邮件但能收邮件,是何原因 如何实现工程最小化后,将工程的图标加到系统任务栏的托盘上面! 新建delphi群,欢迎加入! 数据表备份问题 安装这样一个控件,为什么不成功? toolbar97 for Delphi5的控件,急!!!!!!!!!!!!! 共享软件如何收取注册费?哪种方式好? 怎样中止死循环? 去掉共享!!
但是如果定义了变量(比如FTest)而且变理类型是原子类型,在析构时会引起堆错误。如果定义了String类型的话。因为没有调用构造函数。所以会报错。说不明白。想不明白。高手指点?
如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。
为什么?
有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?
是Delphi在编译器上作的手脚或是在Vcl上做的手脚?
如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。
为什么?
有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?
是Delphi在编译器上作的手脚或是在Vcl上做的手脚?
showmessage(Format('1:%p 2:%p',[ self.classinfo, a.ClassInfo ]));
a的RTTI和所在Form类的RTTI的指针地址一样。
showmessage(Format('1:%p 2:%p',[ self.classinfo, a.ClassInfo ]));以上语句有问题,地址不相同!
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.