如题,没有搜索到方法
解决方案 »
- 面向对象之Onclick事件重写问题!
- 不安装 Delphi,能不能用 DCC32.exe 来编译程序?
- listbox问题
- 我现在要用delphi来编写ActiveX,应该首先看些什么书?请各位delphi高手指点!
- 在DELPHI5开发的程序对大表操作‘连接超时’请教大侠急!!
- 怎么在sql使用变量阿
- 如何启动控制面板和屏幕保护???
- 请问有没有键的相应代码资料,比如#8代表Backspace之类的?
- 还是没有解决!!!用Delphi做的报表保存到软盘上,如何到别的机器上打印出来?
- 关于Word的难题,同志们帮帮忙!
- 新年好,请教下各位,关于sql server 2000 安全性,如何不让用户通过windows访问到表啊
- 在Delphi应用程序设计上,同时调用多个回调函数处理
object之间没有通用的办法,按照delphi中TPersistent的约定,TPersistent的继承类应继承AssignTo虚方法用来完成object之间数据的复制。同类型object之间的浅复制也可以直接实现,但因为的实现的方式不同,没有通用的清理原有数据的方式,直接复制会造成memory leak
a, b: record
Count : Integer;
Buffer: Pointer;
end;
begin
GetMem(a.Buffer, 100);
a.Count := 100;
b := a;
end;这段代码中b就是a的一个浅复制,如果是深复制,则应该给b.Buffer申请一块同样大小的内存并复制过去。对于record来说,一般浅复制没什么大影响,而且Delphi会对string、array进行一定的管理(动态数组更复杂些,虽然直接复制是浅复制,但如果再SetLength的话,就变成另一个复本了)一般不需要担心。但是对object来说问题就大了。比如 TFoo = class
...
FBmp: TBitmap;
...
end;destuctor TFoo.Destroy;
begin
...
FBmp.Free;
end;var a, b: TFoo;
begin
a := TFoo.Create;
b := TFoo.Create;
// 类似 b.* := a.* 的一个浅复制
b.Free;
a.Free;
end;因为b.FBmp=a.FBmp,只是指向内容相同,所以b.Free之后,实例上a.FBmp也已经销毁了。再调用a.Free,由于a.FBmp已经销毁了,试图再销毁就会产生错误。而正确的复制方法是使用b.FBmp.Assign(a.FBmp)进行一个深复制(TBitmap继承了Assign,并在里面实现了深复制)
1. record
优点:自动管理内存,无需手工释放。可重载操作符。
缺点:不能继承、无法直接实现接口。
如:TPointvar
p1, p2: TPoint;
begin
//...
p1 := p2; // 直接拷贝record数据
end;2. Object(TPersistent子类)
优点:能利用OO的特性(继承、多态)
缺点:无垃圾回收,一般需要手工释放对象实例。不可重载操作符。
如:TFont
var
f1, f2: TFont;
begin
// 创建f1, f2
f1.Assign(f2);
// 释放f1, f2
end;