如何复制一个对象record或class记录(非数据库) 
我创建了两个记录:
type TRecord1=record
    a:integer;
    b:integer;
end;
var x,y:TRecord1;
或者是class,控件等对象;
现在赋值了一个记录:
x.a:=1;
x.b:=2;
现在我需要将x的所有属性复制到y里面去,即:y的变量要与x的变量是一样的值。
用y:=x是不可能的,这会导致两个记录都使用同一变量地址。
但是难道要我一个一个地赋值吗?有什么方法可以一次性将x的所有属性复制到y去,而不是复制变量地址。
类似的,我动态创建了一组控件,他们的大多数属性都是一样的,难道要我一个一个地赋值?
我想应该有方法复制对象的。谁知道,谢谢了!
 

解决方案 »

  1.   

    var rec1,rec2:trecord1;
    begin
       rec1.a:=1;
       rec2:=rec1;
    end;
      

  2.   

    如何复制一个对象record或class记录(非数据库)    
    我创建了两个记录:  
    type  TRecord1=record  
           a:integer;  
           b:integer;  
    end;  
    var  x,y:TRecord1;  
    或者是class,控件等对象;  
    现在赋值了一个记录:  
    x.a:=1;  
    x.b:=2;  
    现在我需要将x的所有属性复制到y里面去,即:y的变量要与x的变量是一样的值。  
    用y:=x是不可能的,这会导致两个记录都使用同一变量地址。  
    但是难道要我一个一个地赋值吗?有什么方法可以一次性将x的所有属性复制到y去,而不是复制变量地址。  
    类似的,我动态创建了一组控件,他们的大多数属性都是一样的,难道要我一个一个地赋值?  
    我想应该有方法复制对象的。谁知道,谢谢了!  
       
      

  3.   

    move(x, y, sizeof(TRecord1));
      

  4.   

    :maozefa(之源) 
    试过了,不行。我的目的是这样的:
        edt1[i]:=TEdit.Create(nil);
        with edt_1[i] do begin
          Parent:=panel1;
          font.Color:=clBlue;
          Left:=c_sz;
          Top:=c_fromtop+i*24;
          Height:=20;
          Width:=97;
        end;    edt2[i]:=TEdit.Create(nil);
        with edt2[i] do begin
          Parent:=panel1;
          Left:=c_pm;
          Top:=c_fromtop+i*24;
          Height:=20;
          width:=113;
          font.Color:=clBlue;
        end;edt1和edt2的属性值基本上差不多,我想把edt1的所有属性复制到edt2里面去,再改一些不同值的属性,这样就可以写少很多代码。
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      Edit: TEdit;
    begin
      Edit := TEdit.Create(Self);
      move(Pointer(Edit1)^, Pointer(Edit)^, Sizeof(TEdit));
      Edit.Top := 10;
      InsertControl(Edit);
    end;end.
      

  6.   

    move不行
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s,s1:test;
    begintype 
     test=class
      x:string;
    end;s:=test.Create;
    s.x:='ysy';
    s1:=test.Create;
    move(s,s1,sizeof(test));
    //或者写成move(pointer(s)^,pointer(s1)^,sizeof(test));
    //好像用move和s1:=s;没有什么区别
    showmessage(s1.x);
    s.Free;
    showmessage(s1.x);//这里回报错,变量指向的实例不存在
    end;
      

  7.   

    sorry,那个test的类声明只是用于解释s和s1的类型的。应该注释掉的
      

  8.   

    如果你的纪录是内存中的连续区域(记录所有成员都不是指针),就可以用move实现。
    type TRecord1=record
        a:integer;
        b:integer;
    end;
    可以用move来实现
    type TRecord1=record
        a:integer;
        b:integer;
        c:string;
    end;
    就不可以,这样当x释放后,调用y.c就出现异常。
      

  9.   

    2 maozefa(之源) 
    你用的是turbo pascal还是delphi?是delphi几?
    我实在不明白,因为我用了D5,D6,D7去看,SizeOf(TLabel)都是等于 4.你的是多少?2 楼主
    组件的重要最好写个函数来赋值:function CreateEdit(ATop, ALeft: Integer): TEdit;
    begin
      Result := TEdit.Create(Self);
      Result.Top := ATop;
      Result.Left := ALeft;
      Result.Parent := Self;
    end;然后调用:
      Edit1 := CreateEdit(0, 0);
      ..
      ..
    而不是用其它方法。结构体赋值最好用Move,如果你对内存访问的机制熟的话,不然用
    var
      X, Y: TRecord;
    begin
      X...
      Y := X; //这样就行了。
    end;如果是结构数组,那找找FAQ,我记得我以前回答过。
      

  10.   


    你用的是turbo pascal还是delphi?是delphi几?
    我实在不明白,因为我用了D5,D6,D7去看,SizeOf(TLabel)都是等于 4.你的是多少?
    }SizeOf(TLabel)这是得不到它的记录的长度的。用TObject的一个什么才行,我查查先?
      

  11.   

    对于record可以直接使用:=来赋值,而不要使用move函数,当结构中有String,
    Interface时候,会导致内存泄漏。
    对TObject类型,就必须手工写方法,比如TPersistant有Assign方法,类似与C++的operator=,绝对不要使用move方法,正如在C++中对有虚拟函数和指针成员的类也不能使用=或memcpy方法。
      

  12.   

    Delphi里record之间赋值是传址的,所以要想在record之间传值赋值只能一个一个给成员地赋值。
    你可以把record定义成一个class,然后调用class的Assign(source)或AssignTo(dest),就可以了例如:
    TMyClass = class
      field1 :string;
      field2 :integer;
    end;data1 :TMyClass;
    data2 :TMyClass;data1.field1 = 'abc’;
    data1.field2 = 50;data2.Assign(data1);
    或者
    data1.AssignTo(data2);
      

  13.   

    不过Assign函数和AssignTo函数要你自己来写,我推荐这样做,不赞成Move,因为这样更符合OOP的思想。
      

  14.   

    Delphi帮助上面说的很清楚:
    同类型的记录之间是可以用赋值来做的,赋值是复制,不是共用一个地址。需要复制Class的属性,可以参考我的代码:
    http://kingron.myetang.com/document/delphi/index.html
    Delphi编程技巧--〉界面、窗体和控件--〉其他控件及其问题--〉克隆属性
      

  15.   


    如果是 VCL 类或 VCL 的继承类(从TObject等继承),可以用 Assign(...)
      

  16.   

    我倒了,还是要写一个函数?没有通用一点的方法吗?我想复制任意类型的变量,包括:class,record等的类型。
    比如说,TFields类型(并非Tpersistent派生)的复制,如果没有的话,object pascal不就是少了个功能?