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

VBA Access Discussion :

[VBA]Menu contextuel dynamique dans un état


Sujet :

VBA Access

  1. #21
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 71
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Non, je te rassurre, je visais effectivement la propriété ShortcutMenuBar de chacun des controles de mon form.
    Mais je ne suis pas encore expert en code et si je comprends bien le Me doit désigner le formulaire actif et non le contrôle actif.

    Donc mon code doit être, dans chaque form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Function MenuCtxl()
    If ............... Then
    ActiveControl.ShortcutMenuBar = "Menu 1"
    Else
    ActiveControl.ShortcutMenuBar = "Menu 2"
    End If
    End Function
    Et sur le Got Focus de chaque controle, je mets :
    Merci de ton aide JBO.

  2. #22
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 71
    Points : 46
    Points
    46
    Par défaut
    Re

    Citation Envoyé par =JBO=
    Je veux bien t'aider, mais j'ai besoin que tu me donnes un exemple de ta manière de créer un menu contextuel et aussi les genres d'actions que tu veux appliquer.
    Excuses, mais je n'avais pas vu ton second message.
    J'avoue bien imblement que je n'ai pas tout compris...

    J'ai pas le temps dans l'immédiat, mais je te répond dès que ...
    Merci encore.

  3. #23
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 71
    Points : 46
    Points
    46
    Par défaut
    ReBonjour

    Citation Envoyé par =JBO=
    Sais-tu que les contrôles des Commandbars d'Office ont une propriété OnAction qui peut être paramétrée avec un nom d'une procédure VBA (Sub ou Function) qui sera automatiquement exécutée si on clique (ou agit) sur le contrôle du menu contextuel ?
    J'ai bien relu ton message.
    Oui je sais que je peux paramétrer cette propriété pour les barres de menus, barre d'outils et menus contextuels même personnalisés.
    Ca pourrait être une partie de la solution.

    Mais je t'explique dans le détail ce que je recherche en prenant un exemple :

    J'ai une application qui gère les usagers d'un service d'aides ménagères à domicile. Ces personnes bénéficient de prises en charge de la part de leurs caisses de retraites. Ces prises en charge ont bien entendu une période de validité (DateDébut et DateFin)
    J'ai donc crée tout logiquement un Form FicheUsager avec un SousForm en mode continu qui donne l'historique des prises en charge de l'usager concerné.
    Dans le souci de bien cadrer l'utilisation de l'appli (car après c'est BiBi qui se colle aux pbs de facturation) j'ai verrouillé les enregistrements qui ne sont plus actuels (ceux dont DateFin > DateDuJour) de telle sorte que l'utilisateur moyen n'ait la possibilité que de travailler sur l'enregistrement actuel.
    J'arrive au menu contextuel.
    Mon souci est qu'il faut également que je sécurise la commande SupprimerEnregistrement.
    Pour avoir un formulaire plus "propre" j'ai supprimé les sélecteurs d'enrgistrement (qui permettent la suppression de plusieurs enregistrements avec la touche Suppr) et j'ai volontairement écarté l'option d'un bouton de commande.
    Je voulais donc intégrer cette commande SupprimerEnregistrement à un menu contextuel (Cf les commandes détaillées au code de mon premier post sur le sujet) et si possible la rendre désactivée (grisée) lorsque l'utilisateur est un utilisateur moyen et n'est pas sur l'enregistrement en cours (donc soumettre l'aspect des commandes à des conditions).

    Si j'utilise un menu contextuel personnalisé :
    • je ne peux que jouer sur la présence ou non de la commande en créant deux menus contextuels différents et en appelant l'un ou l'autre selon le cas.

    • si je ne fais q'un seul menu contextuel je peux effectivement renvoyer cette commande sur la propriété OnAction à une macro ou une fonction qui géreront la condition avec un MsgBox avertissant l'utilisateur que la commande est indisponible.

    Bref un peu compliqué et pas bien pratique.

    Par contre, si j'utilise un menu contextuel dynamique (Cf. le code de Tofalu) je peux gérer le fait que certaines commandes de mon menu soient désactivées en fonction des conditions.
    Cette piste complètement paramétrable m'a semblé hyper-intéressante.

    En adaptant le code, j'ai bien réussi à composer mon Menu contextuel et à la faire apparaître, mais j'au un souci lors de l'exécution des commandes (Fermer ou SupprimerEnregistrement) apparemment lié à un pb d'ouverture ou de fermeture du menu contextuel.

    Voila, j'ai été un peu long, mais j'espère que tu as une vision précise de ma question.

    Merci par avance de ton aide.

  4. #24
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 71
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Citation Envoyé par marcb03
    j'ai verrouillé les enregistrements qui ne sont plus actuels (ceux dont DateFin > DateDuJour)
    J'ai fait une petite erreur de frappe qui n'échappera pas au lecteur attentif : lire "(ceux dont DateFin < DateDuJour)"

    Désolé et merci d'avance

  5. #25
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par marcb03
    Voila, j'ai été un peu long, mais j'espère que tu as une vision précise de ma question.
    Merci d'avoir pris le temps de tout expliquer, je vois mieux comment t'aider...

    Pour commencer:
    - pour faciliter la discussion on va bien distinguer, d'une part les menus contextuels basés sur l'API Windows, et d'autre part les menus contextuels (ou non) fournis par Microsoft Office.
    - je ne te parlerai que de solutions utilisant Microsoft Office.
    - avec Microsoft Office, on parle de barres de commandes (CommandBars).
    - les barres de commandes Office permettent d'implémenter: (1) des barres de menus avec d'éventuels sous-menus, (2) des barres d'outils, (3) des menus contextuels.

    Ensuite, voici quelques réflexions:
    - Avec Microsoft Office, il est possible de créer dynamiquement un menu contextuel à la manière de ce que propose Tofalu.
    - Si tu utilises la propriété ShortCutMenuBar, elle doit être impérativement renseignée avec le nom d'une barre de commandes existante; sinon, un petit carré est affiché (je crois que tu connais bien le phénomène ).

    Citation Envoyé par marcb03
    Si j'utilise un menu contextuel personnalisé :
    • je ne peux que jouer sur la présence ou non de la commande en créant deux menus contextuels différents et en appelant l'un ou l'autre selon le cas.
    Tu peux aussi, avoir un seul menu contextuel mais que tu configureras en fonction du contexte (forcément ).
    Le momen opportun pour le configurer serait l'ouverture d'un formulaire ou encore le focus sur un contrôle (cf. les événements).

    Pour configurer le menu contextuel, tu peux agir sur les propriétés Enabled et Visible des contrôles contenus dans le menu.
    Citation Envoyé par marcb03
    Par contre, si j'utilise un menu contextuel dynamique (Cf. le code de Tofalu) je peux gérer le fait que certaines commandes de mon menu soient désactivées en fonction des conditions.
    Cette piste complètement paramétrable m'a semblé hyper-intéressante.
    Tu comprends que ce que je t'explique plus haut devrait aussi pouvoir satisfaire tes besoins.
    Citation Envoyé par marcb03
    En adaptant le code, j'ai bien réussi à composer mon Menu contextuel et à la faire apparaître, mais j'au un souci lors de l'exécution des commandes (Fermer ou SupprimerEnregistrement) apparemment lié à un pb d'ouverture ou de fermeture du menu contextuel.
    Si l'ouverture du Menu contextuel est gérée via ShortCutMenuBar et si l'exécution de l'action est directement contrôlée par le Menu contextuel, ça ne devrait pas poser de problème...

    En revanche, si c'est toi qui pilote l'affichage du menu contextuel, que tu récupères l'index du contrôle qui a été cliqué et que tu exécutes toi même un certain code (déterminé par l'index), il est possible que certaines actions soient indisponibles (ex. fermer un formulaire avec une procédure événementielle de ce formulaire en cours d'excéution). Dans ce cas, il faut peut être envisager une exécution asynchrone (mais ça devient bien plus compliqué).

  6. #26
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 71
    Points : 46
    Points
    46
    Par défaut
    Bonjour JBO

    Citation Envoyé par =JBO=
    Tu peux aussi, avoir un seul menu contextuel mais que tu configureras en fonction du contexte (forcément ).
    Le momen opportun pour le configurer serait l'ouverture d'un formulaire ou encore le focus sur un contrôle (cf. les événements).

    Pour configurer le menu contextuel, tu peux agir sur les propriétés Enabled et Visible des contrôles contenus dans le menu.
    Tu comprends que ce que je t'explique plus haut devrait aussi pouvoir satisfaire tes besoins.
    Je comprends tout à fait que c'est ce que je recherche, mais mes modestes compétences ne me permettent pas de voir comment je peux agir sur les propriétés Enabled et Visible des contrôles contenus dans le menu contextuel personnalisé que j'aurai construit dans MSAccess.

    Citation Envoyé par =JBO=
    En revanche, si c'est toi qui pilote l'affichage du menu contextuel, que tu récupères l'index du contrôle qui a été cliqué et que tu exécutes toi même un certain code (déterminé par l'index), il est possible que certaines actions soient indisponibles (ex. fermer un formulaire avec une procédure événementielle de ce formulaire en cours d'excéution). Dans ce cas, il faut peut être envisager une exécution asynchrone (mais ça devient bien plus compliqué).
    Et encore moins d'envisager cela.

    Je préfère donc largement la première solution, mais un petit coup de pouce serait le bienvenu.

    Merci

  7. #27
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par marcb03
    [...] mais un petit coup de pouce serait le bienvenu.
    Avant tout, un petit tour sur MSDN pour voir comment fonctionnent et se programment les barres de commandes d'Office:
    http://msdn.microsoft.com/library/fr...arcontrols.asp

  8. #28
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Premier exemple: création dynamique d'un menu contextuel Office
    Voici un premier exemple basé sur le premier message de cette discussion.

    La procédure VBA donnée ci-dessous permet de créer un menu contextuel, basé sur un objet CommandBar d'Office.

    Ici, le menu contextuel est temporaire, c'est-à-dire qu'il ne sera plus disponible à la prochaine exécution de l'application Access.

    Dans ce premier exemple, tous les contrôles du menu utilisent des commandes intégrées d'Access (je ne personnalise pas le libellé, ni l'icône affichés).
    Ces commandes de menus intégrées sont identifiées par un code que vous pouvez retrouver grâce à un petit utilitaire maison :
    http://www.developpez.net/forums/sho...d.php?t=288404

    Pour information...
    Les identifiants des commandes sont affectés aux propriétés Id des contrôles.
    Si la valeur de la propriété Id est égale à 1, alors il s'agit d'une commande personnalisée (suite au prochain post...).

    Il faut ajouter une référence à la bibliothèque Office.
    Son nom doit ressembler à quelque chose comme:
    "Microsoft Office x.0 Object Library"
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Option Compare Database
    Option Explicit
     
    Const sNomMenuContextuel As String = "menu contextuel marcb03"
     
    Public Sub CréerMenuContextuelTemporaire()
        Dim oBar As Office.CommandBar
     
        ' On se protège !
        ' Si le menu contextuel existe déjà, on le supprime.
        On Error Resume Next
        Application.CommandBars(sNomMenuContextuel).Delete
     
        On Error GoTo 0
        Set oBar = Application.CommandBars.Add(sNomMenuContextuel, msoBarPopup, , True)
     
        ' "Zoom ajusté"
        oBar.Controls.Add msoControlButton, 6
     
        ' "Zoom à 10 %"
        oBar.Controls.Add msoControlButton, 1834
     
        ' "Zoom à 25 %"
        oBar.Controls.Add msoControlButton, 1833
     
        ' "Zoom à 50 %"
        oBar.Controls.Add msoControlButton, 1832
     
        ' "Zoom à 75 %"
        oBar.Controls.Add msoControlButton, 1831
     
        ' "Zoom à 100 %"
        oBar.Controls.Add msoControlButton, 7
     
        ' "Zoom à 150 %"
        oBar.Controls.Add msoControlButton, 1830
     
        ' "Zoom à 200 %"
        oBar.Controls.Add msoControlButton, 1829
     
        ' "Imprimer" précédé d'un trait de séparation
        With oBar.Controls.Add(msoControlButton, 4)
            .BeginGroup = True
        End With
     
        ' "Exporter dans Word" précédé d'un trait de séparation
        With oBar.Controls.Add(msoControlButton, 567)
            .BeginGroup = True
        End With
     
        ' "Exporter dans Excel"
        oBar.Controls.Add msoControlButton, 566
     
        ' "Fermer" précédé d'un trait de séparation
        With oBar.Controls.Add(msoControlButton, 106)
            .BeginGroup = True
        End With
    End Sub

  9. #29
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Deuxième exemple: création dynamique d'un menu contextuel Office
    Voici un deuxième exemple, toujours basé sur le premier message de cette discussion, et là encore le menu contextuel est temporaire.
    Mais cette fois on utilise une technique différente:
    toutes les commandes sont traitées dans une procédure VBA nommée ActionMenuContextuel.

    Cette procédure VBA récupère la référence du contrôle CommandBarControl qui a été "actionné" par l'utilisateur.
    On vérifie que le contrôle appartient effectivement à notre menu contextuel.
    Le contrôle possède une propriété Index qui donne sa position dans la barre de commandes. C'est pratique est simple pour sélectionner l'action à exécuter.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Option Compare Database
    Option Explicit
     
    Const sNomMenuContextuel As String = "menu contextuel marcb03"
     
    Public Sub CréerMenuContextuelTemporaire()
        Dim oBar As Office.CommandBar
        Dim vCmds As Variant, v As Variant, bBeginGroup As Boolean
     
        ' On se protège !
        ' Si le menu contextuel existe déjà, on le supprime.
        On Error Resume Next
        Application.CommandBars(sNomMenuContextuel).Delete
     
        On Error GoTo 0
        Set oBar = Application.CommandBars.Add(sNomMenuContextuel, msoBarPopup, , True)
     
        ' Liste des commandes du menu
        vCmds = Array("Zoom ajusté", "Zoom à 10 %", "Zoom à 25 %", "Zoom à 50 %", _
                    "Zoom à 75 %", "Zoom à 100 %", "Zoom à 150 %", "Zoom à 200 %", _
                    "|", "Imprimer", _
                    "|", "Exporter dans Word", "Exporter dans Excel", _
                    "|", "Fermer")
     
        For Each v In vCmds
            If v = "|" Then
                ' annoncer un début de groupe (trait de séparation)
                bBeginGroup = True
            Else
                ' ajouter un contrôle
                With oBar.Controls.Add(msoControlButton, 1)
                    .BeginGroup = bBeginGroup
                    .Caption = v
                    .OnAction = "ActionMenuContextuel"
                End With
     
                bBeginGroup = False
            End If
        Next v
    End Sub
     
    Public Sub ActionMenuContextuel()
        Dim oCtrl As Office.CommandBarControl
     
        On Error GoTo ExitSub
     
        Set oCtrl = Application.CommandBars.ActionControl
     
        If oCtrl.Parent.Name = sNomMenuContextuel Then
            Select Case oCtrl.Index
            Case 1: DoCmd.RunCommand acCmdFitToWindow
            Case 2: DoCmd.RunCommand acCmdZoom10
            Case 3: DoCmd.RunCommand acCmdZoom25
            Case 4: DoCmd.RunCommand acCmdZoom50
            Case 5: DoCmd.RunCommand acCmdZoom75
            Case 6: DoCmd.RunCommand acCmdZoom100
            Case 7: DoCmd.RunCommand acCmdZoom150
            Case 8: DoCmd.RunCommand acCmdZoom200
            Case 9: DoCmd.RunCommand acCmdPrint
            Case 10
                DoCmd.OutputTo acReport, Screen.ActiveReport.Name, acFormatRTF, , True
            Case 11
                DoCmd.OutputTo acReport, Screen.ActiveReport.Name, acFormatXLS, , True
            Case 12
                DoCmd.Close acReport, Screen.ActiveReport.Name, acSaveYes
            End Select
        End If
     
    ExitSub:
        ' fini !
    End Sub
    Bien sûr, il est tout à fait possible de combiner, dans la même barre de commandes, des contrôles utilisant des actions intégrées d'Access (cf. premier exemple) et des contrôles personnalisés comme dans ce deuxième exemple.

  10. #30
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Dernier exemple: configurer le menu contextuel
    Supposons que notre menu contextuel soit utilisé dans différents états.
    Cependant, pour certains d'entre eux on souhaite cacher les commandes de Zoom, ou encore désactiver les commandes d'Export.

    Voici la procédure ConfigurerMenuContextuel qui configure les commandes de Zoom et d'Export du menu contextuel en fonction des valeurs des paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Sub ConfigurerMenuContextuel(bZoom As Boolean, bOutputTo As Boolean)
        Dim i As Integer
     
        With Application.CommandBars(sNomMenuContextuel)
            For i = 1 To 8
                .Controls(i).Visible = bZoom
            Next i
     
            .Controls(10).Enabled = bOutputTo
            .Controls(11).Enabled = bOutputTo
        End With
    End Sub
    Il est possible que plusieurs états soient ouverts simultanément.
    Pour que notre menu contextuel soit toujours correctement configuré en fonction du contexte (ici tel ou tel état), la procédure de configuration est exécutée à chaque fois qu'un état est activé.

    Voici un extrait du module de code d'un objet Report, où la procédure événementielle exécute la procédure de configuration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Report_Activate()
        ConfigurerMenuContextuel True, False
    End Sub

  11. #31
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 71
    Points : 46
    Points
    46
    Par défaut


    Bonjour JBO,

    Je prends connaissance de tes posts de la nuit ... et je vois que tu t'es largement investi sur le sujet et je t'en remercie vraiment.

    De mon côté et suite aux infos que tu m'avais fournies hiers dans la journée, j'ai avancé sur le menu contextuel de mes forms en créant un menu contextuel personnalisé dans MS Access MenuContextuel Ecran.
    Enfin j'ai réussi à monter le code suivant (que j'ai encore amélioré suite à ton tout dernier post) et qui donne la fonction suivante que j'ai placée dans un module :
    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
    Public Function MenuContextuel_Ecran()
    With Application.CommandBars("MenuContextuel Ecran")
        Dim i As Integer
        For i = 1 To 11
            .Controls(i).Enabled = True
        Next i
    End With
    If Screen.ActiveControl = "" Then
        Application.CommandBars("MenuContextuel Ecran").Controls("Copier").Enabled = False
    End If
    If Screen.ActiveControl.Locked = True Or [Forms]![GESTION]![CodeAccès] = "Consultant" Then
        Application.CommandBars("MenuContextuel Ecran").Controls("Coller").Enabled = False
        Application.CommandBars("MenuContextuel Ecran").Controls("Supprimer l'enregistrement").Enabled = False
        Application.CommandBars("MenuContextuel Ecran").Controls("Nouvel enregistrement").Enabled = False
    End If
    If Screen.ActiveControl = "" Or Screen.ActiveControl.Locked = True Or Screen.ActiveControl.IsHyperlink = False Then
        Application.CommandBars("MenuContextuel Ecran").Controls("Lien hypertexte").Enabled = False
    End If
    End Function
    Enfin, j'ai renseigné chaque contrôle (j'ai besoin que le menu contextuel ne soit actif que sur les controls) de mes forms sur la propriété "Barre de menu contextuel" par MenuContextuel Ecran et j'ai placé sur le GotFocus de chacun de mes controls une ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call MenuContextuel_Ecran
    Et ça marche

    Je considérais donc mon pb comme résolu.

    Mais je vois dans tes derniers posts que tu donne deux exemples de création de menus contextuels par le code qui semblent très intéressants.
    En dehors du fait que le menu est temporaire dans le 1er ex et pas dans le 2ème, peux-tu m'en dire plus sur les avantages/inconvénients des deux solutions?

    Par ailleurs, sur ton tout dernier post, j'avoue ne pas tout décrypter le code que tu as mis. C'est quoi Boolean ?

    Merci encore!
    Comme quoi il faut persévérer

  12. #32
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par marcb03
    De mon côté et suite aux infos que tu m'avais fournies hiers dans la journée, j'ai avancé sur le menu contextuel de mes forms en créant un menu contextuel personnalisé dans MS Access MenuContextuel Ecran.
    Enfin j'ai réussi à monter le code suivant (que j'ai encore amélioré suite à ton tout dernier post) et qui donne la fonction suivante que j'ai placée dans un module :
    [...]
    Enfin, j'ai renseigné chaque contrôle (j'ai besoin que le menu contextuel ne soit actif que sur les controls) de mes forms sur la propriété "Barre de menu contextuel" par MenuContextuel Ecran et j'ai placé sur le GotFocus de chacun de mes controls une ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call MenuContextuel_Ecran
    Et ça marche

    Je considérais donc mon pb comme résolu.
    Je suis content pour toi !
    Ça fait plaisir de voir que tu as abouti à un bon résultat.
    Je pense aussi que ton Pb initial est résolu.

    Citation Envoyé par marcb03
    Mais je vois dans tes derniers posts que tu donne deux exemples de création de menus contextuels par le code qui semblent très intéressants.
    Je voulais simplement présenter 2 solutions VBA de création de menus contextuels pour Access, comme alternatives au code de Tofalu qui utilise l'API Windows.

    Citation Envoyé par marcb03
    En dehors du fait que le menu est temporaire dans le 1er ex et pas dans le 2ème, [...]
    Dans les deux cas il s'agit de barres de commandes Office temporaires. Je n'ai peut être pas été très clair sur ce point...

    Avec la méthode CommandBars.Add utilisée pour créer une barre de commandes, tu peux choisir de rendre cette barre de commandes permanente ou temporaire.

    Tu devrais consulter l'aide en ligne VBA Office:
    Citation Envoyé par l'aide en ligne VBA Office

    Add, méthode (collection CommandBars)

    Crée une nouvelle barre de commandes et l'ajoute à la collection de barres de commandes. Renvoie un objet CommandBar.

    Syntaxe
    CommandBars.Add(Name, Position, MenuBar, Temporary)
    Citation Envoyé par marcb03
    [...] peux-tu m'en dire plus sur les avantages/inconvénients des deux solutions?
    Je pense qu'il vaut mieux s'appuyer sur les commandes intégrées d'Access, dès lors qu'elles répondent exactement à ton besoin.
    Tu peux quand même personnaliser la présentation: changer le libellé, mettre une autre icône, activer/désactiver, cacher/montrer le contrôle.

    Je te rappelle qu'il est possible de combiner au sein de la même barre de commandes des contrôles intégrés d'Access et des contrôles personnalisés (propriété OnAction).

    Par ailleurs, d'une façon générale, je préfère construire mes barres de commandes par programmation.
    C'est une préférence personnelle et non pas un principe sacro-saint.
    J'ai l'impression de mieux maîtriser mes barres de commandes et je peux facilement réutiliser mon code d'une application à une autre.

    ... et puis, à la longue, je trouve que c'est un peu pénible de construire les barres de commande par l'interface utilisateur.
    Exemples de limitations de l'interface utilisateur (Access 2000, pour les autres ???):
    tu ne peux pas vérifier si la propriété Id est correcte !
    tu ne peux pas attribuer une icône parmi celles disponibles dans la "collection" des icônes Office (et oui, tu peux utiliser n'importe quelle icône d'Office pour tes contrôles perso via la propriété FaceId !)
    Citation Envoyé par marcb03
    Par ailleurs, sur ton tout dernier post, j'avoue ne pas tout décrypter le code que tu as mis. C'est quoi Boolean ?
    Dans nos programmes, nous avons besoin de gérer différentes types de données: des nombres, des dates, des chaînes de caractères, etc.

    Le type de données booléen permet de représenter une valeur logique: Vrai ou Faux.
    En VBA, il existe des mots clés pour désigner tout ça:
    • Type de données booléen Boolean
    • Vrai True
    • Faux False

  13. #33
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 71
    Points : 46
    Points
    46
    Par défaut
    Re

    Citation Envoyé par =JBO=
    Je pense aussi que ton Pb initial est résolu.
    Je confirme et je t'en remercie.

    Citation Envoyé par =JBO=
    Par ailleurs, d'une façon générale, je préfère construire mes barres de commandes par programmation.
    [...] J'ai l'impression de mieux maîtriser mes barres de commandes et je peux facilement réutiliser mon code d'une application à une autre.

    ... et puis, à la longue, je trouve que c'est un peu pénible de construire les barres de commande par l'interface utilisateur.
    C'est aussi ce que je pensais a priori.
    Et je ne manquerai pas de me repencher sur le sujet pour explorer cette voie.


+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Création d'un menu contextuel dynamique.
    Par femfem dans le forum WinDev
    Réponses: 1
    Dernier message: 19/11/2007, 15h43
  2. Réponses: 3
    Dernier message: 30/03/2007, 08h24
  3. [C#] Menu contextuel explorer dans mon application
    Par mikyfpc dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/11/2005, 13h45
  4. [VB6] menu contextuel dynamique
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/07/2003, 11h53

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