【问题标题】:Image list loading fails on Delphi 6 and Vista service pack 2Delphi 6 和 Vista Service Pack 2 上的图像列表加载失败
【发布时间】:2009-07-02 14:52:40
【问题描述】:

Vista Service Pack 2 上的 Delphi 6 似乎无法从 dfm 加载图像列表并在 IDE 中再次保存。 dfm 损坏的项目无法重建。

我运行项目时的错误是:

EReadError 读取 imagelist1.Bitmap 时出错:读取 ImageList 失败 来自流的数据

有什么建议吗?

提前致谢

【问题讨论】:

    标签: delphi windows-vista


    【解决方案1】:

    你有没有对你的 Delphi 安装做过任何有趣的事情,例如将 delphi32.exe.manifest 文件添加到 Delphi 的目录中以试图使 IDE 具有 XP 或 Vista 主题?不要那样做。如果你有那个文件,删除它,你应该会恢复正常。

    图像列表格式随着通用控件库版本 6 的变化而改变,Delphi 6 无法使用它。清单告诉 IDE 使用版本 6,因此当它保存您的 DFM 时,它使用该格式。然后,在加载的时候,以前的版本就读不下去了。

    【讨论】:

      【解决方案2】:

      问题可能出在 comctl32.dll 的 ImageList_Write 上

      // delphi 6
      procedure TCustomImageList.WriteData(Stream: TStream);
      var
        SA: TStreamAdapter;
      begin
        SA := TStreamAdapter.Create(Stream);
        try
          if not ImageList_Write(Handle, SA) then
            raise EWriteError.CreateRes(@SImageWriteFail);
        finally
          SA.Free;
        end;
      end;
      
      // delphi 2005
      procedure TCustomImageList.WriteData(Stream: TStream);
      var
        SA: TStreamAdapter;
        ComCtrlHandle: THandle;
      const
        ILP_DOWNLEVEL = 1;
      begin
        if CachedComCtrlVer = 0 then
        begin
          CachedComCtrlVer := GetFileVersion(comctl32);
          if CachedComCtrlVer >= ComCtlVersionIE6 then
          begin
            ComCtrlHandle := GetModuleHandle(comctl32);
            if ComCtrlHandle <> 0 then
              ImageListWriteExProc := GetProcAddress(ComCtrlHandle, 'ImageList_WriteEx'); { Do not localize }
          end;
        end;
      
        SA := TStreamAdapter.Create(Stream);
        try
          { See if we should use the new API for writing image lists in the old
            format. }
          if Assigned(ImageListWriteExProc) then
          begin
            if ImageListWriteExProc(Handle, ILP_DOWNLEVEL, SA) <> S_OK then
              raise EWriteError.CreateRes(@SImageWriteFail)
          end
          else if not ImageList_Write(Handle, SA) then
              raise EWriteError.CreateRes(@SImageWriteFail);
        finally
          SA.Free;
        end;
      end;
      

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 2023-04-03
        • 2015-01-21
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多