Ever needed to create copy of a menu you defined using CREATE MENU?
For example to use it in 2 separate processes with different settings or different states of enabling/disabling or different lines added or removed?
Well, despair not, here is a piece of code that might come in handy:
// ----------------------------------------------------
// Method: MENU_Copy
// ----------------------------------------------------
// Call: MenuRef:=MENU_Copy(SourceMenu)
// ----------------------------------------------------
// UserName (OS): Alexander Heintz
// Date and Time: 21.01.15, 19:06:33
// ----------------------------------------------------
// Does:
// recursively copies a menu based on a menu reference
// including all submenus
// ----------------------------------------------------
// Parameters:
// -> $1 text the menu to copy
// <- $0 text the reference to the menu copy
// ----------------------------------------------------
// Parameter Definition
C_TEXT($1)
C_TEXT($0)
// ----------------------------------------------------
// Local Variable Definition
ARRAY TEXT($at_Submenus;0)
ARRAY TEXT($at_Titles;0)
C_LONGINT($l_Line)
C_LONGINT($l_DefaultAction)
C_LONGINT($l_Key)
C_LONGINT($l_Modifier)
C_LONGINT($l_NewProcess)
C_LONGINT($l_Privileges)
C_LONGINT($l_Stye)
C_TEXT($t_Icon)
C_TEXT($t_Mark)
C_TEXT($t_Method)
C_TEXT($t_Param)
C_TEXT($tx_bMenu)
C_TEXT($tx_Menu)
C_TEXT($tx_Source)
// ----------------------------------------------------
// Parameter Assignment
$tx_Source:=$1
// ----------------------------------------------------
$tx_Menu:=Create menu
ARRAY TEXT($at_Titles;0)
ARRAY TEXT($at_Submenus;0)
GET MENU ITEMS($tx_bMenu;$at_Titles;$at_Submenus)
For ($l_Line;1;Size of array($at_Titles))
$l_Key:=Get menu item key($tx_Source;$l_Line)
$l_Modifier:=Get menu item modifiers($tx_Source;$l_Line)
$t_Mark:=Get menu item mark($tx_Source;$l_Line)
$t_Method:=Get menu item method($tx_Source;$l_Line)
$t_Param:=Get menu item parameter($tx_Source;$l_Line)
$l_Stye:=Get menu item style($tx_Source;$l_Line)
GET MENU ITEM ICON($tx_Source;$l_Line;$t_Icon)
GET MENU ITEM PROPERTY($tx_Source;$l_Line;Access privileges;$l_Privileges)
GET MENU ITEM PROPERTY($tx_Source;$l_Line;Associated standard action;$l_DefaultAction)
GET MENU ITEM PROPERTY($tx_Source;$l_Line;Start a new process;$l_NewProcess)
If ($at_Submenus{$l_Line}="")
APPEND MENU ITEM($tx_Menu;$at_Titles{$l_Line})
Else
//create a copy of the submenu and do that recursively
$tx_SubMenu:=MENU_Copy ($at_Submenus{$l_Line})
APPEND MENU ITEM($tx_Menu;$at_Titles{$l_Line};$tx_SubMenu)
End if
If ($l_Key#0)
SET MENU ITEM SHORTCUT($tx_Menu;-1;$l_Key;$l_Modifier)
End if
If ($t_Mark#"")
SET MENU ITEM MARK($tx_Menu;-1;$t_Mark)
End if
If ($t_Method#"")
SET MENU ITEM METHOD($tx_Menu;-1;$t_Method)
End if
If ($t_Param#"")
SET MENU ITEM PARAMETER($tx_Menu;-1;$t_Param)
End if
SET MENU ITEM STYLE($tx_Menu;-1;$l_Stye)
SET MENU ITEM PROPERTY($tx_Menu;-1;Access privileges;$l_Privileges)
SET MENU ITEM PROPERTY($tx_Menu;-1;Associated standard action;$l_DefaultAction)
SET MENU ITEM PROPERTY($tx_Menu;-1;Start a new process;$l_NewProcess)
If ($t_Icon#"")
SET MENU ITEM ICON($tx_Menu;-1;$t_Icon)
End if
End for
$0:=$tx_Menu
Oh, and if you like to conserve memory, please clean up if you you dot need the menu anymore by calling
RELEASE MENU(MenuRef)
I will release some code soonish that will take care of cleaning up all the submenus as well...