我本来想用
if(Assigned(对象) )then
  .. 
else 
 对象 := 对象类.create();这样的代码来判断,但是实际运行发现时不行的.如何对象时声明为全局变量是可行的,但如何是局部变量或者是类里的某个变量,Assigned(对象) 返回结果都是true.我的目的是希望是真正使用对象的时候才创建,而不是创建实例的时候就把需要的各种对象都创建好了.但是有无法判断?

解决方案 »

  1.   

    如何对象时声明为全局变量是可行的,但如何是局部变量或者是类里的某个变量,Assigned(对象) 返回结果都是true.
    ---------------------------------------------------
    既然是局部变量,你就应该知道又没有Create,又何必判断。
      

  2.   

    try 
    finally 
     free;
      

  3.   

    to:Dlwxn(流云)我其实主要是为了判断类里的某个变量,局部变量只是为了说明判断不了而已.
    我是希望在创建类的时候,不想把类的变量都初始化,因为某些变量可能用不上.
    所以才有所一问.
      

  4.   

    给你所说的类变量设置一个标志
    private
      FboolCreate : Boolean;
    反正你是动态创建
    你创建的时候设为True,Free时再改为False
      

  5.   

    to:Dlwxn(流云)
    但是这样还是不能达到我像要的目的.
    我写个例子: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并没有初始化.对它进行操作就会出错.
      

  6.   

    一种办法:
    public
      destructor Destroy; procedure TMyObj.Destroy
    begin
      list1.Free;
      list2.Free;
      list2.Free;
    end;
      

  7.   

    上面改成这样:
    destructor Destroy; override;procedure TMyObj.Destroy
    begin
      list1.Free;
      list2.Free;
      list2.Free;
      inherited Destroy;
    end;
      

  8.   

    list1 := TList.create;
    list2 := TList.create;
    list3 := TList.create;
    ---------------------
    这些如果没有在其它地方用到的话,没有必要写在Create中,可以改成局部变量
    procedure TMyObj.getList1();
    var
      list1:TList;
    begin
      list1 := TList.create;
      try  
      //在这里对list1进行操作
      finally
        list1.Free;
      end;  
    end;
      

  9.   


    if not assigned(frmcraft) then
      begin
        frmcraft := Tfrmcraft.Create(self);
        frmcraft.Show;
      end;
    end;
    也试了?
      

  10.   

    to:Dlwxn(流云)
    这几个对象事类里别的方法也需要用的,不能作为局部变量.我的例子只是临时写出来说明一下
    问题的,真实的要复杂得多.至于最后得释放方法.也只能象你写得那样.但是如何能够判断得话. 释放资源出也需要增加判断得.procedure TMyObj.Destroy
    begin
      if(Assigned(list1) )then
       begin
        list1.free
       end;
        ...
        ...   
    inherited Destroy;
    end;to: ssk0532(阳光地带) 仔细看一下我得例子,已经是这么判断了,就是应为不行,我才再这里问的
      

  11.   

    这个好办哦!
    procedure TMyObj.create;
    begin
    //在这里初始化三个变量
    list1 := nil
    list2 := nil;
    list3 := nil;  
    end;且在每一处做List1.Free后都加上List1:=nil
    这样Assigned(List1)就可以为真了。
      

  12.   

    但是如何能够判断得话. 释放资源出也需要增加判断得.
    ------------------------------------------------不需要判断,因为你在TMyObj.Create中已经Create了
    list1 := TList.create;
    list2 := TList.create;
    list3 := TList.create;
      

  13.   

    to:Dlwxn(流云)我的意思是说,如果能够判断的话,我就不会在TMyObj.Create中已经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) 就可以了.但是这种做法有点愣来了.我只希望能够有标准的方法
    来进行判断.如果实在不行.我也不强求了.
      

  14.   

    又何必这样呢,如果这样的话,岂不是需要用到list1的时候都要(如可以的话)
    if(not Assigned(list1) )then
    begin
     list1 := TList.create();
    end;在这个类中list1是全局变量,如果这个类实现的功能比较复杂,就没有必要。TList类型的我没有用过,但是TFileStream用过Assigned
      

  15.   

    在设计编码过程中,我会根据变量在各个方法中出现的次数来决定是否需要预先初始化还是
    调用时初始化.不会都一样处理的.不过这个思路既然实现不了,就不管它了.还是老老实实写代码吧.hehe.谢谢楼上各位了! 特别时谢谢Dlwxn(流云) 的全程支持!
      

  16.   

    在设计编码过程中,我会根据变量在各个方法中出现的次数来决定是否需要预先初始化还是
    调用时初始化.不会都一样处理的.不过这个思路既然实现不了,就不管它了.还是老老实实写代码吧.hehe.谢谢楼上各位了! 特别时谢谢Dlwxn(流云) 的全程支持!
      

  17.   

    搞笑了不是!Assigned()就是判断nil,那你还能有什么办法