Delphi 6和Vista Service Pack 2上的映像列表加载失败

时间:2009-07-02 14:52:41

标签: delphi windows-vista

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

运行项目时的错误是:

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

任何建议?

提前致谢

2 个答案:

答案 0 :(得分:7)

您是否对Delphi安装做了一些有趣的事情,例如在Delphi的目录中添加 delphi32.exe.manifest 文件,试图让IDE有XP或Vista主题?不要那样做。如果你有那个文件,删除它,你应该恢复正常。

图像列表格式随通用控件库的版本6而更改,而Delphi 6无法使用它。清单告诉IDE使用版本6,因此当它保存您的DFM时,它使用该格式。然后,在加载时,以前的版本无法再读取它。

答案 1 :(得分: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;