La solution :
Tout d'abord, écrire une fonction qui renvoie la valeur True si l'onglet d'indice fourni doit être désactivé. Ça, c'est à vous de voir. Voilà par exemple une fonction qui dit que l'onglet d'index 1 est désactivé :
1 2 3 4
| function TForm1.IsDisabled(ATabIndex:Integer):Boolean;
begin
Result := ATabIndex = 1;
end; |
Ensuite, il y a deux problèmes : le problème d'affichage, et le problème de désactivation.
Pour le problème d'affichage, c'est simple : comme déjà dit, il faut positionner à true la propriété OwnerDraw du PageControl. Ensuite, écrire la procédure de dessin, associée à l'évènement OnDrawTab :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
ARect: TRect;AText:string;AnIndex:Integer;
begin
AnIndex := TabIndex;
ARect := Rect;
if Control is TPageControl then
with Control as TPageControl, Canvas do
begin
Canvas.Brush.Color := clBtnFace;
FillRect(ARect);
if not(Active) then ARect.Top := ARect.Top + 4;
if IsDisabled(AnIndex)
then Canvas.Font.Color := clInactiveCaptionText
else Canvas.Font.Color := Font.Color;
AText := Pages[AnIndex].Caption;
TextRect(ARect,AText,[tfCenter,tfSingleLine,tfVerticalCenter]);
end;
end; |
Deuxième problème : la désactivation. Pour ça, je vous propose d'utiliser une variable globale, ou champ de la fiche principale, qui va intercepter la page courante à chaque changement :
(var) CurrentTabIndex : Integer;
On écrit alors un gestionnaire d'évènement OnChanging pour mettre à jour cette valeur :
1 2 3 4 5 6
| procedure TForm1.PageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
if Sender is TPageControl then with Sender as TPageControl do
CurrentTabIndex := TabIndex;
end; |
Enfin, quand il y a changement, on restaure la valeur précédemment fixée si le tab voulu par l'utilisateur est désactivé :
1 2 3 4 5
| procedure TForm1.PageControl1Change(Sender: TObject);
begin
if Sender is TPageControl then with Sender as TPageControl do
if IsDisabled(TabIndex) then TabIndex := CurrentTabIndex;
end; |
Je pense que ça correspond parfaitement à ce que vous vouliez. Mais on ne m'ôtera pas d l'idée que c'est de l'IHM zarbi, ça ! 
Edit : petite précision... les thèmes de XP ne sont pas correctement gérés, pour ne pas parler de Vista. La, à mon avis, c'est un travail bien plus difficile. On peut sans doute trouver des composants personnalisés compatibles thèmes qui permettent de changer la police pour chaque onglet ?
Partager