【发布时间】:2009-07-02 14:52:40
【问题描述】:
Vista Service Pack 2 上的 Delphi 6 似乎无法从 dfm 加载图像列表并在 IDE 中再次保存。 dfm 损坏的项目无法重建。
我运行项目时的错误是:
EReadError 读取 imagelist1.Bitmap 时出错:读取 ImageList 失败 来自流的数据
有什么建议吗?
提前致谢
【问题讨论】:
标签: delphi windows-vista
Vista Service Pack 2 上的 Delphi 6 似乎无法从 dfm 加载图像列表并在 IDE 中再次保存。 dfm 损坏的项目无法重建。
我运行项目时的错误是:
EReadError 读取 imagelist1.Bitmap 时出错:读取 ImageList 失败 来自流的数据
有什么建议吗?
提前致谢
【问题讨论】:
标签: delphi windows-vista
你有没有对你的 Delphi 安装做过任何有趣的事情,例如将 delphi32.exe.manifest 文件添加到 Delphi 的目录中以试图使 IDE 具有 XP 或 Vista 主题?不要那样做。如果你有那个文件,删除它,你应该会恢复正常。
图像列表格式随着通用控件库版本 6 的变化而改变,Delphi 6 无法使用它。清单告诉 IDE 使用版本 6,因此当它保存您的 DFM 时,它使用该格式。然后,在加载的时候,以前的版本就读不下去了。
【讨论】:
问题可能出在 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;
【讨论】: