A,B:TUserDefine;
A:=TUserDefine.create;
B:=TUserDefine.create;
A.xxx:=...
A.YYY:=...
...
如何使把A的值赋给B。
用B:=A不行,
等于B为A的引用,这样当A.free后再B.free就出错。
我记得动态数组也存在这种情况,所以动态数组互相赋值用aryB:=Copy(aryA);
但对对象不行。请问如何解决。。。。。。。
21 个解决方案
#1
B.Assign(A);
#2
可是TUserDefine 没有Assign方法。又该如何????
#3
Move(const Source; var Dest; Count: Integer);
行吧
行吧
#4
move不行,释放B时出错
#5
我加到100分了
#6
怎么没人来了。都100分了
#7
找到一个函数
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);
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);
#8
以前我们就讨论过,除非设计者提供或派生了Assign()方法,
否则,没法对对象进行互为赋值,Move与Copy都不行,因为一个
对象中往往有动态申请的单元或属性以及指针等,情况很复杂,
简单地赋值是不行的,答案的结果就是没有通用的方法.
否则,没法对对象进行互为赋值,Move与Copy都不行,因为一个
对象中往往有动态申请的单元或属性以及指针等,情况很复杂,
简单地赋值是不行的,答案的结果就是没有通用的方法.
#9
同样BCB的,我也认为只能一个变量,一个变量的赋值。
#10
BCB回答正确。
#11
xzgyb
我用了你的方法,死机两次,都不知道是怎么死的。
请问BCB,Assign方法应该怎么写,VCL中哪个类的可以参考??
我用了你的方法,死机两次,都不知道是怎么死的。
请问BCB,Assign方法应该怎么写,VCL中哪个类的可以参考??
#12
从TCollectionItem继承的子类都完成了Assigned方法。你随便找个看看吧。
比如在DB单元中的TFieldDef
比如在DB单元中的TFieldDef
#13
关注
#14
gz
#15
如果类赋值的话,最好要继承assign方法,以便释放,否则自己要添加释放的方法
#16
Assign()是类设计者设计的,他自已知道应怎样复制一个类(其实也就是复制一些类的属性而已),
但他不一定提供Assign(),类的每一次派生都要重新扩充Assign(),所以,
你想再设计一个Assign通用办法很困难,你只好将每个对象的属性都赋值一下,可一般人
又不愿这样做.
但他不一定提供Assign(),类的每一次派生都要重新扩充Assign(),所以,
你想再设计一个Assign通用办法很困难,你只好将每个对象的属性都赋值一下,可一般人
又不愿这样做.
#17
欧,不好意思,我自己瞎试的
我是简单用个类
interface
TFA = 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.
运行没有错误啊,也没有死机,我不知为什么
我是简单用个类
interface
TFA = 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.
运行没有错误啊,也没有死机,我不知为什么
#18
我不认为拷贝内存就可以解决问题。你上面给的例子很简单。如果类中存在复杂的对象,拷贝内存无非就是拷贝个地址而已,没有真正的拷贝对象。
此外,诸如string这种Delphi维护的动态类型,拷贝内存并不能导致其RefCount自增1,如果释放掉原来的对象,新的对象肯定也要出问题。
此外,诸如string这种Delphi维护的动态类型,拷贝内存并不能导致其RefCount自增1,如果释放掉原来的对象,新的对象肯定也要出问题。
#19
ok,明白了,没有考虑太多
#20
没有办法!
#21
给分了!!
#1
B.Assign(A);
#2
可是TUserDefine 没有Assign方法。又该如何????
#3
Move(const Source; var Dest; Count: Integer);
行吧
行吧
#4
move不行,释放B时出错
#5
我加到100分了
#6
怎么没人来了。都100分了
#7
找到一个函数
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);
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);
#8
以前我们就讨论过,除非设计者提供或派生了Assign()方法,
否则,没法对对象进行互为赋值,Move与Copy都不行,因为一个
对象中往往有动态申请的单元或属性以及指针等,情况很复杂,
简单地赋值是不行的,答案的结果就是没有通用的方法.
否则,没法对对象进行互为赋值,Move与Copy都不行,因为一个
对象中往往有动态申请的单元或属性以及指针等,情况很复杂,
简单地赋值是不行的,答案的结果就是没有通用的方法.
#9
同样BCB的,我也认为只能一个变量,一个变量的赋值。
#10
BCB回答正确。
#11
xzgyb
我用了你的方法,死机两次,都不知道是怎么死的。
请问BCB,Assign方法应该怎么写,VCL中哪个类的可以参考??
我用了你的方法,死机两次,都不知道是怎么死的。
请问BCB,Assign方法应该怎么写,VCL中哪个类的可以参考??
#12
从TCollectionItem继承的子类都完成了Assigned方法。你随便找个看看吧。
比如在DB单元中的TFieldDef
比如在DB单元中的TFieldDef
#13
关注
#14
gz
#15
如果类赋值的话,最好要继承assign方法,以便释放,否则自己要添加释放的方法
#16
Assign()是类设计者设计的,他自已知道应怎样复制一个类(其实也就是复制一些类的属性而已),
但他不一定提供Assign(),类的每一次派生都要重新扩充Assign(),所以,
你想再设计一个Assign通用办法很困难,你只好将每个对象的属性都赋值一下,可一般人
又不愿这样做.
但他不一定提供Assign(),类的每一次派生都要重新扩充Assign(),所以,
你想再设计一个Assign通用办法很困难,你只好将每个对象的属性都赋值一下,可一般人
又不愿这样做.
#17
欧,不好意思,我自己瞎试的
我是简单用个类
interface
TFA = 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.
运行没有错误啊,也没有死机,我不知为什么
我是简单用个类
interface
TFA = 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.
运行没有错误啊,也没有死机,我不知为什么
#18
我不认为拷贝内存就可以解决问题。你上面给的例子很简单。如果类中存在复杂的对象,拷贝内存无非就是拷贝个地址而已,没有真正的拷贝对象。
此外,诸如string这种Delphi维护的动态类型,拷贝内存并不能导致其RefCount自增1,如果释放掉原来的对象,新的对象肯定也要出问题。
此外,诸如string这种Delphi维护的动态类型,拷贝内存并不能导致其RefCount自增1,如果释放掉原来的对象,新的对象肯定也要出问题。
#19
ok,明白了,没有考虑太多
#20
没有办法!
#21
给分了!!