2010-01-26 10 views
4

J'utilise un TPageControl, où certaines pages ne sont pas visibles.Comment convertir Delphi TPageControl "tab index" en "page index"?

Cela interrompt le mappage 1: 1 normal des propriétés TabIndex et ActivePageIndex.

Dans la plupart des endroits que je peux utiliser ActivePageIndex (ou ActivePage lui-même) pour obtenir la page en cours, mais je veux un soupçon d'info-bulle dynamique qui me demande de déterminer quelle page est associée à un index de tabulation spécifique. Si j'appelle pageControl.IndexOfTabAt (X, Y), je récupère un index de tabulation, mais je ne peux pas l'utiliser directement comme un index dans le tableau Pages [], car certains onglets de page ne sont pas visibles.

Je pourrais expliquer explicitement parcourir les pages, en ignorant les visibles, mais il se sent comme il devrait y avoir quelque chose dans la VCL qui fait cela pour moi déjà ...?

+0

Pourquoi avez-vous besoin de "déterminer quelle page est associée à un index de tabulation spécifique"? –

+0

@Leonardo: Je crée dynamiquement des pages et chaque page a un groupe de membres de données. Chaque onglet a un "indice" généré dynamiquement extrait des données, défini par le PageControl onMouseMove (X, Y) qui appelle ensuite IndexOfTabAt (X, Y) pour déterminer quel onglet la souris est terminée. Assez? – Roddy

Répondre

2

Je vous regardez dans la source de TPageControl (ComCtrls.pas), il existe une méthode privée:

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

qui fait ce que vous voulez. Mais vous ne pouvez pas l'appeler (D2007), donc (malheureusement) vous devez copier le code.

+2

Non seulement vous ne pouvez pas l'appeler, il ne fonctionne même pas dans de nombreux cas! http://qc.embarcadero.com/wc/qcmain.aspx?d=30263 – Roddy

-1

Here is an old article qui fait glisser avec & pages déroulantes. Il a une certaine logique pour obtenir l'index d'une page à partir d'une position (X, Y), peut-être vous pouvez l'utiliser. Quelque chose comme ceci (non testé):

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;