我正在使用TPageControl,其中某些页面不可见。
这会破坏TabIndex和ActivePageIndex属性的正常1:1映射。
在大多数地方,我可以使用ActivePageIndex(或ActivePage本身)来获取当前页面,但我想要一个动态工具提示提示,这需要我确定哪个页面与特定选项卡索引相关联。
如果我调用pageControl.IndexOfTabAt(X,Y),我会返回一个Tab Index,但我无法直接将其用作Pages []数组的索引,因为某些页面选项卡不可见。
我可以明确地遍历页面,忽略可见的页面,但感觉VCL中应该有一些东西已经为我做了这个......?
答案 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;