【问题标题】:How to convert Delphi TPageControl "tab index" to "page index"?如何将Delphi TPageControl“标签索引”转换为“页面索引”?
【发布时间】:2011-01-09 11:31:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么需要“确定哪个页面与特定的标签索引相关联”?
  • @Leonardo:我正在动态创建页面,每个页面都有一堆数据成员。每个选项卡都有一个从数据中提取的动态生成的“提示”,由 PageControl onMouseMove(X,Y) 设置,然后调用 IndexOfTabAt(X,Y) 来确定鼠标在哪个选项卡上。够了吗?

标签: delphi tpagecontrol


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

这个版本似乎可以工作:

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;

【讨论】:

    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 2014-02-04
      相关资源
      最近更新 更多