Как преобразовать Delphi TPageControl «индекс вкладки» в «индекс страницы»? - PullRequest
5 голосов
/ 26 января 2010

Я использую TPageControl, где определенные страницы не видны.

Это нарушает нормальное отображение 1: 1 свойств TabIndex и ActivePageIndex.

В большинстве мест я могу использовать ActivePageIndex (или сам ActivePage), чтобы получить текущую страницу, но мне нужна подсказка динамической подсказки, которая требует, чтобы я определил, какая страница связана с определенным индексом вкладки.

Если я вызываю pageControl.IndexOfTabAt (X, Y), я получаю индекс табуляции обратно, но я не могу напрямую использовать его как индекс в массиве Pages [], поскольку некоторые вкладки страниц не видны.

Я мог бы детально просматривать страницы, игнорируя видимые, но такое чувство, что в VCL должно быть что-то, что уже делает это для меня ...?

Ответы [ 3 ]

2 голосов
/ 26 января 2010

Если вы посмотрите в источнике TPageControl (ComCtrls.pas), есть частный метод:

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

это делает то, что вы хотите. Но вы не можете назвать его (D2007), поэтому (к сожалению) вы должны скопировать код.

0 голосов
/ 13 сентября 2018

Эта версия, кажется, работает:

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;
0 голосов
/ 27 января 2010

Вот старая статья , которая касается перетаскивания страниц. Он имеет некоторую логику для получения индекса страницы из позиции (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;
...