IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Rendre un onglet inaccessible.


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut Rendre un onglet inaccessible.
    Salut delphistes

    Je voudrais rendre un onglet inaccessible, voire invisible, si une certaine condition est remplie.

    Aucune des instructions suivantes ne donne de résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Condition then  TabSheet4.Enabled := False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Condition then  PageControl1.Pages[4].Enabled := False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Condition then  TabSheet4.Visible := False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Condition then  PageControl1.Pages[4].Visible := False
    Cette opération est-elle réellement impossible ?

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Self.PageControl1.Pages[i].TabVisible := false

  3. #3
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Ok, cela fonctionne.
    Mais je préfèrerais garder l'onglet visible mais grisé ("not enabled").
    Est-ce possible ?

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    visiblement non

  5. #5
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Regrettable.
    La compilation ne devrait pas laisser passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PageControl1.Pages[4].Enabled := False;

  6. #6
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par defluc
    Regrettable.
    La compilation ne devrait pas laisser passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PageControl1.Pages[4].Enabled := False;
    Si tu fais ça, ça compile? Si oui est-ce que tu peux sélectionner l'onglet 4? Si non, il te suffit alors de redessiner toi-même uniquement le(s) tab(s) inactif(s) avec OnDrawTab
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  7. #7
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Ce qui est inexplicable, c'est que malgré l'exécution de l'instruction en question, l'onglet reste accessible.

  8. #8
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Citation Envoyé par defluc
    Regrettable.
    La compilation ne devrait pas laisser passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PageControl1.Pages[4].Enabled := False;
    Mais bien sûr que si ! Par cette instruction, c'est la page qui est désactivée, pas l'onglet !

    Regarde bien : après une telle instruction, le TabSheet index 4 sera visible, mais désactivé ! S'il contient des boutons, on ne pourra pas cliquer dessus !

    J'ai l'impression qu'il y a confusion entre l'onglet et la page, les onglets malheureusement ne peuvent pas être désactivés (ce n'est tout simplement pas prévu par Windows, je viens de jeter un œil sur msdn) , mais les pages associées, si.

    D'un point de vue IHM, ça peut se défendre : l'utilisateur peut sélectionner la page pour voir ce qu'elle contient, mais ne peut pas agir dessus tant qu'elle est désactivée.

  9. #9
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    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é :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (var) CurrentTabIndex : Integer;
    On écrit alors un gestionnaire d'évènement OnChanging pour mettre à jour cette valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

Discussions similaires

  1. d'access cacher ou rendre visible onglet excel
    Par likinter dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/10/2008, 15h37
  2. [E-07] Rendre un onglet visible ou non dans le ruban
    Par zit_zit dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 29/09/2008, 19h00
  3. Réponses: 4
    Dernier message: 20/07/2007, 16h08
  4. [VB.NET]Comment rendre les menus inaccessible?
    Par Pedro Varela dans le forum Windows Forms
    Réponses: 7
    Dernier message: 19/10/2006, 13h22
  5. Rendre un onglet inactif sur un TPAGECONTROL
    Par richard038 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 12/09/2005, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo