Vista Service Pack 2上的Delphi 6似乎无法从dfm加载图像列表并在IDE中再次保存。 dfm损坏的项目无法重建。
运行项目时的错误是:
EReadError读取imagelist1.Bitmap时出错:无法读取ImageList 来自流的数据
任何建议?
提前致谢
答案 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;