在Delphi项目中,我使用了一些古董(但仍然有用)的TTabSet VCL组件,共有26个标签(标记为“A”到“Z”)。使用Delphi 7编译时,一切正常。但是,使用Delphi XE8,TTabSet方法ItemAtPos返回的值略有错误。此发布的方法也在内部用于确定单击选项卡的索引,最终可能导致选择错误的选项卡。单击具有相当高的选项卡索引的选项卡时,此错误变得特别突出。在我的项目中点击“X”或“Y”标签,例如将导致选择“Z”选项卡。使用经典外观以及Windows 7的Aero Look都可以观察到这种行为。
作为初步解决方法,我已成功修补并重新编译单元Vcl.Tabs.pas,方法如下:在函数TTabSet.ItemAtPos(...)中,我稍微修改了用于计算局部变量MinLeft和MaxRight的公式如以下代码段所示(第958行至第975行):
for I := 0 to FTabPositions.Count - 1 do
begin
TabPos := TTabPos(FTabPositions[I]);
//***************** original Delphi XE8 ********************
{
MinLeft := TabPos.StartPos - Extra;
MaxRight := TabPos.StartPos + TabPos.Size + Extra;
}
//******************* Michael's patch **********************
MinLeft := TabPos.StartPos - Extra + I;
MaxRight := TabPos.StartPos + TabPos.Size + Extra + I;
//**********************************************************
if (Pos.X >= MinLeft) and (Pos.X <= MaxRight) then
begin
Result := FirstIndex + I;
Break;
end;
end;
有了这个补丁,现在一切都可以使用Delphi XE8。
问题:这是一种处理这个明显错误的可行方法,还是其他人有更好的方法来解决这个问题?