views:

392

answers:

2

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...?

+2  A: 

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.

BennyBechDk
Not only can you not call it, it doesn't even work right in many cases! http://qc.embarcadero.com/wc/qcmain.aspx?d=30263
Roddy
A: 

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;
Leonardo Herrera