有礼了。需不需要释放句炳?

Lin 2000-03-04 05:20:00
我在一线程中需要动态改变Application的Icon属性,代码如下:
procedure TfrmPlay.ThreadTimerTimer(Sender: TObject);
var icn: HICON;
begin
if MediaPlayer.PlayState = mpPlaying then
begin
with MediaPlayer do
if (CurrentPosition > 0) and (Duration > 0) then
Progress.Position := Min(StrToInt(Format('%2.0f', [CurrentPosition / Duration * 100])), 100);
Inc(IconIndex);
icn := Application.Icon.Handle;
Application.Icon.Handle := LoadIcon(hInstance, MAKEINTRESOURCE(IconIndex));
DestroyIcon(icn);
IconIndex := IconIndex mod 8;
end;
end;

问题是:我在释放图标句柄后,Application总有点闪烁,有时显示的是缺省的Windows Application图标。但如果不释放,会不会造成内存泄漏?
我该怎么半?
...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lin 2000-03-07
  • 打赏
  • 举报
回复
To agui:
首先感谢你的解答。
  但问题依然存在,我原先的代码可以这样工作,而且IconIndex是1~8。自从我升级到戴妃5并下载Update Pack 1后,就出现了这样的问题,不知何故?

  感谢kxy推荐的检查内存有否泄软件,挺不错。
  又不能给一半的分,过几天等问题解决后在给,行吧?
光明山人 2000-03-07
  • 打赏
  • 举报
回复
procedure TfrmPlay.ThreadTimerTimer(Sender: TObject);
var
IcoTmp: TIcon;
begin
if MediaPlayer.PlayState = mpPlaying then
begin
with MediaPlayer do
if (CurrentPosition > 0) and (Duration > 0) then
Progress.Position := Min(StrToInt(Format('%2.0f', [CurrentPosition / Duration * 100])), 100);
IconIndex := (IconIndex+1) mod 8; // IconIndex始终在0~7
IcoTmp := TIcon.Create;
IcoTmp.ReleaseHandle; // 这一句可能不需要
IcoTmp.Handle := LoadIcon(hInstance, MAKEINTRESOURCE(IconIndex));
Application.Icon := IcoTmp; // 让TIcon自己解决,因为有可能Application.Icon的前一个图标不需要销毁(Windows标准)
IcoTmp.Free;
end;
end;

造成闪烁的原因是你的IconIndex会等于8,这时LoadIcon返回nil,则它会自动用缺省的Windows Application图标。
kxy 2000-03-06
  • 打赏
  • 举报
回复
memproof是一个业余作品:)你可以去他的主页看看
或着去弄一个专业的www.turbopower.com有一个Memory Sleuth的软件:)
kxy 2000-03-05
  • 打赏
  • 举报
回复
用Memproff可以检查内存有否泄露
www.midatech.com/kxy工具软件有下载,1.2M
Firing_Sky 2000-03-05
  • 打赏
  • 举报
回复
为什么一定要将icon作为局部变量,作为线程的全局变量,在线程终止的时候释放不好吗?
Lin 2000-03-05
  • 打赏
  • 举报
回复
To Firing_Sky:
我的线程无定时器,上面的代码只是线程的执行部分,且用Synchronize调用的;问题是当给Application.Icon赋值时,而Application.Icon又不能为nil, 它总会显示缺省的Windows Application图标;TIcon在给Handle或Self赋值时,却偏偏首先将自己的Image Free掉;问题就产生了:有时TApplication就会产生一个缺省的Windows Application图标,从而导致任务栏上的Icon闪烁。

To kxy:
Memproff有时会在我的机器(Windows NT4.0 WorkStation + SP6 + IE5.01 +D5)上会Down,无任何反映,怎么回事?
Firing_Sky 2000-03-04
  • 打赏
  • 举报
回复
1.你的ThreadTimerTimer事件是不是在线程里放了一个定时器?
2. 在线程里操作TApplication最好用Synchronize方法。
3. 我的建议,把ICON作为线程的全部变量,在线程的Createfang方法中创建并分配空间,在线程的Destory方法中把ICON释放
Lin 2000-03-04
  • 打赏
  • 举报
回复
To 929:
还是不行,我的环境是Win2000+D5.
929 2000-03-04
  • 打赏
  • 举报
回复
我想可以这样在改变ICON的HANDLE之前,调用RELEASEHANDLE方法释放掉这个ICON所占资源,这时ICHON。HANDLE变成NIL,这时再进行改变ICON。HANDLE的工作。
.....
application.icon.releasehandle;
....
application.icon.handle:=loadicon(Hinstance.makeintresource(inonindex);
....

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧