哪里错了?关于加入图片的combobox的疑惑!(100分)

  • 主题发起人 主题发起人 shyrain
  • 开始时间 开始时间
S

shyrain

Unregistered / Unconfirmed
GUEST, unregistred user!
我在formshow中初始化combobox中的图片:
combobox.Clear;
file:= 'c:/bmp/';
filefound:=FindFirst(file+'*.bmp',faAnyFile,SearchRec);
while filefound=0 do
begin
if (SearchRec.Name<>'.')and(SearchRec.Name<>'..')and(SearchRec.Attr<>faDirectory)
then
begin
bitmap.LoadFromFile(file+SearchRec.Name); //var bitmap: TBitmap;已经创建
ComboBox.Items.AddObject(SearchRec.Name, bitmap);
filefound:=FindNext(SearchRec);
end;
end;
findclose(SearchRec);

在ondrawitem事件中处理图像显示:
procedure comboboxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var Bitmap: TBitmap;
destrect, sourcerect: TRect;
begin
with (Control as TComboBox).Canvas do
begin
FillRect(Rect);
Bitmap := TBitmap(ComboBox.Items.Objects[Index]); //显示图形
if Bitmap <> nil then
begin
destrect:=bounds(Rect.Left,Rect.Top,32,32);
sourcerect:=bounds(0, 0, 32,32);
BrushCopy(destrect, Bitmap, sourcerect, clWhite);
Offset := Bitmap.width;
end;
TextOut(Rect.Left + Offset +5, Rect.Top, Combobox.Items[Index]);
end;
end;

可是结果确是:显示的图片都是search到的最后一个图像文件,但所对应的string确实不同的
也就是说,BrushCopy()没有成功执行。为什么?
 
AddObject实际是添加了一个bitmap对象的引用,并不是一个拥有相同位图的对象,
也就是说,AddObject实际上添加了同一个对象。Combobox.Items中的所有项都引用
同一个对象,所以画出来的当然是同一个位图。

我解决这一问题,每添加一个对象,都需要执行bitmap := TBitmap.Create

最后记得释放对象的资源啊。
 
那我如果又上百个图片,是不是也太浪费资源了
 
好了,搞定
3ks
 
在ondrawitem事件中处理图像显示要区分index的,要不然就画最后一个图了。
 
来自:shyrain 时间:00-11-17 10:09:24 ID:396451
好了,搞定
3ks


 
后退
顶部