Le guide Oracle Forms 9i/10g
Date de publication : Juin 2005
Les Menus
Définition
Concept
Mise en oeuvre
Techniques avancées
Les Menus
Définition
Un menu est un composant indépendant permettant d'afficher une barre de menus.
Concept
Un menu permet d'exécuter certaines actions via les options de la barre.
Cette action peut être le chargement d'une autre forme en mémoire (Call_Form()), l'insertion d'un nouvel enregistrement (Do_Key('Create_record')), le lancement d'un état (Web.Show_Document()), le lancement d'un programme externe (Host()), l'appel d'une procédure stockée, etc.
Un module menu peut contenir les composants suivants:
- Bibliothèques PL/SQL
- Groupes d'objets
- Unités de programme
- Classes de propriétés
- Attributs visuels
Même s'il s'agit d'un module indépendant il ne peut pas être affiché tel quel, mais doit être associé à une forme, via la propriété:
Fonctionnel -> Module menu d'un formulaire.
Les modules menu sont gérés dans l'interface de Forms Builder.
Les fichiers sources ont l'extension .MMB
Les fichiers exécutables otn l'extension .MMX
La version exécutable (*.MMX) d'un menu doit être copiée dans l'un des répertoires mappés dans la variable d'environnement FORMS90_PATH du fichier de configuration <ORACLE_HOME>\forms90\server\default.env
Mise en oeuvre
Forms dispose d'un menu standard : DEFAULT
Ce menu est totalement intégré à Forms et ne peut donc être modifié.
Pour utiliser ce menu standard, il suffit d'indiquer son nom dans la propriété Fonctionnel -> Module Menu du module formulaire.
Si vous souhaitez modifier ce menu, Forms met à disposition deux modules menu situés dans le répertoire /demos/dfltmenu
- menudef.mmb menu standard sans barre d'icônes
- menudefs.mmb menu standard avec barre d'icônes
Ces deux menus "francisés" sont livrés avec les fichiers d'exemple
l'éditeur graphique
Bien qu'il soit possible de gérer un module menu depuis la fenêtre du navigateur d'objets, il est plus facile de le gérer depuis l'éditeur de menu.
Pour afficher le menu dans l'éditeur de menu, double-cliquez sur le nud principal du menu
La sélection des entrées/options, l'ajout et/ou la suppression d'objets est accessible depuis la barre d'outils horizontale
La barre d'outils horizontale
Icône |
Description |
 |
Permet dajouter une option au menu |
 |
Permet dajouter une autre entrée de menu |
 |
Ces icônes permettent de développer ou comprimer la section sélectionnée |
 |
Permet la réorganisation des menus entre eux |
Créer un menu
Pour créer un nouveau module menu depuis Forms Builder, actionner le menu Fichier -> Nouveau -> Menu
Les propriétés du module:
Fonctionnel
Nom désigne le nom interne du menu
Menu principal indique à partir de quelle entrée le menu sera affiché
Nom de fichier menu indique le nom physique du fichier menu
Code de démarrage permet d'implémenter du code PL/SQL qui sera exécuté dès le chargement du menu
Partager bibliothèque indique si les données stockées en librairie seront visibles depuis le menu
Sécurité menu
Sécurité indique si la sécurité par rôles est activée ou non
Rôles module permet d'indiquer la liste des rôles qui seront habilités à afficher le menu
Ajouter une entrée de menu
Une entrée de menu correspond au niveau hiérarchique le plus élevé (Fichier, Edition, Affichage,
)
Depuis le navigateur
Cliquer le nud Menus puis l'icône
Depuis l'éditeur graphique
Cliquer l'icône
Les propriétés d'une entrée de menu

Menu détachable indique si l'utilisateur pourra déplacer l'entrée de menu sur l'écran
Ajouter une option de menu
Une option de menu est attachée à une entrée particulière.
Seule l'option de menu peut exécuter une action
Depuis le navigateur
Cliquer le nud Menus -> Eléments de l'entrée correspondante puis l'icône
Depuis l'éditeur graphique
Sélectionner l'entrée
Cliquer l'icône
Remarque:
Une option peut être également un autre sous-menu
Les propriétés d'une option de menu
Fonctionnel
Activé indique si l'option sera active à l'exécution
Cette propriété peut être modifiée à l'exécution avec l'instruction:
Set_Menu_Item_Property(
, ENABLED, PROPERTY_TRUE | PROPERTY_FALSE)
Libellé indique le libellé affiché de l'option
Cette propriété peut être modifiée à l'exécution avec l'instruction:
Set_Menu_Item_Property(
, LABEL, 'nouveau libellé' )
Type d'option de menu peut prendre l'une des valeurs suivantes
- Simple
- Case à cocher
- Bouton option
- Séparateur
- Magique
Elément de menu magique désigne le type d'élément magique
Groupe de boutons associés indique le groupe de boutons option
Type de commande peut être
Code d'élément menu contient le code PL/SQL associé à l'option
Raccourci clavier permet d'associer une fonction à l'item. Le code de cette fonction doit être saisie dans un déclencheur de type ACCELERATOR1 à ACCELERATOR5
Visible dans le menu indique si l'option est visible à l'exécution
Cette propriété peut être modifiée à l'exécution avec l'instruction:
Set_Menu_Item_Property(
, VISIBLE, PROPERTY_TRUE | PROPERTY_FALSE)
Visible dans la barre d'outils horizontale indique si l'option (l'icône) sera visible dans la barre d'outils horizontale
Visible dans la barre d'outils verticale indique si l'option (l'icône) sera visible dans la barre d'outils verticale
Icône dans menu indique si une icône sera affichée dans l'option de menu
Nom de fichier icône désigne le nom (sans extension) du fichier icône associé à l'option
Cette propriété peut être modifiée à l'exécution avec l'instruction:
Set_Menu_Item_Property(
, ICON_NAME, 'nom_fichier_icone' )
Sécurité menu
Rôles élément permet de sélectionner les rôles qui auront accès à l'option
Afficher sans droit d'accès indique si l'option sera affichée si l'utilisateur n'a pas le rôle adéquat. Si Non, l'option n'est pas affichée. Si Oui, elle est affichée mais grisée (désactivée)
Physique
Visible indique si l'option sera affichée à l'exécution
Les différents types d'item menu
- Simple c'est le cas des options standard
- Case à cocher
- Bouton option
- Séparateur insère une ligne de separation entre les options
- Magique désigne une option de type magique
Les types de commande
- Null (obligatoire si l'option de menu est un séparateur)
- Menu (obligatoire si l'otion est un sous-menu)
- PL/SQL (par défaut indique que l'action est du code PL/SQL)
- Plus*
- Form*
- Macro*
* Ces options sont encore présente par souci de compatibilité avec les anciennes versions. Elles ne devraient plus être utilisées
Les items menu magique
- About (l'action doit être implémentée par le développeur)
- Copy copie le contenu dans le presse papier
- Clear
- Cut supprime le contenu et le place dans le presse papier
- Paste colle le contenu du presse papier
- Help (l'action doit être implémentée par le développeur)
- Quit Affiche une demande d'enregistrement lorsque l'utilisateur quitte la forme
- Undo (l'action doit être implémentée par le développeur)
- Window affiche la liste des fenêtres ouvertes de l'application
Touche d'accélération d'une option
Chaque option de menu peut être dotée d'une touche d'accélération.
Il s'agit d'une lettre qui, tapée avec la touche Alt, provoquera la sélection du menu.
Par défaut, Forms prend la première lettre en majuscule du libellé de l'option.
Par exemple, si le libellé de votre option de menu est Enregistrer, la touche d'accélération par défaut sera le E majuscule. C'est cette lettre qui apparaîtra soulignée à l'exécution et qui déclenchera l'action avec la touche Alt+E
Vous pouvez spécifier une autre lettre en la faisant précéder du caractère : &
Par exemple, si vous souhaitez que le touche d'accélération soit : r, entrez En®istrement dans votre libellé.
Remarque:
Pour insérer le caractère & dans votre libellé de menu, il faut le doubler (Enregistrer && quitter)
Sécurité dans les menus
Il est possible d'activer/désactiver automatiquement un menu, une entrée de menu ou une option en utilisant les rôles créés dans la base.
La barre de menu étant généralement le principal point d'accès aux formes, il est aisé de personnaliser (autoriser/interdire) l'accès aux options de menu en leur affectant une liste de rôles autorisés.
Affecter une liste de rôles au niveau module
La propriété Sécurité menu -> Rôles module du niveau module permet d'afficher la liste des rôles créés en base.
Il est possible de créer de nouveaux rôles simplement en ajoutant leur nom dans la liste (Forms gère automatiquement la création du rôle en base)
Il est également possible de supprimer un rôle de la liste (et donc l'accès au menu pour les utilisateurs) en effaçant son nom dans la liste.

Ensuite, pour chaque entrée de menu et/ou pour chaque option, il est possible de désigner les rôles qui seront autorisés à activer l'option
Par exemple, sur l'option de menu Enregistrer de l'entrée Action, nous n'autorisons que les utilisateurs ayant le rôle CLERKS et/ou MANAGER a activer cette option.
Affichons la fenêtre de propriétés de l'item ACTION.SAVE et cliquons sur le bouton Suite
de la propriété Rôle élément
A l'exécution, si l'utilisateur connecté n'a ni le rôle CLERCKS ni le rôle MANAGERS, le menu sera affiché de deux façons différentes selon la valeur indiquée dans la propriété Sécurité menu -> Afficher sans droit d'accès:
- Si la propriété est valorisée à Oui, l'option sera affichée grisée et non active
- Si la propriété est valorisée à Non, l'option ne sera pas affichée
Remarque:
L'application des rôles définis au niveau des options de menu ne sera prise en compte que si la propriété Sécurité menu -> Sécurité est valorisée à OUI
Rappel sur la création des rôles en base
Pour créer et affecter un rôle à un utilisateur, effectuez les actions suivantes:
Créer un rôle
CREATE ROLE nom_role ;
Affecter le rôle à un utilisateur
GRANT nom_role TO nom_utilisateur ;
Assigner le rôle par défaut à la connexion de l'utilisateur
ALTER USER nom_utilisateur DEFAULT ROLE liste_des_roles ;
Pour plus de précisions sur la gestion des rôles et des privilèges consultez l'article: Administration : Rôles et privilèges
Utilisation du PL/SQL
Le code PL/SQL peut être inséré dans un menu dans les objets suivants :
- Code de démarrage (startup code)
- Propriété Code d'élément menu d'une option
- Unité de programme du module menu
Tout code PL/SQL et appel des fonctions natives sont permis dans un menu.
Si le code PL/SQL manipule des objets situés dans une forme, il ne peut pas les atteindre directement mais seulement pas indirection avec les fonctions:
COPY()
NAME_IN()
:block.item := 12 ;
Copy( 12, 'block.item' ) ;
Vous pouvez attachez les librairies PL/SQL à un menu et donc bénéficier de toutes les procédures et fonctions présentes dans ces librairies
Compiler un module menu
Menu Programme -> Compiler module
Ou Ctrl+t
Cette opération compile l'intégralité du code PL/SQL et génère un fichier portant l'extension .MMX
Attention:
Si vous livrez une forme à laquelle un menu est attaché, veillez à livrer le module exécutable du menu (*.MMX)
Les fonctions natives relatives aux menus
Modifier une propriété d'une option de menu
Set_Menu_Item_Property( id_menu | nom_menu, propriété, valeur ) ;
propriété peut être:
- CHECKED
- ENABLED
- ICON_NAME
- LABEL
- VISIBLE
L'identifiant interne d'une option de menu (id_menu) peut être retrouvé avec la fonction Find_Menu_Item()
Declare
mi_id MenuItem;
valeur VARCHAR2(10);
Begin
mi_id := Find_Menu_Item('MENU.CHKBOX');
valeur := Get_Menu_Item_Property(mi_id,CHECKED);
If valeur = 'TRUE' Then
Set_Menu_Item_Property(mi_id,CHECKED,PROPERTY_FALSE);
Else
Set_Menu_Item_Property(mi_id,CHECKED,PROPERTY_TRUE);
End if ;
End ;
Interroger une propriété d'une option de menu
Get_Menu_Item_Property( id_menu | nom_menu, propriété, valeur ) ;
Propriété prend les même valeur que pour l'instruction Set_Menu_Item_Property()
Remplacer le menu en cours
Replace_Menu ;
Replace_Menu( 'nom_menu_module', type_menu ) ;
Replace_Menu( 'nom_menu_module', type_menu, nom_menu_depart ) ;
Replace_Menu( 'nom_menu_module', type_menu, nom_menu_depart, nom_groupe ) ;
Replace_Menu( 'nom_menu_module', type_menu, nom_menu_depart, nom_groupe, use_file ) ;
Replace_Menu() est une procédure non restreinte.
Elle remplace le menu de toutes les fenêtres de l'application.
Si une forme est appelée avec Call_Form(), le menu est remplacé pour les deux formes.
nom_menu_module désigne le nom du module menu. S'il n'est pas indiqué, Forms supprime le menu en cours
type_menu peut valoir PULL_DOWN
nom_menu_depart désigne le point de départ (entrée de menu) dans le menu désigné
nom_groupe permet de spécifier un rôle attaché au menu
use_file ne peut prendre qu'une seule valeur : TRUE
Techniques avancées
Utilisation de l'instruction Do_Key()
Plutôt que d'assigner une instruction Forms directement dans le code d'une option de menu (Create_Record), provoquez le déclencheur équivalent dans la forme (Do_Key('Create_Record')).
En effet, le premier cas exécutera bien l'instruction native Create_Record qui insérera un nouvel enregistrement dans le bloc en cours. Par contre, le code PL/SQL éventuellement stocké dans le déclencheur Key-Crerec de la forme ne sera pas exécuté. Vous n'aurez donc pas le même résultat que lorsque l'utilisateur utilise le raccourcis clavier.
Ne pas afficher le menu Fenêtre
Quel que soit le menu affiché ou même si aucun menu n'est attaché à une forme, Forms affiche toujours, à l'exécution l'entrée de menu : Fenêtre
Si vous ne souhaitez pas afficher cette entrée de menu, vous pouvez appliquer l'une des méthodes suivantes:
Faire un menu vide
Le menu menu_vide.mmb livré avec les exemples est une démonstration de cette fonctionnalité.
Attachez ce menu à votre forme et exécutez-la.
Vous pouvez constater qu'aucune barre de menu ne s'affiche.

Une seule entrée de menu est créée (MAIN_MENU) qui ne contient qu'une seule option (WINDOW)
Affichons les propriétés de cette option:
Libellé doit être laissé vide
Type d'option doit être Magique
Elément de menu doit être Fenêtre
Type de commande doit être Null
Visible dans menu doit être Non
Utilisation des fonctions de la librairie Webutil
Si vous avez installé la librairie Webutil, vous pouvez afficher/masquer simplement la barre d'outils avec les fonctions suivantes
Si vous exécutez votre forme dans la fenêtre du navigateur (separateFrame=False), vous pouvez utiliser la fonction WebUtil_Browser.Show_Menu_Bar() de la librairie
Si vous exécutez votre forme dans une fenêtre indépendante du navigateur (separateFrame=True), vous pouvez utiliser la fonction WebUtil_SeparateFrame.Show_Menu_Bar() de la librairie
|