我想可以这样在改变ICON的HANDLE之前,调用RELEASEHANDLE方法释放掉这个ICON所占资源,这时ICHON。HANDLE变成NIL,这时再进行改变ICON。HANDLE的工作。
.....
 application.icon.releasehandle;
....
 application.icon.handle:=loadicon(Hinstance.makeintresource(inonindex);
....

解决方案 »

  1.   

    To 929:
    还是不行,我的环境是Win2000+D5.
      

  2.   

    1.你的ThreadTimerTimer事件是不是在线程里放了一个定时器?
    2. 在线程里操作TApplication最好用Synchronize方法。
    3. 我的建议,把ICON作为线程的全部变量,在线程的Createfang方法中创建并分配空间,在线程的Destory方法中把ICON释放
      

  3.   

    用Memproff可以检查内存有否泄露
    www.midatech.com/kxy工具软件有下载,1.2M
      

  4.   

    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,无任何反映,怎么回事?
      

  5.   

    为什么一定要将icon作为局部变量,作为线程的全局变量,在线程终止的时候释放不好吗?
      

  6.   

    memproof是一个业余作品:)你可以去他的主页看看
    或着去弄一个专业的www.turbopower.com有一个Memory Sleuth的软件:)
      

  7.   

    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图标。
      

  8.   

    To agui:
    首先感谢你的解答。
      但问题依然存在,我原先的代码可以这样工作,而且IconIndex是1~8。自从我升级到戴妃5并下载Update Pack 1后,就出现了这样的问题,不知何故?  感谢kxy推荐的检查内存有否泄软件,挺不错。
      又不能给一半的分,过几天等问题解决后在给,行吧?