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. #1
    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 [VBA]Menu contextuel dynamique dans un état
    Bonjour,

    A partir des exemples que j'ai pu trouvé sur ce site et que j'ai bien entendu tenté d'adapter à mon application, j'ai créé un menu contextuel dynamique pour des états affichés en mode apperçu avant impression.

    Voici le code:

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    Private Const MF_CHECKED = &H8&
    Private Const MF_APPEND = &H100&
    Private Const TPM_LEFTALIGN = &H0&
    Private Const MF_DISABLED = &H2&
    Private Const MF_GRAYED = &H1&
    Private Const MF_SEPARATOR = &H800&
    Private Const MF_STRING = &H0&
    Private Const TPM_RETURNCMD = &H100&
    Private Const TPM_RIGHTBUTTON = &H2&
     
    Private Type POINTAPI
    X As Long
    Y As Long
    End Type
     
    Private Declare Function CreatePopupMenu Lib "user32" () As Long
     
    Private Declare Function TrackPopupMenuEx Lib "user32" _
    (ByVal hMenu As Long, ByVal wFlags As Long, ByVal X As Long, _
    ByVal Y As Long, ByVal HWnd As Long, ByVal lptpm As Any) As Long
     
    Private Declare Function GetSystemMenu Lib "user32" _
    (ByVal HWnd As Long, ByVal bRevert As Long) As Long
     
    Private Declare Function AppendMenu Lib "user32" Alias _
    "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, _
    ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
     
    Private Declare Function DestroyMenu Lib "user32" _
    (ByVal hMenu As Long) As Long
     
    Private Declare Function GetCursorPos Lib "user32" _
    (lpPoint As POINTAPI) As Long
     
    Public Function MenuContextuel_Etat()
    Dim Pt As POINTAPI
    Dim result As Long
    Dim hMenu As Long
    Dim TypeMenu1 As Long
    Dim TypeMenu2 As Long
    Dim TypeMenu3 As Long
    Dim TypeMenu4 As Long
    Dim TypeMenu5 As Long
    Dim TypeMenu6 As Long
    Dim TypeMenu7 As Long
    Dim TypeMenu8 As Long
    Dim TypeMenu9 As Long
    Dim TypeMenu10 As Long
    Dim TypeMenu11 As Long
    Dim TypeMenu12 As Long
    TypeMenu1 = MF_STRING
    TypeMenu2 = MF_STRING
    TypeMenu3 = MF_STRING
    TypeMenu4 = MF_STRING
    TypeMenu5 = MF_STRING
    TypeMenu6 = MF_STRING
    TypeMenu7 = MF_STRING
    TypeMenu8 = MF_STRING
    TypeMenu9 = MF_STRING
    TypeMenu10 = MF_STRING
    TypeMenu11 = MF_STRING
    TypeMenu12 = MF_STRING
    hMenu = CreatePopupMenu()
    AppendMenu hMenu, TypeMenu1, 1, "Zoom ajusté"
    AppendMenu hMenu, TypeMenu2, 2, "Zoom à 10 %"
    AppendMenu hMenu, TypeMenu3, 3, "Zoom à 25 %"
    AppendMenu hMenu, TypeMenu4, 4, "Zoom à 50 %"
    AppendMenu hMenu, TypeMenu5, 5, "Zoom à 75 %"
    AppendMenu hMenu, TypeMenu6, 6, "Zoom à 100 %"
    AppendMenu hMenu, TypeMenu7, 7, "Zoom à 150 %"
    AppendMenu hMenu, TypeMenu8, 8, "Zoom à 200 %"
    AppendMenu hMenu, MF_SEPARATOR, 9, ByVal 0&
    AppendMenu hMenu, TypeMenu9, 10, "Imprimer"
    AppendMenu hMenu, MF_SEPARATOR, 11, ByVal 0&
    AppendMenu hMenu, TypeMenu10, 12, "Exporter dans Word"
    AppendMenu hMenu, TypeMenu11, 13, "Exporter dans Exel"
    AppendMenu hMenu, MF_SEPARATOR, 14, ByVal 0&
    AppendMenu hMenu, TypeMenu12, 15, "Fermer"
    GetCursorPos Pt
    result = TrackPopupMenuEx(hMenu, _
    TPM_LEFTALIGN Or TPM_RETURNCMD _
    Or TPM_RIGHTBUTTON, Pt.X, Pt.Y, Screen.ActiveReport.HWnd, ByVal 0&)
    DestroyMenu hMenu
    Select Case result
    Case 1
    On Error GoTo Err
    DoCmd.RunCommand acCmdFitToWindow
    Case 2
    On Error GoTo Err
    DoCmd.RunCommand acCmdZoom10
    Case 3
    On Error GoTo Err
    DoCmd.RunCommand acCmdZoom25
    Case 4
    On Error GoTo Err
    DoCmd.RunCommand acCmdZoom50
    Case 5
    On Error GoTo Err
    DoCmd.RunCommand acCmdZoom75
    Case 6
    On Error GoTo Err
    DoCmd.RunCommand acCmdZoom100
    Case 7
    On Error GoTo Err
    DoCmd.RunCommand acCmdZoom150
    Case 8
    On Error GoTo Err
    DoCmd.RunCommand acCmdZoom200
    Case 10
    On Error GoTo Err
    DoCmd.RunCommand acCmdPrint
    Case 12
    On Error GoTo Err
    DoCmd.OutputTo acReport, Screen.ActiveReport.Name, "RichTextFormat(*.rtf)", , True, ""
    Case 13
    On Error GoTo Err
    DoCmd.OutputTo acReport, Screen.ActiveReport.Name, "MicrosoftExcel(*.xls)", , True, ""
    Case 15
    On Error GoTo Err
    DoCmd.Close acReport, Screen.ActiveReport.Name, acSaveYes
    Err: FormattedMsgBox "Cette commande est indisponible!@Contactez le support technique de cette application.@", vbCritical, ApplicationNameApi()
    End Select
    End Function
    Le problème est que lorsque je sélectionne l'une des commandes de ce menu, j'ai l'apparition à l'endroit du curseur d'un petit carré (1cm x 1cm) sans aucun bouton ni texte, que je ne peux pas déplacer, et que je peux juste fermer en cliquant ailleurs sur l'aperçu de mon état.

    Par ailleurs, sur les cases 12, 13 et 15 (Word, Exel et Fermer), j'ai une erreur dont j'ai obtenu l'identifiant en supprimant la ligne On Error GoTo Err : Erreur d'exécution 2585 - Impossible d'exécuter cette action pendant le traitement d'un évènement d'un ... état.

    J'ai l'impressio qu'il s'agit d'un problème de fermeture du menu contextuel, mais je n'en suis pas sûr.

    Quelqu'un peut-il me dire ce qu'il manque à ce code ?

    Merci d'avance.

  2. #2
    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
    Personne n'a une idée.
    Le sujet me semble pourtant intéressant ...

    Merci

  3. #3
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonsoir,
    Pour l'instant ....pas de réponse.....mais avant il serait bien que tu mettes tout ton code VBA entre les balises #.......
    Ré-édite ton post et corrige tout ça....

    Dans ton code, as-tu essayé de supprimer tous tes contrôles d'erreur
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

  4. #4
    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,

    Excuses-moi, mais je débute vraiment en code et j'essaye de comprendre.
    C'est quoi tes balises ?

    Pour répondre à ta question, j'ai effectivement essayé de supprimer On Error GoTo Err

    Citation Envoyé par marcb03
    Par ailleurs, sur les cases 12, 13 et 15 (Word, Exel et Fermer), j'ai une erreur dont j'ai obtenu l'identifiant en supprimant la ligne On Error GoTo Err : Erreur d'exécution 2585 - Impossible d'exécuter cette action pendant le traitement d'un évènement d'un ... état.

  5. #5
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Re,
    Tout d'abord, pourquoi avoir changer une partie du code.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    result = TrackPopupMenuEx(hMenu, _
    TPM_LEFTALIGN Or TPM_RETURNCMD _
    Or TPM_RIGHTBUTTON, Pt.X, Pt.Y, Screen.ActiveReport.HWnd, ByVal 0&)
    Ensuite as-tu essayé de faire un menu contextuel ordinaire (non dynamique) et de le déclarer dans la propriété "Barre de menus contextuel" de ton état....
    Sinon fait une simple barre d'outils personnels sur ton etat...c'est aussi rapide et autant convivial...et en plus pratiquement pas de code VBA...
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

  6. #6
    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 FreeAccess
    Re,
    Tout d'abord, pourquoi avoir changer une partie du code.....
    Tous simplement parceque cela ne fonctionnait pas, cad que mon menu contextuel ne disparaissait pas si je cliquais à un autre endroit de mon aperçu.
    De plus, j'avais une erreur et ouverture de la fenêtre de débogage.

    Citation Envoyé par FreeAccess
    Ensuite as-tu essayé de faire un menu contextuel ordinaire (non dynamique) et de le déclarer dans la propriété "Barre de menus contextuel" de ton état....
    Sinon fait une simple barre d'outils personnels sur ton etat...c'est aussi rapide et autant convivial...et en plus pratiquement pas de code VBA...
    Oui bien sûr, sauf que je voulais éviter d'avoir à refaire cette barre de menu contextuel pour chacune de mes 15 applications ... et encore moins une barre d'outils à chaque état de mes applications.
    De plus, j'ai monté un menu contextuel dynamique pour les formulaires qui permet d'activer ou désactiver certaines commandes en fonction des données et des utilisateurs. Je voulais rester dans la même logique et avoir quelque chôse de centralisé plus pratique en maintenance.

    @+

  7. #7
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,
    Oui bien sûr, sauf que je voulais éviter d'avoir à refaire cette barre de menu contextuel pour chacune de mes 15 applications ...
    Sauf erreur de ma part, mais tu n'es pas obligé de tout refaire pour une nouvelle application...il suffit d'importer tes barres de menus / outils dans cette application....
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

  8. #8
    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
    Effectivement,

    J'ai cherché dans l'aide et cela semble possible.

    Mais je préférerais largement rester sur un menu contextuel dynamique - peut-être plus difficile à mettre en oeuvre - mais plus souple et qui constitue une solution très intéressante à partir du moment ou j'aurai bouclé le code nécessaire.

    Pour revenir à mon problème, j'ai la totale conviction que le petit carré de 1cm de côté qui apparaît lorsque je clique sur une commande du menu contextuel dynamique est la cause de l'erreur.

    Manifestement, ce forum permet de mettre en commun des compétences très pointues en Access et en VB. S'il était possible que mon pb attire l'attention, je pense que nous pourrions avancer.

    PS: Je vois que qqu'un à remis en forme le code de mon premier message.
    Merci et désolé car je ne savais pas pour les balises. Je ne demande qu'à apprendre.

  9. #9
    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,

    Je reviens à la charge avec mon pb.
    Je n'ai pas la solution, mais j'ai avancé.

    Je me suis orienté vers la confection de barres de menu contextuel personnalisées (Menu - Outils ...) que j'appelle avec le code suivant de façon à utiliser telle ou telle barre en fonction de l'utilisateur et des données.

    Voici le code qui appelle l'ouverture du menu contextuel et que je lance à partir de l'état ou j'ai préalablement renseigné l'argument "Menu contextuel" avec "=MenuCtxl()":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function MenuCtxl()
    CommandBars("Menu").ShowPopup
    End Function
    Le pb (et qui me conforte qq part) c'est que j'ai toujours un message d'erreur à peu près identique (au moins dans l'esprit) lorsque je clique sur une commande "Fermer" de ce menu contextuel : "Impossible d'exécuter cette action pendant le traitement d'un évènement de formulaire ou d'état"

    Le souci vient donc du code d'ouvertue du menu contextuel, car si je renseigne l'argument "Menu contextuel" avec "MenuCtxl", cad sans passer par le code, je n'ai aucun souci.

    Merci de vos contributions.

  10. #10
    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,

    Toujours sans réponse.
    Je remonte le sujet.

  11. #11
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,
    Bien, comme je suis intrigué par ta façon de faire ton menu contextuel sur un état...... ....je te livre ici, mes propres observations sur la façon d'arriver à un résultat satisfaisant:

    En premier, je crée un simple menu contextuel "Menu Etat", ne comportant qu'un seul élément "Fermer".
    L'action de "Fermer" est relié à une macro du type:
    Action

    OuvrirFormulaire...............Ainsi je passe le focus au Form de mon choix
    Fermer...........................Maintenant je ferme mon état
    Sur l'état, dans propriété "Barre de menu contextuel = Menu Etat"

    Voilà c'est tout.......maintenant, sur mon état, l'action du clic droit fait bien apparaitre mon menu contextuel avec l'élément 'Fermer'.
    Sur clic de 'Fermer', j'ai dans l'ordre l'ouverture d'un de mes formulaires et ensuite la fermeture de mon état qui a ce moment là n'a plus le focus....

    Pour moi, je pense (au vue des messages d'erreur) que tu essaie de fermer ton état, alors qu'il est encore actif (focus).

    Cela t'apporte t'il une solution.....
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

  12. #12
    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 FreeAccess
    En premier, je crée un simple menu contextuel "Menu Etat", ne comportant qu'un seul élément "Fermer".
    L'action de "Fermer" est relié à une macro du type:

    Sur l'état, dans propriété "Barre de menu contextuel = Menu Etat"

    Voilà c'est tout.......
    Je suppose qu'il s'agit d'un menu contextuel personnalisé dans le menu "Outils" "Personaliser..."

    Citation Envoyé par FreeAccess
    maintenant, sur mon état, l'action du clic droit fait bien apparaitre mon menu contextuel avec l'élément 'Fermer'.
    Jusque là je suis d'accord avec toi.

    Citation Envoyé par FreeAccess
    Sur clic de 'Fermer', j'ai dans l'ordre l'ouverture d'un de mes formulaires et ensuite la fermeture de mon état qui a ce moment là n'a plus le focus....

    Pour moi, je pense (au vue des messages d'erreur) que tu essaie de fermer ton état, alors qu'il est encore actif (focus).

    Cela t'apporte t'il une solution.....
    A supposer que l'ouverture d'un formulaire soit voulue à la fermeture de l'état, cela ne solutionne pas mon pb.

    Lorsque je renseigne dans mon état la propriété "Barre de menu contextuel" par "Menu Etat", c'est à dire que je pointe directement sur le menu contextuel personnalisé construit dans Access par "Outils" "Personaliser...", la commande Fermer de ce menu contextuel fonctionne parfaitement.

    Mais lorsque je renseigne dans mon état la propriété "Barre de menu contextuel" par "=MenuCtxl()", c'est à dire que je pointe sur la fonction construite en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function MenuCtxl()
    CommandBars("Menu").ShowPopup
    End Function
    qui me permettra sous condition d'ouvrir tel ou tel menu contextuel personnalisé construit dans Access par "Outils" "Personaliser..." (par ex "Menu Etat"), la même commande Fermer de ce menu contextuel ne fonctionne plus.

    Même chose lorsque je recourre à un menu contextuel dynamique, cad entièrement construit avec du code (Cf le code de mon premier message).

    Après fermeture du message d'erreur, j'ai l'apparition, au point précis d'insertion du menu contextuel, d'un petit carré gris d'1 cm de coté, comme un menu contextuel mais sans aucune commande et que je ne peux fermer qu'en cliquant ailleurs sur l'apreçu de mon état.

    Le pb se produit non seulement pour la commande fermer mais également pour les commandes "Exporter vers Word" ou Exel.
    Pour les commandes "Zoom", pas de pb, mais après l'exécution du zoom demandé, il y a également apparition de ce petit carré.
    Comme si le menu contextuel n'était pas fermé ou comme s'il en ouvrait un second par dessous le premier ...

    Le pb n'est donc pas lié à la commande actionnée sur le menu contextuel, pas plus qu'à la fermeture de l'état, mais plutôt à l'ouverture ou la fermeture du menu contextuel.

    Il manque qq chose à ce code.

    Merci de ton aide

  13. #13
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,
    Je suppose qu'il s'agit d'un menu contextuel personnalisé dans le menu "Outils" "Personaliser..."
    Oui, c'est cela.....
    qui me permettra sous condition d'ouvrir tel ou tel menu contextuel personnalisé construit dans Access par "Outils" "Personaliser......
    Pour cela, et en gardant l'option de passer par une fonction..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function MenuCtxl()
    Select Case Screen.ActiveReport.Name
        Case "Etat1"
            Screen.ActiveReport.ShortcutMenuBar = "Menu Etat"
        Case "Etat2"
            Screen.ActiveReport.ShortcutMenuBar = "ContextuelEtat"
    End Select
    End Function
    En cherchant un peu, tu peux également remplacer par des conditions au lieu du nom de l'état.......
    Après test, cela fonctionne presque...... .....le seul problème est qu'au premier "appel" du clic droit tu as systématiquement l'apparition de ce fameux petit carré de couleur, tu reclic et le menu s'affiche correctement..

    Voila, en espérant faire un peu avancer ton probème....
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

  14. #14
    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 FreeAccess
    En cherchant un peu, tu peux également remplacer par des conditions au lieu du nom de l'état.......
    C'était bien le but du jeu. Sauf que cela m'oblige à avoir construire autant de menus personnalisés ("Outils" "Personaliser..." ...) que de conditions alors qu'en paramétrant un menu contextuel dynamique par le code, ce menu s'adapte en fonction des conditions qu'on lui spécifie.

    Citation Envoyé par FreeAccess
    Après test, cela fonctionne presque...... .....le seul problème est qu'au premier "appel" du clic droit tu as systématiquement l'apparition de ce fameux petit carré de couleur, tu reclic et le menu s'affiche correctement..
    Je te remercie de ton aide, mais c'est quand même un sérieux inconvénient ...

    En fait, dès qu'on passe par le code pour ouvrir un menu contextuel (qu'il soit personalisé ou dynamique) on a le même pb avec l'apparition de ce petit carré qui génère une erreur lors de l'appel d'une commande de ce menu.

    Je m'étais inspiré du code source de Tofalu (http://access.developpez.com/sources...ContextMenuAPI) qui m'avait semblé très intéressant et ouvrir plein de possibilités mais cela ne fonctionne pas.
    Je lui ai laissé un message privé, mais je n'ai pas de réponse.
    Toutefois, je ne désespère pas d'attirer l'attention d'une grande pointure du code qui nous aidera à trouver la solution.

    @ bientôt et merci.

  15. #15
    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,

    Encore moi et ma discussion.
    Désolé de m'incruster mais je viens juste remonter le sujet.

    Merci à toutes les contributions.

  16. #16
    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 Résumé du sujet
    Bonjour,

    Désolé et tant pis si j'ai l'impression d'embêter le monde avec mon pb.
    Je suis étonné qu'en dehors de FreeAccess, aucun expert du code n'aie pris le temps de se pencher sur le sujet que je résume de la façon suivante pour faire très court :

    De manière à obtenir des menus contextuels adaptés en fonction des formulaires, des champs et des utilisateurs (ou bien des états et des utilisateurs), j'ai programmé l'ouverture de ces menus à partir de code VBA.
    Je m'étais inspiré du code source de Tofalu (http://access.developpez.com/sources...ContextMenuAPI) qui m'avait semblé très intéressant et ouvrir plein de possibilités mais cela ne fonctionne pas car l'ouverture d'un menu contextuel par le code génère une erreur qui contrarie l'exécution des commandes de ce menu.


    Merci de votre aide.

  17. #17
    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
    Désolé et tant pis si j'ai l'impression d'embêter le monde avec mon pb.
    Je suis étonné qu'en dehors de FreeAccess, aucun expert du code n'aie pris le temps de se pencher sur le sujet [... ]
    Puisque tu en parles, et sans vouloir être désobligeant, c'est vrai que tu es un peu... disons un peu exigeant.
    FreeAccess a déjà consacré pas mal de temps sur ton Post, et comme il semble largement qualifié pour t'aider...

    -=-=-=-=-=-=-=-=-=-=-=-=--=-

    Maintenant, pour revenir à ton souci, je ne vois pas d'autre possibilité que de paramétrer la propriété ShortcutMenuBar à l'ouverture du formulaire. Ici, je suppose que MenuCtxl() est une fonction qui retourne le nom du menu contextuel ad-hoc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Report_Open(Cancel As Integer)
        Me.ShortcutMenuBar = MenuCtxl()
    End Sub
     
    Public Function MenuCtxl() As String
        MenuCtxl = "Menu Etat"
    End Function
    Ou alors, tu gères toi-même la souris, tu captures le clic droit et tu affiches le menu contextuel, sans t'appuyer sur la propriété ShortcutMenuBar.
    C'est comme ça que s'y prend Tofalu dans le code que tu cites en référence (événement MouseUp).

  18. #18
    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 =JBO=
    Puisque tu en parles, et sans vouloir être désobligeant, c'est vrai que tu es un peu... disons un peu exigeant.
    Eh bien, je suis désolé, mais j'ai absolument besoin de cette solution.
    Et puis, c'est en insistant que l'on obtient parfois la solution, la preuve!

    Ton idée est bonne. Je n'y avais pas pensé.
    Pour les états, pas de pb : je désigne directement le menu contextuel personnalisé dans la propriété "Menu contextuel" car a priori il n'y a pas de condition particulière.
    Pour les formulaires, c'est un peu plus complexe, car il me faudra construire plusieurs menus contextuels personnalisés (un pour chaque cas de figure) et insérer sur la réception focus de chaque contrôle le code que tu m'as indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If ............... Then
    Me.ShortcutMenuBar = "Menu 1"
    Else
    Me.ShortcutMenuBar = "Menu 2"
    End If
    Comme on doit pouvoir importer les barre d'outils et de menu d'une appli à l'autre (pas les barres de menus contextuels cependant), cela devrait être gérable.

    Je regrette cependant de ne pas pouvoir utiliser le code de Tofalu : De mémoire, si tu as regardé, il prend l'exemple de commandes telles que "mettre le texte du contrôle en majucule".
    J'ai bien entendu adapté ce code pour d'autres commandes (telle que "fermer" par ex), mais soit j'ai loupé qq chose, soit le code de Tofalu ne permet de gérer ce type de commande qui semble relativement basique dans un menu contextuel.
    J'aurais bien voulu aller jusqu'au bout de cette piste. (Têtu la bête) .

    Merci tout de même!

  19. #19
    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
    Hello le courageux coriace,
    Citation Envoyé par marcb03
    Pour les formulaires, c'est un peu plus complexe, car il me faudra construire plusieurs menus contextuels personnalisés (un pour chaque cas de figure) et insérer sur la réception focus de chaque contrôle le code que tu m'as indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If ............... Then
    Me.ShortcutMenuBar = "Menu 1"
    Else
    Me.ShortcutMenuBar = "Menu 2"
    End If
    Sais-tu que, dans les formulaires, les contrôles possèdent aussi leurs propres propriétés ShortCutMenuBar ?

    Pourquoi ne pas initialiser toutes les propriétés ShortCutMenuBar (Forms + Controls) soit à la main lors de la conception du formulaire, soit par programmation, à l'ouverture du formulaire ?
    Pas besoin d'agir sur la propriété ShortCutMenuBar du formulaire à la réception du focus sur chaque contrôle... à toi de voir.

  20. #20
    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
    Je regrette cependant de ne pas pouvoir utiliser le code de Tofalu : De mémoire, si tu as regardé, il prend l'exemple de commandes telles que "mettre le texte du contrôle en majucule".
    J'ai bien entendu adapté ce code pour d'autres commandes (telle que "fermer" par ex), mais soit j'ai loupé qq chose, soit le code de Tofalu ne permet de gérer ce type de commande qui semble relativement basique dans un menu contextuel.
    J'aurais bien voulu aller jusqu'au bout de cette piste. (Têtu la bête) .
    Je ne comprends pas à quels problèmes tu te heurtes.

    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 ?

    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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