基础知识的问题请教-关于Assign(300分)

  • 主题发起人 主题发起人 Town
  • 开始时间 开始时间
T

Town

Unregistered / Unconfirmed
GUEST, unregistred user!
也编了一段时间程序了,对一些最基本的东西似懂非懂,特向各位请教。
今天的问题是-关于Assign.

我有这样一段程序:
var
bmp:TBitmap;
begin
bmp:=TBitmap.Create;
bmp.loadfromfile('c:/test.bmp');
//Option 1
Form1.brush.bitmap:=bmp;
//Option2
Form1.brush.bitmap.assign(bmp);
//Option3
Form1.brush.bitmap.canvas.draw(x,y,bmp);

end;
我的问题是
1. 这三种选择, 究竟有什么不同?
2. 如果紧接着使用bmp.free, 发生了什么?
3. 如果程序中很多控件的Canvas都用这个bmp做背景图片,最好使用哪个用法?
 
1. 这三种选择, 究竟有什么不同?
//Option 1
Form1.brush.bitmap:=bmp;
这是一般的用法,把bmp的指针指向Form1.brush.bitmap。
///////////////////////////////////////////////////////
//Option2
Form1.brush.bitmap.assign(bmp);
这是错误的用法,因为Form1.brush.bitmap的对象实例还没有建立,应该是
form1.Brush.Bitmap:=tbitmap.Create;
Form1.brush.bitmap.assign(bmp);
///////////////////////////////////////////////////////
//Option3
Form1.brush.bitmap.canvas.draw(x,y,bmp);

2. 如果紧接着使用bmp.free, 发生了什么?
只是bmp被释放,图像没有任何影响。因为delphi帮助里写的很清楚:
TBrush.Bitmap points to a TBitmap object that holds a bitmap image.
Changing the image does not affect the brush until the TBitmap is reassigned to
the Bitmap property. Be sure to free the TBitmap after finishing with the brush,
since TBrush will not free it.
3. 如果程序中很多控件的Canvas都用这个bmp做背景图片,最好使用哪个用法?
当然是占的资源越少越好了。Form1.brush.bitmap:=bmp;
 
>> //option1
>> Form1.brush.bitmap:=bmp;
>> //Option2
>> Form1.brush.bitmap.assign(bmp);
>> //Option3
>> Form1.brush.bitmap.canvas.draw(x,y,bmp);
option1 :
相当于使 form1.brush.bitmap 指向 bmp 的首地址 你可以把 bmp 和 form1.brush.bitmap理解为指针
option2
assign 在这里是类似用loadfromstream(bmp)
option3
Form1.brush.bitmap.canvas.draw(x,y,bmp);
调用 tcanvas 的draw 方法 tcanvas.draw(x,y:integer,bmp:tbitmap)
相当于给draw 传递 bmp这个参数 你也可以把bmp 理解为 指针
这样说你理解吗


 
Assign适合字段存取.既从一个长二进制数据中获取图象,也可以直接从另个图象实例获取
如Form1.brush.bitmap.assign(bmp),Form1.brush.bitmap.assign(tblobfield(query1.fieldbyname('image')).
 
对于TJpegImage文件的读取是不是一样呢?
 
To savenight:
既然Form1.brush.bitmap的对象实例还没有建立,为何Form1.brush.bitmap:=bmp;就
可以呢? 为什么Form1.brush.bitmap:=bmp;就比其它的节省资源呢?
 
>>既然Form1.brush.bitmap的对象实例还没有建立,为何Form1.brush.bitmap:=bmp;就可以呢?
那只是一个指针,在看一个例子:
var
p:pointer;
begin
p:=button1
//button1是已经创建的,p只是指向它
(tobject(p) as tbutton).Caption :='savenight';
end;

>>为什么Form1.brush.bitmap:=bmp;就比其它的节省资源呢?
因为assign是整体拷贝,这时内存中有两个同样的bmp。
 
補充:
如果執行Option1,的程式之後,
Form1.brush.bitmap:=bmp;
並沒使用到Brush, 就馬上釋放bitmap, 再次使用Brush時, 會出現內存訪問錯誤!
像如果你在一個Form的Button1的OnClick事件下, 寫下如此的Code就會出錯
procedure TForm1.Button1Click(Sender: TObject);
var Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('C:/Test.bmp');
Brush.Bitmap := Bitmap;
Bitmap.Free;
Refresh;
end;
如果在Bitmap.Free前加上下列一行
Brush.Handle;
就不會有問題;
 
OPTION1是个指针相当于我们桌面上的快捷键
OPTION2是相当于我们的拷贝即使BMP释放掉了但IMAGE1。canvas.bitmap中图片还是有的
OPTION3我个人认为有点象我们的贴粘!:)
通俗吧!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
759
import
I
后退
顶部