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 :

TPageControl - Changer boutons de défilement


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 42
    Points
    42
    Par défaut TPageControl - Changer boutons de défilement
    Bonjour,

    Utilisant de nombreux TabSheet dans mes PageControl, les deux boutons de defilement (voir piece jointe) des onglets de sont pas assez performants, le defilement est asses fastidieux lorsque le nombre d'onglets depasse les 50 ...

    je souhaiterais donc pouvoir remplacer ces deux boutons de defilement par une liste de selection verticale permettant de visualiser une liste des onglets et de selectionner l'onglet souhaité sans avoir a faire defiler clic par clic....

    je n'ai pas trouvé de proprieté permettant de modifier le PageControl, peut-être quelqu'un d'entre vous saura me guider vers une solution.

    je vous remercie de votre attention et de toute idee

    merci

    oiapoque
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 233
    Points
    25 233
    Par défaut
    il te sera surement difficile de le faire sans surcharger le page control, mais sinon, tu n'emmerde pas, tu créé un objet avec comme parent le page control, et cet objet est un bouton qui recouvre les deux petits boutons (aligné en Rigth Top) et affiche une liste déroulante (une feneêtre en modale) qui contient la liste des tabsheet (voir pagecount/pages du control) ...

    sinon MultiLine := true;

  3. #3
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Pour ma part, je pense que c'est réalisable assez facilement!

    1) Tu ajoute un controle de type ListBox sur ta form principale
    2) Tu fais une boucle qui permet d'ajouter dans cette listview tes TabSheets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=0 to PageControl.PageCount - 1 do
      ListBox.Items.add(PageControl.Pages[i].Caption
    Ainsi, ta ListBox contient et affiche tous les titres de tes tabsheet.

    3) Tu renseignes l'événement OnClick de ta listBox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TfmMain.ListBoxClick(Sender: TObject);
    var
      TSheetIndex: integer;
    begin
      TSheetIndex := ListBox.ItemIndex;
     
      if (TSheetIndex <> -1) then
        PageControl.ActivePageIndex := TSheetIndex;
    end;
    Voila, je pense que ça devrait fonctionner

  4. #4
    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
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Citation Envoyé par Gaadek
    Pour ma part, je pense que c'est réalisable assez facilement!

    1) Tu ajoute un controle de type ListBox sur ta form principale
    2) Tu fais une boucle qui permet d'ajouter dans cette listview tes TabSheets:
    3) Tu renseignes l'événement OnClick de ta listBox:
    Voila, je pense que ça devrait fonctionner
    Oui mais de cette façon, les 2 petits boutons seront toujours visibles

    Pour avoir essayer de personnaliser un TPageControl, je peux te dire que beaucoup de choses ne sont pas aisées. En particulier redessiner complètement les onglets (bordures et fond compris) et les flèches. Bref, si tu trouves une méthode fiable, je suis (beaucoup) preneur

  5. #5
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    En lisant la question, j'avais compris qu'avec le nombre important de TabSheet, il était trop compliqué et long d'utiliser les boutons.

    D'où l'idée d'utiliser une liste qui permet de faire défiler l'ensemble des pages existantes et de sélectionner celle que l'on veut, au lieu de cliquer 50.000 fois sur les boutons.

    De plus, je vois mal comment placer une liste dans l'espace utilisé par les boutons, à moins de gérer une liste surgissante, qui disparait une fois la sélection opérée.

    Mais dans cette dernière optique, à part développer soit même un compsant dérivé du TPageContrôle, je vois difficilement comment résoudre le problème...

    Enfin, pour redessiner les éléments d'un TPagecontrol:
    - Pour les onglets, je me souviens avoir trouvé un exemple (je ne sais plus si c'est dans la FAQ ou sur le net, mais si ça intéresse du monde, je pourrai rechercher)
    - Pour insérer une image de fond sur les TabSheet, ça se fait en 2 secondes
    - Pour les flêches, j'avoue ne m'être jamais posé la question... A part dans le cadre d'un navigateur web à la Firefox, je préfère limiter le nombre de TabSheet, justement pour éviter ce problème, et ensuite parce que trop d'éléments = trop de perte de temps à retrouver celui qu'on cherche = chiant à utiliser par une autre personne etc...

    Enfin, il serait, je pense, nécessaire que Oiapoque précise un peu plus ses besoins, à savoir:

    Est-ce l'aspect graphique de son PageControl qui l'intéresse ou alors une fonctionnalité ListBox + PageControl telle que j'ai exposée lors de mon précédent message???

    Parce que comme dit Pedro, le problème n'est plus du tout le même suivant le cas...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 42
    Points
    42
    Par défaut
    En lisant la question, j'avais compris qu'avec le nombre important de TabSheet, il était trop compliqué et long d'utiliser les boutons.

    D'où l'idée d'utiliser une liste qui permet de faire défiler l'ensemble des pages existantes et de sélectionner celle que l'on veut, au lieu de cliquer 50.000 fois sur les boutons.

    De plus, je vois mal comment placer une liste dans l'espace utilisé par les boutons, à moins de gérer une liste surgissante, qui disparait une fois la sélection opérée.

    Mais dans cette dernière optique, à part développer soit même un compsant dérivé du TPageContrôle, je vois difficilement comment résoudre le problème...
    Tu as tres bien résumé la situation de mon interrogation.Voilà sur quoi je me dirige. (ListBox + PageControl)

    Il faudrait donc comme tu le dis, une liste surgissante permettant de sélectionner le tabsheet souhaité, puis qui disparait... au passage si les boutons (fleches) pouvaient disparaitre par un quelconque moyen, cela serait tres bien

    j'utilise plusieurs niveaux de pagecontrol imbriqués dont le nombre change dynamiquement, donc je me dirige vers un dérivé de TPageControl, mais débutant dans la création de composants, je ne vois pas très bien comment m'y prendre.

    Je serais preneur d'un petit exemple de classe dérivée d'un composant simple afin d'éclairer ma lanterne


    je vous remercie a tous beaucoup pour vos propositions et vos idées qui me font avancer

    oiapoque

  7. #7
    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
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par oiapoque
    j'utilise plusieurs niveaux de pagecontrol imbriqués dont le nombre change dynamiquement, donc je me dirige vers un dérivé de TPageControl, mais débutant dans la création de composants, je ne vois pas très bien comment m'y prendre.
    Déjà lis cet excellent tutoriel de notre excellent sjrd:
    http://sjrd.developpez.com/delphi/tutoriel/composants/

    Ensuite, à la lecture de ceci, j'ai l'impression que ton problème provient de "plus haut"
    Comme le dit Gaadek, si l'utilisateur doit cliquer 36000 fois pour trouver ce qu'il cherche, il risque de se lasser très vite
    Pour ma part, je n'aime pas du tout les TPageControl imbriqués. Ca devient complètement illisible.
    Bref, explique ton besoin pour voir s'il n'y a pas une méthode plus adaptée pour afficher ce dont tu as besoin

  8. #8
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Je tente tout de même d'ajouter une réponse, bien que je pense qu'elle soit imparfaite a cette heure :
    . c'est en C++Builder pour l'instant, mais je promets de le traduire en Delphi dès que j'ai le temps (et surtout si ca sert a qqchose ! )
    . je ne redessine pas entièrement les deux 'boutons' de défilement, j'obtiens juste un PopupMenu chargé avec les Caption des pages lors du click sur ces derniers.
    .dans le .h:
    Code C++ : 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
     
    class TMPC : public TPageControl
    {
     
    private:
     
            void __fastcall OnPaint(TMessage &msg);
            void __fastcall OnClickItem(TObject *Sender);
            //
            BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_PAINT, TMessage, OnPaint)
            END_MESSAGE_MAP(TPageControl)
            //
            HWND hwndUD;
            TRect rectUD;
            int NbPage;
            //
            TPopupMenu *aMenu;
    public:
        __fastcall TMPC(TComponent* Owner);
    };
    .dans le .cpp
    Code C++ : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    __fastcall TMPC::TMPC(TComponent* Owner) : TPageControl(Owner)
    {
        aMenu = new TPopupMenu(this);
        DoubleBuffered = true;
        NbPage = PageCount;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMPC::OnClickItem(TObject *Sender)
    {
        this->ActivePageIndex = aMenu->Items->IndexOf(((TMenuItem*)Sender));
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnPaint(TMessage &msg)
    {
    DefaultHandler(&msg);
     //section menu
    if (NbPage != PageCount)
    {
    aMenu->Items->Clear();
        TMenuItem *pItem;
        for ( int i = 0; i < this->PageCount; i ++)
        {
            pItem = new TMenuItem(aMenu);
            pItem->Caption = this->Pages[i]->Caption;
            pItem->OnClick = OnClickItem;
            aMenu->Items->Add(pItem);
        }
        pItem = NULL; delete pItem;
    NbPage = PageCount;
    }
    //repère position curseur / UpDown Control
    hwndUD = FindWindowEx(Handle, 0, "msctls_updown32", NULL);
    if (hwndUD != NULL)
    {
        GetWindowRect(hwndUD, &rectUD);
        if (PtInRect(rectUD, Mouse->CursorPos))
        {
            aMenu->Popup(Mouse->CursorPos.x, Mouse->CursorPos.y);
        }
    }
    }
    //----------------------------------------------------------------------------
    Je suis tombé sur un exemple de dessin personnalisé des boutons de défilement, je vais essayer d'y comprendre qqchose et d'adapter.
    En espérant t'aider,
    @ +

  9. #9
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Je poste tout de même une 'version' Delphi, cela servira peut être ...

    Je n'arrive toujours pas a redessiner completement le control de type 'msctls_updown32' qui permet de faire défiler les onglets habituellement.
    Je suis bien tombé sur un tuto (en C# ou je ne sais plus quoi), mais je n'ai pas su encore l'utiliser correctement.
    (chui movais moi ...)

    . la class:
    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
     
    TMPC = class(TPageControl)
    protected
        procedure WndProc(var msg : TMessage); override;
    private
    		procedure OnClickItem(Sender : TObject);
                      var
    		  hwndUD : HWND;
    		  rectUD : TRect;
                      NbPage : Integer;
    		  //
    		  aMenu : TPopupMenu;
    public
        constructor Create(Owner: TComponent);override;
    end;
    . Implémentation:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    //début TMPC
    constructor TMPC.Create(Owner: TComponent);
    begin
      inherited Create(Owner);
      aMenu := TPopupMenu.Create(Owner);
      DoubleBuffered := true;
      NbPage := PageCount;
    end;
    //capter le message WM_PAINT
    procedure TMPC.WndProc(var msg : TMessage);
    var
    I : integer;
    pItem : TMenuItem;
    begin
    inherited WndProc(msg);
      if msg.Msg = WM_PAINT then
      begin
      //section menu
        if NbPage <> PageCount then
        begin
          aMenu.Items.Clear;
          for I := 0 to PageCount - 1 do
            begin
            pItem := TMenuItem.Create(Self);
            pItem.Caption := Pages[I].Caption;
            pItem.OnClick := OnClickItem;
            aMenu.Items.Add(pItem);
            end;
            Inc(I);
        end;
        FreeAndNil(pItem);
      //
      hwndUD := FindWindowEx(Handle, 0, 'msctls_updown32', NIL);
      if hwndUD <> NULL then
      begin
        GetWindowRect(hwndUD, &rectUD);
        if PtInRect(rectUD, Mouse.CursorPos) then
          aMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.y);
      end;
      end;
    end;
    //OnClick des TMenuItems
    procedure TMPC.OnClickItem(Sender: TObject);
    begin
      ActivePageIndex := aMenu.Items.IndexOf(TMenuItem(Sender));
    end;
    //fin TMPC
    . Appel dans la fiche (par ex):
    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
    22
    23
    24
     
    procedure TForm2.Button10Click(Sender: TObject);
    var
    aMPC : TMPC;
    aTab : TTabSheet;
    I : integer;
    begin
    //
      aMPC := TMPC.Create(Self);
      aMPC.Parent := Self;
      aMPC.Top := Button10.Top;
      aMPC.Left := Button10.Left + Button10.Width + 10;
      aMPC.Width := 150;
    //
    for I := 1 to 10 do
      begin
        aTab := TTabSheet.Create(Self);
        aTab.Parent := Self;
        aTab.PageControl := aMPC;
        aTab.Caption := 'Page' + IntToStr(I);
      end;
      Inc(I);
    //
    end;

    @ +

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Bonjour,

    J'ai utilisé une fois un treeview pour accéder rapidement à chacune des pages.
    Avec 50 onglets, j'imagine que les données se prêtent à une organisation hierarchique.



    @+

Discussions similaires

  1. changer bouton en image cliquable
    Par ChTiRiBi dans le forum Débuter
    Réponses: 4
    Dernier message: 15/07/2009, 11h11
  2. [JScrollBar] Taille des boutons de défilement
    Par shivack dans le forum Composants
    Réponses: 2
    Dernier message: 27/08/2008, 15h25
  3. Ajout dynamique de bouton de défilement
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 27/05/2008, 13h45
  4. changer bouton on over
    Par zyongh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/02/2007, 22h51
  5. [VBA-E] changer bouton suivant état donné
    Par totoza dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/05/2006, 10h48

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