如何生成一个类的多个实例 ( 积分: 50 )

  • 主题发起人 主题发起人 匪匪
  • 开始时间 开始时间

匪匪

Unregistered / Unconfirmed
GUEST, unregistred user!
Ttest = class
public
name: string[20];
end;

tform1 = class(tform)
.......
public
jtest : Ttest;
end;

procedure tform1.click(sender: tobject)
begin
jtest:= Ttest.Create;
end;
我想在form1.click事件中,每次运行时,生成不同的jtest实例,即jtest的引用地址是不一样的。怎么办?
 
Ttest = class
public
name: string[20];
end;

tform1 = class(tform)
.......
public
jtest : Ttest;
end;

procedure tform1.click(sender: tobject)
begin
jtest:= Ttest.Create;
end;
我想在form1.click事件中,每次运行时,生成不同的jtest实例,即jtest的引用地址是不一样的。怎么办?
 
我的要求是都是用jtest变量,而不是用另外的名字如jtest1 := Ttest.Create或jtest2 := Ttest.Create
 
你这样写本来就是不同的,每点一次都会create一次Ttest,而原来的jtest因为没有释放会造成内存泄露.

你可以把jtest定义成局部变量
procedure tform1.click(sender: tobject)
var
jtest : Ttest;
begin
jtest:= Ttest.Create;
try
//......
finally
jtest.free;
end;
end;
也可以用对象数组
 
可我的要求是,把这些类实例保存下来后,我在别的单元中还要引用,也就是onclick事件执行完后,我还要用的。我如果声明成onclick中的局部变量,并释放后,我以后引用时,全是无效的引用了。请再帮我想下好吗?
 
如楼上所说。
 
我会保存在一个Tlist中。但前提是怎么创建,而且以后还是有效的
 
只能用对象数组,保存每次产生的对象
注意程序退出时别忘了释放创建的对象
因为Delphi的对象都是在堆上创建,不能自释放
 
用个TList保存一下就可以了:
tform1 = class(tform)
.......
public
jtestlist : TList;
end;
...

procedure tform1.click(sender: tobject)
var jtest : Ttest;
begin
jtest:= Ttest.Create;
jtestlist.add(pointer(jtest));
end;



 
ListObject := Tlist.Create;

jtest:= Ttest.Create;
ListObject.Add(Pointer(jtest));
 
to TYZhang:
procedure tform1.click(sender: tobject)
var jtest : Ttest;
begin
jtest:= Ttest.Create;
jtestlist.add(pointer(jtest));
end;
中jtest声明成局部变量,当离开该函数后,引用全是无效的,我试过。
我现在想知道怎么生成多个实例,且是有效的。关于TList怎么保存与失放,这我都知道的。大家都想下啊。
 
那就不要引用jtest,使用jtestlist变量不就行了吗:
ttest(jtestlist[0]).name...
 
to TYZhang:
可是我要先取得实例的地址啊。
然后再放入list中去。而且要求每一个生成的都是不同的引用。
 
这不就是取实例地址放到list中的吗:
procedure tform1.click(sender: tobject)
var jtest : Ttest;
begin
jtest:= Ttest.Create;
jtestlist.add(pointer(jtest));
end;
 
to TYZhang:
但你声明成局部变量了,你试试。,这样离开该函数后,引用就是很乱的内容了。
 
你不要释放这个局部变量。即只要jtest:= Ttest.Create;不要jtest.free;
 
你这样试试
procedure tform1.onclick(sender: tobject)
var
jtest: tJtest;
begin
jtest := tJtest.create;
jtest.name := tbutton(sender).caption;
list.add(pointer(jtest));
end;
当你从list中取出地址。再取其name时,就不是以前的内容了,全是乱码
 
这样写本来就是不同的了,你用TList把Form对象装进去,引用的时候这样:
假设保存在tmpList中:

TForm(tmpList).jtest就可以了

还是再看看面向对象吧
 
to cdmwz:
我现在想创建不同的实例,而且就是在onclick那个事件中。你说该怎么办?能写下你的代码吗?
 
我创建的对象不能是局部的。在整个程序生存期我都要引用的。除非在我的条件下才失放。
现在我只想知道,怎么创建不同的对象实例。
 
后退
顶部