Consultor Eletrônico



Kbase P11541: How to create dynamic menus
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   01/07/2004
Status: Unverified

GOAL:

How to create dynamic menus

FACT(s) (Environment):

Progress 8.x

FACT(s) (Environment):

Progress 9.x

FIX:

Sometimes it is necessary to restrict user access to a specific function in an application. The dynamic menu feature in Progress can help you do this.

EXPLANATION:

In order to create a menu-bar, it is necessary to have three widgets, MENU, SUB-MENU, and MENU-ITEM. To reference these widgets, define them as WIDGET-HANDLE variables:

DEFINE VARIABLE hMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hSubMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hMenuItem AS WIDGET-HANDLE NO-UNDO.

Widgets have a hierarchy in the menu-bar. The MENU widget is the top level, the next level is the SUB-MENU widget, and the bottom level is the MENU-ITEM widget. The MENU widget must be related to the window widget using the property MENUBAR:

ASSIGN CURRENT-WINDOW:MENUBAR = hMenu:HANDLE.

According to the widgets hierarchy in the menu-bar, the SUB-MENU widget must be related to the MENU widget using it's Parent property and the MENU-ITEM widget must be related to the SUB-MENU widget using it's Parent property:

CREATE MENU hMenu.

CREATE SUB-MENU hSubMenu
ASSIGN PARENT = hMenu
. . . . . .

CREATE MENU-ITEM hMenuItem
ASSIGN PARENT = hSubMenu
. . . . . .

This example also demonstrates how to dynamically declare ACCELERATOR keys


The following example shows how to create a dynamic menu-bar:

CURRENT-WINDOW:HEIGHT-CHARS = 18.
CURRENT-WINDOW:WIDTH-CHARS = 132.

DEFINE VARIABLE hMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hSubMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hMenuItem AS WIDGET-HANDLE NO-UNDO.

DEFINE VARIABLE cSubMenues AS CHARACTER INITIAL "File,Edit"
NO-UNDO.
DEFINE VARIABLE cMenuItem1 AS CHARACTER INITIAL "New,Open,Close,Save,
Exit" NO-UNDO.
DEFINE VARIABLE cMenuItem2 AS CHARACTER INITIAL "Undo,Copy,Cut,Paste"
NO-UNDO.


DEFINE VARIABLE iAuxlr1 AS INTEGER NO-UNDO.
DEFINE VARIABLE iAuxlr2 AS INTEGER NO-UNDO.
DEFINE VARIABLE iItems AS INTEGER NO-UNDO.
DEFINE VARIABLE cItems AS CHARACTER NO-UNDO.


CREATE MENU hMenu.

DO iAuxlr1 = 1 TO NUM-ENTRIES(cSubMenues):

CREATE SUB-MENU hSubMenu
ASSIGN PARENT = hMenu
NAME = ENTRY(iAuxlr1, cSubMenues)
LABEL = ENTRY(iAuxlr1, cSubMenues).

CASE hSubMenu:NAME:

WHEN "File"
THEN ASSIGN iItems = NUM-ENTRIES(cMenuItem1)
cItems = cMenuItem1.
WHEN "Edit"
THEN ASSIGN iItems = NUM-ENTRIES(cMenuItem2)
cItems = cMenuItem2.

END. /*CASE hSubMenu:NAME:*/


DO iAuxlr2 = 1 TO iItems:
CREATE MENU-ITEM hMenuItem
ASSIGN PARENT = hSubMenu
NAME = hSubMenu:NAME + ENTRY(iAuxlr2, cItems)
LABEL = ENTRY(iAuxlr2, cItems)
/* This IS WHERE the ACCELERATOR KEYS are DEFINED */
ACCELERATOR = SUBSTRING(ENTRY(iAuxlr2, cItems),2,1)
/*This version just declares the 2nd letter AS the ACCELERATOR.
You may remove the above LINE IF you DO NOT want TO USE
ACCELERATORS. */
TRIGGERS:
ON CHOOSE PERSISTENT RUN MenuItemChoose IN
THIS-PROCEDURE (INPUT hMenuItem:NAME).
END TRIGGERS.

/*Example of how to disable a Menu-Item*/
IF hMenuItem:NAME = "EditUndo"
THEN ASSIGN hMenuItem:SENSITIVE = FALSE.

END. /*DO iAuxlr2 = 1 TO iItems:*/

END. /*DO iAuxlr1 = 1 TO NUM-ENTRIES(cSubMenues):*/

ASSIGN CURRENT-WINDOW:MENUBAR = hMenu:HANDLE.

DEFINE FRAME F1
WITH SIZE 132 BY 18 THREE-D NO-LABELS.

ENABLE ALL WITH FRAME F1.
WAIT-FOR CLOSE OF CURRENT-WINDOW.

PROCEDURE MenuItemChoose.
DEFINE INPUT PARAMETER cMenuItemName AS CHARACTER NO-UNDO.

MESSAGE "Item Selected:" SKIP(1)
"'" + cMenuItemName + "'" VIEW-AS ALERT-BOX INFORMATION.

IF cMenuItemName = 'FileExit' THEN QUIT.

END PROCEDURE.