TTabSet - Delphi XE8中错误的标签位置

时间:2016-03-26 11:05:44

标签: delphi tabs delphi-xe8

在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。

问题:这是一种处理这个明显错误的可行方法,还是其他人有更好的方法来解决这个问题?

0 个答案:

没有答案