5

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

这打破了 TabIndex 和 ActivePageIndex 属性的正常 1:1 映射。

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

如果我调用 pageControl.IndexOfTabAt(X, Y),我会得到一个选项卡索引,但我不能直接将它用作 Pages[] 数组的索引,因为某些页面选项卡是不可见的。

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

4

3 回答 3

2

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

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

那就是你想要的。但是你不能调用它(D2007),所以(不幸的是)你必须复制代码。

于 2010-01-26T13:22:22.983 回答
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;
于 2018-09-13T05:16:29.267 回答
-1

这是一篇关于拖放页面的旧文章。它有一些逻辑可以从(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;
于 2010-01-27T13:59:36.060 回答