我很难理解这两种说法之间是否真的有区别:
Image->Picture->Bitmap = bitmap; // bitmap is a TBitmap object
Image->Picture->Assign(bitmap);
VCL 帮助清楚地说明了通过以下方式进行分配=
:
注意:在分配 Bitmap 属性时,TPicture 会分配另一个 TBitmap 对象的属性。它不会获取指定值的所有权。
这意味着第一个语句不会将位图复制到 中,而只是接管Image->Picture->Bitmap
的地址。bitmap
Image->Picture->Bitmap
为什么我删除了位图Image->Picture->Bitmap
对象后,图片仍然正确显示在屏幕上?
这两个语句的功能是等效的。
在此声明中:
文档中没有提到,但实际发生的是,
TPicture::Bitmap
属性设置器会调用Assign()
属性获取器TBitmap
返回的TPicture::Bitmap
。换句话说,它相当于调用这个:将
TPersistent::Assign()
数据从一个对象复制到另一个兼容对象。在这种情况下,TBitmap
覆盖从另一个对象Assign()
复制像素数据。TBitmap
属性
TPicture::Bitmap
获取器确保TPicture
拥有自己的TBitmap
,如果还没有,则创建一个新的,并释放任何以前的非位图图形。这大致相当于这样做:
在此声明中:
TPicture
覆盖该Assign()
方法以创建一个新的TBitmap
,它是传递的副本bitmap
,然后拥有它的所有权,释放任何先前的图形。这大致相当于这样做:
因此,在这两种情况下,
TPicture
最终都会保留自己的TBitmap
数据,并从传递的数据中复制数据bitmap
。这不对,而且与你引用的文档相悖。仅仅获取地址就等于获取所有权,而文档明确指出这种情况不会发生。
因为
TPicture
已经创建了自己的像素数据副本。之后对原始数据的操作完全bitmap
不会影响。TPicture