关于动态创建Image的有关问题
关于动态创建Image的问题
我在panel上动态创建了数量未知的Image,根据后台采集的数据,使对应的Image背景显示不同的颜色,创建的时候没有问题,能正常显示,但是在程序运行一段时间之后,有些Image会不可见(实际上Image这个对象还留在内存中),如果电脑开了屏保,激活电脑后这种情况更加明显,不知道是什么原因导致的?
===============================================================
附上创建Image的代码:
if TImage(FindComponent('EEI'+EquipName+'_'+Address))<>nil then
TImage(FindComponent('EEI'+EquipName+'_'+Address)).Free;
TImage.Create(self).Name:='EEI'+EquipName+'_'+Address;
TImage(FindComponent('EEI'+EquipName+'_'+Address)).OnDblClick:=ImageDblClick;
With TImage(FindComponent('EEI'+EquipName+'_'+Address)) do
begin
Hint:=EquipName+'('+Trim(DM.ADOQuery1.FieldByName('Mf05').AsString)+','+
Trim(DM.ADOQuery1.FieldByName('Mf03').AsString)+',地址'+Address+')';
ShowHint:=True;
Canvas.Brush.Color:=clwhite;
Top := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Top',0);
Left := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Left',0);
Height := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Height',20);
Width := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Width',30);
Canvas.Brush.Color:=Clgreen;
rect:= Canvas.ClipRect;
Canvas.FillRect(rect);
Parent:=Panel3;
Visible := true;
end;
------解决方案--------------------
Image1.BringtoFont;
Image1.Invalidate;
试下
------解决方案--------------------
你这个代码是在创建的图片上画图,并不是图片啊!!!被其它窗口挡住后,当然就不见了,要重新画
在窗体的onPaint事件重新画吧,或者把这段码放在onPaint事件中
另外Image不用每次都判断和创建,在窗体打开时就创建就行了
------解决方案--------------------
用动态img 数组 维护
要设置 img Parent 为当前页的容器 或者 TTabSheet.
我在panel上动态创建了数量未知的Image,根据后台采集的数据,使对应的Image背景显示不同的颜色,创建的时候没有问题,能正常显示,但是在程序运行一段时间之后,有些Image会不可见(实际上Image这个对象还留在内存中),如果电脑开了屏保,激活电脑后这种情况更加明显,不知道是什么原因导致的?
===============================================================
附上创建Image的代码:
if TImage(FindComponent('EEI'+EquipName+'_'+Address))<>nil then
TImage(FindComponent('EEI'+EquipName+'_'+Address)).Free;
TImage.Create(self).Name:='EEI'+EquipName+'_'+Address;
TImage(FindComponent('EEI'+EquipName+'_'+Address)).OnDblClick:=ImageDblClick;
With TImage(FindComponent('EEI'+EquipName+'_'+Address)) do
begin
Hint:=EquipName+'('+Trim(DM.ADOQuery1.FieldByName('Mf05').AsString)+','+
Trim(DM.ADOQuery1.FieldByName('Mf03').AsString)+',地址'+Address+')';
ShowHint:=True;
Canvas.Brush.Color:=clwhite;
Top := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Top',0);
Left := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Left',0);
Height := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Height',20);
Width := iniFile.ReadInteger('DGI','EEI'+EquipName+'_'+Address+'.Width',30);
Canvas.Brush.Color:=Clgreen;
rect:= Canvas.ClipRect;
Canvas.FillRect(rect);
Parent:=Panel3;
Visible := true;
end;
------解决方案--------------------
Image1.BringtoFont;
Image1.Invalidate;
试下
------解决方案--------------------
你这个代码是在创建的图片上画图,并不是图片啊!!!被其它窗口挡住后,当然就不见了,要重新画
在窗体的onPaint事件重新画吧,或者把这段码放在onPaint事件中
另外Image不用每次都判断和创建,在窗体打开时就创建就行了
------解决方案--------------------
用动态img 数组 维护
要设置 img Parent 为当前页的容器 或者 TTabSheet.