如何将Delphi TPageControl“tab index”转换为“page index”?

时间:2010-01-26 10:54:03

标签: delphi tpagecontrol

我正在使用TPageControl,其中某些页面不可见。

这会破坏TabIndex和ActivePageIndex属性的正常1:1映射。

在大多数地方,我可以使用ActivePageIndex(或ActivePage本身)来获取当前页面,但我想要一个动态工具提示提示,这需要我确定哪个页面与特定选项卡索引相关联。

如果我调用pageControl.IndexOfTabAt(X,Y),我会返回一个Tab Index,但我无法直接将其用作Pages []数组的索引,因为某些页面选项卡不可见。

我可以明确地遍历页面,忽略可见的页面,但感觉VCL中应该有一些东西已经为我做了这个......?

3 个答案:

答案 0 :(得分:2)

我在TPageControl(ComCtrls.pas)的源代码中查看,有一个私有方法:

function TPageControl.PageIndexFromTabIndex(TabIndex: Integer): Integer;

做你想做的事。 但你不能称之为(D2007),所以(不幸的是)你必须复制代码。

答案 1 :(得分:0)

此版本似乎有效:

function PageIndexFromTabIndex(const pageControl : TPageControl; const TabIndex: Integer): Integer;
 var
    i : Integer;
 begin
   Result := TabIndex;
   for i := 0 to Pred(pageControl.PageCount) do
     begin
       if not pageControl.Pages[i].TabVisible then
         Inc(Result);
       if TabIndex = pageControl.Pages[i].TabIndex then
         break;
     end;
  end;

答案 2 :(得分:-1)

Here is an old article处理拖动和放大丢页。它有一些从(X,Y)位置获取页面索引的逻辑,也许你可以使用它。像这样(未经测试):

function TMyPageControl.GetPageIndexAtPos(X, Y: Integer) : Integer;
const
   TCM_GETITEMRECT = $130A;
var
   TabRect: TRect;
   j: Integer;    
begin
   for j := 0 to PageCount - 1 do
   begin
     Perform(TCM_GETITEMRECT, j, LParam(@TabRect)) ;
     if PtInRect(TabRect, Point(X, Y)) then
     begin
       Result := j;
       exit;
     end;
   end;
   Result := -1;
end;