如何复制一个对象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去,而不是复制变量地址。
类似的,我动态创建了一组控件,他们的大多数属性都是一样的,难道要我一个一个地赋值?
我想应该有方法复制对象的。谁知道,谢谢了!
我创建了两个记录:
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去,而不是复制变量地址。
类似的,我动态创建了一组控件,他们的大多数属性都是一样的,难道要我一个一个地赋值?
我想应该有方法复制对象的。谁知道,谢谢了!
begin
rec1.a:=1;
rec2:=rec1;
end;
我创建了两个记录:
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去,而不是复制变量地址。
类似的,我动态创建了一组控件,他们的大多数属性都是一样的,难道要我一个一个地赋值?
我想应该有方法复制对象的。谁知道,谢谢了!
试过了,不行。我的目的是这样的:
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里面去,再改一些不同值的属性,这样就可以写少很多代码。
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.
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;
type TRecord1=record
a:integer;
b:integer;
end;
可以用move来实现
type TRecord1=record
a:integer;
b:integer;
c:string;
end;
就不可以,这样当x释放后,调用y.c就出现异常。
你用的是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,我记得我以前回答过。
你用的是turbo pascal还是delphi?是delphi几?
我实在不明白,因为我用了D5,D6,D7去看,SizeOf(TLabel)都是等于 4.你的是多少?
}SizeOf(TLabel)这是得不到它的记录的长度的。用TObject的一个什么才行,我查查先?
Interface时候,会导致内存泄漏。
对TObject类型,就必须手工写方法,比如TPersistant有Assign方法,类似与C++的operator=,绝对不要使用move方法,正如在C++中对有虚拟函数和指针成员的类也不能使用=或memcpy方法。
你可以把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);
同类型的记录之间是可以用赋值来做的,赋值是复制,不是共用一个地址。需要复制Class的属性,可以参考我的代码:
http://kingron.myetang.com/document/delphi/index.html
Delphi编程技巧--〉界面、窗体和控件--〉其他控件及其问题--〉克隆属性
如果是 VCL 类或 VCL 的继承类(从TObject等继承),可以用 Assign(...)
比如说,TFields类型(并非Tpersistent派生)的复制,如果没有的话,object pascal不就是少了个功能?