TPerson = class(TObject)
  public
    ID: Integer;
    Name: string;
    Sex: boolean;   //True为男,FALSE为女, 空值为不限
     ...
  end;在程序中创建对象并赋值使用后,想清空ID字段的值和Sex字段的值,用:
  aPerson.ID := null;

  aPerson.Sex := NULL;
编译可通过,但是执行到此时老出错.

解决方案 »

  1.   

    另外, 如何清空整个对象所有成员的值?
      aPerson.CleanupInstance;
    似乎没有用呀!
      

  2.   

    null 在Delphi里是一个函数 返回类型是 Variant
    var
      a :Tperson;
    begin
      a := Tperson.Create;  //先创建
      try
        a.ID := 1;
        a.Name := 'OK';
        a.Sex := true;
        ShowMessage(a.Name);
      finally
        a.Free;    //再释放
      end;
      ShowMessage(a.Name);
      

  3.   

    谢谢dyzhong,但我的问题是:
    1. 如何清除 对象a 里面ID和Sex字段的值, 想把它们赋空. 
    2. 有没办法一次性清除对象a里面所有成员的值? 还是要一个个赋空?
      

  4.   

    谢谢Seamour有点明白了,
    integer 的空值是否就一定是0,
    Boolean 的空值是否就一定是False,     //Booltostr()显示是0
    那:
    integer 型的成员是否有办法赋个像数据表中未填入数据时的空? 既非0也非其它数字?
      

  5.   

    应用程序又不是数据库
    在delphi中,class在构建的时候内容全是0,并把最开头的4字节指向Object.ClassType
    在d2009中,新增了default(T)的语法取得一个类似的默认为0的值
      

  6.   

    谢谢Seamour明白了, 那D中是否有可以一次性清空所有成员的函数?
    查了,感觉像是 aPerson.CleanupInstance; 但是似乎没用呀! 有没别的方法?
      

  7.   

    CleanupInstance可以释放string、array of T等变长数组(可以把string理解成一种特殊的变长数组)申请的内存,但是其它的值它不管。object的实例的大小可以用InstanceSize来获得,实例的头4字节是个指向它的类的rtti的指针,其它部分是class中声明的内部变量。
    所以可以用这种方法来清零:procedure CleanInstance(AObject: TObject);
    begin
      AObject.CleanupInstance;
      FillChar((PAnsiChar(AObject)+4)^, AObject.InstanceSize - 4, 0);
    end;但是这样的话,如果内部还有其它对象,需要通过destructor才能释放的,就直接把内部指向对象的指针清0了,会导致memory leak。所以建议还是不要用这种方式来清0,除非你真的明确的知道自己在做什么
      

  8.   

    谢谢Seamour,"如果内部还有其它对象,需要通过destructor才能释放的", 是否是指 被清空的对象A的成员中某个成员是对象类型的, 就不能这样清空? 如果我的成员没有对象类型的,就没释放的问题? 因为成员的数量比较多,一一置0会比较麻烦, 所以想找一个简便、通用的方法!
      

  9.   

    不提供对内部属性的清空
    需要自己写clear方法
      

  10.   

    比如
    TFoo=class
    ...
      FList:TStrings
    ...
    end;procedure TFoo.blahblah;
    begin
      FList:=TStringList.Create;
      ...
    end;destructor TFoo.Destroy;
    begin
      FList.Free;
      ...
    end;
    那你就不能随便清除了
    object的内部可能有许多实现的方式,就算是统一查TypeInfo()表,按是不是TObject释放(我还没仔细研究过TypInfo单元,不知道能不能实现),也不一定能保险
      

  11.   

    明白了,谢谢Seamour, simonhehe
    接分!