我本来想用
if(Assigned(对象) )then
..
else
对象 := 对象类.create();这样的代码来判断,但是实际运行发现时不行的.如何对象时声明为全局变量是可行的,但如何是局部变量或者是类里的某个变量,Assigned(对象) 返回结果都是true.我的目的是希望是真正使用对象的时候才创建,而不是创建实例的时候就把需要的各种对象都创建好了.但是有无法判断?
if(Assigned(对象) )then
..
else
对象 := 对象类.create();这样的代码来判断,但是实际运行发现时不行的.如何对象时声明为全局变量是可行的,但如何是局部变量或者是类里的某个变量,Assigned(对象) 返回结果都是true.我的目的是希望是真正使用对象的时候才创建,而不是创建实例的时候就把需要的各种对象都创建好了.但是有无法判断?
---------------------------------------------------
既然是局部变量,你就应该知道又没有Create,又何必判断。
finally
free;
我是希望在创建类的时候,不想把类的变量都初始化,因为某些变量可能用不上.
所以才有所一问.
private
FboolCreate : Boolean;
反正你是动态创建
你创建的时候设为True,Free时再改为False
但是这样还是不能达到我像要的目的.
我写个例子:TMyObj = class
private
list1,list2,list3:TList;
public
constructor Create();
procedure getList1();
procedure getList2();
procedure getList3();
end; procedure TMyObj.create;
begin
//在这里初始化三个变量
list1 := TList.create;
list2 := TList.create;
list3 := TList.create;
end;
procedure TMyObj.getList1();
begin
//在这里对list1进行操作
end;procedure TMyObj.getList2();
begin
//在这里对list2进行操作
end;procedure TMyObj.getList3();
begin
//在这里对list3进行操作
end;
外面的代码调用类TMyObj
var
obj : TMyObj;
begin
obj := TMyObj.create;
obj.getList1();
obj.free;
end;在上面的调用中我只调用了getList1();然后就将对象释放的了,
但是在TMyObj的Create中,已经初始化了list1,list2,list3三个对象.有两个其实是用不上的,
所以我希望能构改成Create方法中不进行初始化,而是在getList1()等方法里进行判断.
我原设计的判断方法就是在getList1中加入以下代码:
if(not Assigned(list1) )then
begin
list1 := TList.create();
end;
但是Assigned(list1) 一直都是为true的,但实际list1并没有初始化.对它进行操作就会出错.
public
destructor Destroy; procedure TMyObj.Destroy
begin
list1.Free;
list2.Free;
list2.Free;
end;
destructor Destroy; override;procedure TMyObj.Destroy
begin
list1.Free;
list2.Free;
list2.Free;
inherited Destroy;
end;
list2 := TList.create;
list3 := TList.create;
---------------------
这些如果没有在其它地方用到的话,没有必要写在Create中,可以改成局部变量
procedure TMyObj.getList1();
var
list1:TList;
begin
list1 := TList.create;
try
//在这里对list1进行操作
finally
list1.Free;
end;
end;
if not assigned(frmcraft) then
begin
frmcraft := Tfrmcraft.Create(self);
frmcraft.Show;
end;
end;
也试了?
这几个对象事类里别的方法也需要用的,不能作为局部变量.我的例子只是临时写出来说明一下
问题的,真实的要复杂得多.至于最后得释放方法.也只能象你写得那样.但是如何能够判断得话. 释放资源出也需要增加判断得.procedure TMyObj.Destroy
begin
if(Assigned(list1) )then
begin
list1.free
end;
...
...
inherited Destroy;
end;to: ssk0532(阳光地带) 仔细看一下我得例子,已经是这么判断了,就是应为不行,我才再这里问的
procedure TMyObj.create;
begin
//在这里初始化三个变量
list1 := nil
list2 := nil;
list3 := nil;
end;且在每一处做List1.Free后都加上List1:=nil
这样Assigned(List1)就可以为真了。
------------------------------------------------不需要判断,因为你在TMyObj.Create中已经Create了
list1 := TList.create;
list2 := TList.create;
list3 := TList.create;
调用的方法里面进行create.
就是先有
if(not Assigned(list1) )then
begin
list1 := TList.create();
end;
才有
if(Assigned(list1) )then
begin
list1.free
end;
to: xhg0418(新手)
我也知道先设一下list1 := nil;
然后Assigned(list1) 就可以了.但是这种做法有点愣来了.我只希望能够有标准的方法
来进行判断.如果实在不行.我也不强求了.
if(not Assigned(list1) )then
begin
list1 := TList.create();
end;在这个类中list1是全局变量,如果这个类实现的功能比较复杂,就没有必要。TList类型的我没有用过,但是TFileStream用过Assigned
调用时初始化.不会都一样处理的.不过这个思路既然实现不了,就不管它了.还是老老实实写代码吧.hehe.谢谢楼上各位了! 特别时谢谢Dlwxn(流云) 的全程支持!
调用时初始化.不会都一样处理的.不过这个思路既然实现不了,就不管它了.还是老老实实写代码吧.hehe.谢谢楼上各位了! 特别时谢谢Dlwxn(流云) 的全程支持!