可是TUserDefine 没有Assign方法。又该如何????

解决方案 »

  1.   

    Move(const Source; var Dest; Count: Integer);
    行吧
      

  2.   

    找到一个函数
    VOID CopyMemory (
        PVOID Destination, // address of copy destination 
        CONST VOID *Source, // address of block to copy 
        DWORD Length  // size, in bytes, of block to copy  
       );
    这样应该没问题
    CopyMemory(B, A, A.InstanceSize);
      

  3.   

    以前我们就讨论过,除非设计者提供或派生了Assign()方法,
    否则,没法对对象进行互为赋值,Move与Copy都不行,因为一个
    对象中往往有动态申请的单元或属性以及指针等,情况很复杂,
    简单地赋值是不行的,答案的结果就是没有通用的方法.
      

  4.   

    同样BCB的,我也认为只能一个变量,一个变量的赋值。
      

  5.   

    xzgyb
    我用了你的方法,死机两次,都不知道是怎么死的。
    请问BCB,Assign方法应该怎么写,VCL中哪个类的可以参考??
      

  6.   

    从TCollectionItem继承的子类都完成了Assigned方法。你随便找个看看吧。
    比如在DB单元中的TFieldDef
      

  7.   

     如果类赋值的话,最好要继承assign方法,以便释放,否则自己要添加释放的方法
      

  8.   

    Assign()是类设计者设计的,他自已知道应怎样复制一个类(其实也就是复制一些类的属性而已),
    但他不一定提供Assign(),类的每一次派生都要重新扩充Assign(),所以,
    你想再设计一个Assign通用办法很困难,你只好将每个对象的属性都赋值一下,可一般人
    又不愿这样做.
      

  9.   

    欧,不好意思,我自己瞎试的
    我是简单用个类
    interfaceTFA = Class
      public
        FI,FJ:Integer;
        procedure PrintI;
    end;
    implement
    procedure TFA.PrintI;
    begin
      ShowMessage(IntToStr(FI));
    end;procedure TForm1.ButtonClick(Sender:TObject);
    var
      I, J : TFA;
    begin
      I := TFA.Create;
      J := TFA.Create;
      I.FI := 23;
      CopyMemory(J, I, I.InstanceSize);
      J.PrintI;
      I.Free;
      J.PrintI;
      J.Free;
    end;
    end.
    运行没有错误啊,也没有死机,我不知为什么
      

  10.   

    我不认为拷贝内存就可以解决问题。你上面给的例子很简单。如果类中存在复杂的对象,拷贝内存无非就是拷贝个地址而已,没有真正的拷贝对象。
    此外,诸如string这种Delphi维护的动态类型,拷贝内存并不能导致其RefCount自增1,如果释放掉原来的对象,新的对象肯定也要出问题。