2010-01-26 2 views
4

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

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

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

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

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

+0

Зачем вам нужно «определить, какая страница связана с определенным индексом вкладок»? –

+0

@ Leonardo: Я динамически создаю страницы, и на каждой странице есть группа данных. Каждая вкладка имеет динамически генерируемую «подсказку», извлеченную из данных, заданную с помощью PageControl onMouseMove (X, Y), которая затем вызывает IndexOfTabAt (X, Y), чтобы определить, на какой вкладке находится мышь. Достаточно? – Roddy

ответ

2

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

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

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

+2

Вы не только не можете это назвать, но даже во многих случаях это не работает! http://qc.embarcadero.com/wc/qcmain.aspx?d=30263 – Roddy

-1

Here is an old article, который занимается перетаскиванием & сбрасывая страницы. У него есть некоторая логика для получения индекса страницы из позиции (X, Y), возможно, вы можете ее использовать. Что-то вроде этого (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; 
Смежные вопросы