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

问题描述 投票:5回答:3

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

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

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

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

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

delphi tpagecontrol
3个回答
2
投票

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

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

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


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;

-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;
© www.soinside.com 2019 - 2024. All rights reserved.