delphi中的类都是动态类,它是一个指针!
解决方案 »
- DELPHI非容器控件上画线
- 关于程序退出时出现Access violation at address 004E947D的错误提示问题.
- Delphi做了一个ActiveX控件,加载到IE后无法使用Ctrl+C
- 新加入D区,狂送100分,望关照!
- 请问FASTREPORT中的CHECKBOX对象怎么用?
- XML 转换成 ClientDataSet 用xmlTransform转后发现数据没了??是不是BUG?有兴趣你也试试!!
- 网络数据库问题! 急。。。
- 谁能提供国外DELPHI的论坛!
- 简单问题
- 到这个地方下载Delphi下的加密利器cipher控件(带源码)。
- 求知!
- BDE初始化时出错怎么办?120分征答。
实际上是一个指向该类对象的指针
所以必须由类初始化create之类的构造函数来创建实例!!!!
(2)不是,用法和一样控件
你的写法好象是C++的
用法和指针基本一致,象我刚才说的,
它本身是一种特殊指针
释放时调用FREE即可
我想你是不理解 類 與 實例 的區別﹖ 在這﹐我就不解釋。myclass 是個類﹐而 myclass1 則是這個類的實例.
直接freeandnil(object)即可
但只有DELPHI5及以上有这个函数
var
x:TButton;
begin
x.NewInstance;
x.Name := 'Why';
x.Left:=0;
x.top:=0;
x.Parent:=Self;
x.Visible:=true;
end;
类与类的实例我当然分得清楚,请看清我的问题。
to TechnoFantasy(www.applevb.com) :
什么意思?
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,重载原先的构造器方法。
哪一个UNIT不是自己加上的sysutils???
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函数可以避免上面的问题。
1、这样写可以,但没什么实际用处,你创建了myclass1,但并未将它赋给一个变量实例,
所以你失去了对对象的控制。如果这样写还说的过去:with myclass1.create do 最起码你有机会去处理你创建出来的对象。
2、声明myclass1:myclass并未分配内存,Create后才分配内存,在Delphi中对象就是一个指针,只不过编译器为你做了好多事,使得我们并不象处理指针那样去处理它,释放时需调用对象自己的free才可以。
……var
myclass1:myclass;<---myclass1其实是指针implemtion:
myclass1:=myclass.create;<--初始化myclass的对象myclass1,并取得其地址。
对象的构造函数时Delphi会做什么工作。在这里我就不敲了,比较长。
O'Reilly出版社出版,中国电力出版社引进的。
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的指针。
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的指针。
实际上,对象是指向某块内存空间的指针。
http://www.csdn.net/develop/article/10/10404.shtm