• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API

一个关于对象模型的问题

snowfog 2002-05-24 01:20:48
TTest=class
private
FTest:Integer;
public
procedure Test;
end;

procedure TTest.Test;
begin
FTest:=1;
ShowMessage(IntToStr(FTest));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a:TTest;
begin
a.Test;//这里不会出错,为什么?
end;
...全文
44 点赞 收藏 11
写回复
11 条回复
black_fox 2002年05月24日
我的没问题啊。是相同的
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;


implementation

uses 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.
回复 点赞
snowfog 2002年05月24日
black_fox(black_fox) :
a的RTTI和所在Form类的RTTI的指针地址一样。
showmessage(Format('1:%p 2:%p',[ self.classinfo, a.ClassInfo ]));

以上语句有问题,地址不相同!
回复 点赞
black_fox 2002年05月24日
a的RTTI和所在Form类的RTTI的指针地址一样。
showmessage(Format('1:%p 2:%p',[ self.classinfo, a.ClassInfo ]));
回复 点赞
amiao 2002年05月24日
关注中...
回复 点赞
snowfog 2002年05月24日
如果将a定义为全局变量,就会出错。
如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。
为什么?
有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?
是Delphi在编译器上作的手脚或是在Vcl上做的手脚?
回复 点赞
snowfog 2002年05月24日
如果将a定义为全局变量,就会出错。
如果将a定义为窗体类的成员变量,与定义为局部变量的结果一样。
为什么?
有很多书上说Delphi是在堆上创建对象(调用构造方法),但不调用构造方法的局部或类成员是不是在栈上创建对象?
是Delphi在编译器上作的手脚或是在Vcl上做的手脚?
回复 点赞
black_fox 2002年05月24日
好象是如果Class内部只定义了方法的话,不需构造也不会出错。
但是如果定义了变量(比如FTest)而且变理类型是原子类型,在析构时会引起堆错误。

如果定义了String类型的话。因为没有调用构造函数。所以会报错。

说不明白。想不明白。高手指点?



回复 点赞
black_fox 2002年05月24日
而且这样 TTest = class(*)任意一个类都不会报错。。怪怪。。
回复 点赞
black_fox 2002年05月24日
的解如此。。而且没有调用析构和构造函数
回复 点赞
rwdx 2002年05月24日
a 是什么东西?
回复 点赞
netlib 2002年05月24日
关注
回复 点赞
发动态
发帖子
Delphi
创建于2007-08-02

1469

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告