如何将Delphi TPageControl“选项卡索引”转换为“选项卡索引”到“页面索引”?

发布于 2024-08-19 01:15:08 字数 345 浏览 7 评论 0原文

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

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

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

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

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

I'm using a TPageControl, where certain pages are not visible.

This breaks the normal 1:1 mapping of the TabIndex and ActivePageIndex properties.

In most places I can use ActivePageIndex (or ActivePage itself) to get the current page, but I want a dynamic tooltip hint which requires me to determine which page is associated with a specific tab index.

If I call pageControl.IndexOfTabAt(X, Y), I get a Tab Index back, but I can't directly use that as an index into the Pages[] array, as some page tabs aren't visible.

I could explicity iterate through the pages, ignoring the visible ones, but it feels like there should be something in the VCL that does this for me already...?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一袭白衣梦中忆 2024-08-26 01:15:08

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

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

可以执行您想要的操作。
但你不能调用它(D2007),所以(不幸的是)你必须复制代码。

I you look in the source for TPageControl (ComCtrls.pas), there is a private method:

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

that does what you want.
But you can't call it (D2007), so (unfortunately) you have to copy the code.

稀香 2024-08-26 01:15:08

这个版本似乎有效:

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;

This version seems to work:

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;
讽刺将军 2024-08-26 01:15:08

这是一篇旧文章,涉及拖动和拖动。掉页。它有一些从(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;

Here is an old article that deals with dragging & dropping pages. It has some logic to obtain the index of a page from an (X, Y) position, perhaps you can use it. Something like this (untested):

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文