哪里错了?关于加入图片的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=0do
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).Canvasdo
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()没有成功执行。为什么?
 
老兄,你这是猴子掰玉米,掰一个丢一个。
每读入一个文件都要重新创建一个 TBitmap 对象,否则下一次循环就覆盖上一次的结果,最后
当然显示的是最后一个。
combobox.Clear;
file:= 'c:/bmp/';
filefound:=FindFirst(file+'*.bmp',faAnyFile,SearchRec);
while filefound=0do
begin
if (SearchRec.Name<>'.')and(SearchRec.Name<>'..')and(SearchRec.Attr<>faDirectory)
then
begin
<font color =#ff0000><strong>Bitmap := TBitmap.Create;
</font></strong>
bitmap.LoadFromFile(file+SearchRec.Name);
//var bitmap: TBitmap;已经创建
ComboBox.Items.AddObject(SearchRec.Name, bitmap);
filefound:=FindNext(SearchRec);
end;
end;
findclose(SearchRec);
 
这个问题主要是由于 TStrings.AddObject 只是把对象指针添加到列表中,对象数据并不管。
你可以看一下 TStrings.AddObject 的帮助。
 
我在哪里释放这些bitmap呢?
 
当然是在你的 ComboBox 释放之前,否则你就再也找不到这些 Bitmap 对象的指针了。
OnDestroy OnClose 都可以,要循环释放。
 
来自:shyrain 时间:00-11-17 10:09:24 ID:396451
好了,搞定
3ks


 
这么说, 我要用bitmap数组了?
 
不需要用数组,循环对 TBitmap(ComboBox.Objects).Free 就可以了。
 
后退
顶部