Create menus from an array Topic is solved

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
Ecimeric
Posts: 130
Joined: 11 Jan 2017, 02:23

Create menus from an array

10 May 2021, 05:07

Code: Select all

menuitems.txt
MySubmenu;MenuItemName1;MySubmenu value 1
MySubmenu;MenuItemName2;MySubmenu value 2
;MenuItemName1;MyMenu value 1 ; Retrieves MySubmenu value 2
;MenuItemName2;MyMenu value 2 ; Retrieves MyMenu value 1

Array := []
Loop, Read, menuitems.txt
    Array.Push(StrSplit(A_LoopReadLine, ";"))
for index, element in Array {
    if % element.1 {
        Menu, % element.1, Add, % element.2, Label
        Menu, MyMenu, Add, % element.1, % ":" element.1
    } else
        Menu, MyMenu, Add, % element.2, Label
}
Menu, MyMenu, Show

Label(ItemName, ItemPos) {
    global Array
    MsgBox, % Array[ItemPos].3
    return
}
Why are the wrong values retrieved in MyMenu?
User avatar
mikeyww
Posts: 26883
Joined: 09 Sep 2014, 18:38

Re: Create menus from an array

10 May 2021, 05:24

Code: Select all

Global Array := [], new := {}
Loop, Read, %A_ScriptDir%\menuitems.txt
    Array.Push(StrSplit(A_LoopReadLine, ";"))
For index, element in Array {
    Menu, % element.1, Add, % element.2, Label
    Menu, MyMenu, Add, % element.1, % ":" element.1
    new[element.2] := element.3
}
Menu, MyMenu, Show

Label(ItemName, ItemPos) {
 MsgBox, % new[ItemName]
}
Ecimeric
Posts: 130
Joined: 11 Jan 2017, 02:23

Re: Create menus from an array

10 May 2021, 11:56

Thank you; however, I am getting a Menu name too long error.
User avatar
mikeyww
Posts: 26883
Joined: 09 Sep 2014, 18:38

Re: Create menus from an array

10 May 2021, 12:58

Post your revised script, and the other text file.
Ecimeric
Posts: 130
Joined: 11 Jan 2017, 02:23

Re: Create menus from an array

10 May 2021, 13:20

Code: Select all

menuitems.txt
MySubmenu;MenuItemName1;MySubmenu value 1
MySubmenu;MenuItemName2;MySubmenu value 2
;MenuItemName1;MyMenu value 1
;MenuItemName2;MyMenu value 2

Global Array := [], new := []
Loop, Read, %A_ScriptDir%\menuitems.txt
    Array.Push(StrSplit(A_LoopReadLine, ";"))
For index, element in Array {
    Menu, % element.1, Add, % element.2, Label
    Menu, MyMenu, Add, % element.1, % ":" element.1
    new[element.2] := element.3
}
Menu, MyMenu, Show

Label(ItemName, ItemPos) {
    MsgBox, % new[ItemName]
    return
}
User avatar
mikeyww
Posts: 26883
Joined: 09 Sep 2014, 18:38

Re: Create menus from an array

10 May 2021, 13:40

In looking back, I don't think I understand how you want the final menu and submenu to appear when the script is run. Please provide that.
Ecimeric
Posts: 130
Joined: 11 Jan 2017, 02:23

Re: Create menus from an array

10 May 2021, 13:50

The menus appear as they should; the only issue is that MsgBox should retrieve the right element.3 whether or not menuitems.txt specifies a submenu.
User avatar
mikeyww
Posts: 26883
Joined: 09 Sep 2014, 18:38

Re: Create menus from an array

10 May 2021, 13:52

OK. I can't do much with this without an example of how the menu should appear, and what the MsgBox should show.
Ecimeric
Posts: 130
Joined: 11 Jan 2017, 02:23

Re: Create menus from an array

10 May 2021, 14:04

Code: Select all

MySubmenu > select MenuItemName1 > retrieve MySubmenu value 1
MySubmenu > select MenuItemName2 > retrieve MySubmenu value 2
select MenuItemName1 > retrieve MyMenu value 1
select MenuItemName2 > retrieve MyMenu value 2
User avatar
mikeyww
Posts: 26883
Joined: 09 Sep 2014, 18:38

Re: Create menus from an array  Topic is solved

10 May 2021, 14:48

Code: Select all

/* menuitems.txt ---------------------------------------
MySubmenu;SubMenuItemName1;MySubmenu value 1
MySubmenu;SubMenuItemName2;MySubmenu value 2
;MenuItemName1;MyMenu value 1
;MenuItemName2;MyMenu value 2
--------------------------------------------------------
*/
Array := []
Global new := {}
Loop, Read, %A_ScriptDir%\menuitems.txt
    Array.Push(StrSplit(A_LoopReadLine, ";"))
For index, element in Array {
 If (element.1 > "") {
  Menu, % element.1, Add, % element.2, Label
  Menu, MyMenu, Add, % element.1, % ":" element.1
 } Else Menu, MyMenu, Add, % element.2, Label
 new[element.2] := element.3
}
Gosub, F3
F3::Menu, MyMenu, Show

Label(ItemName, ItemPos) {
 MsgBox, % new[ItemName]
}
Ecimeric
Posts: 130
Joined: 11 Jan 2017, 02:23

Re: Create menus from an array

10 May 2021, 15:13

This is giving me:

Code: Select all

MySubmenu > MenuItemName1 > MyMenu value 1 ; instead of MySubmenu value 1
MySubmenu > MenuItemName2 > MyMenu value 2 ; instead of MySubmenu value 2
MenuItemName1 > MyMenu value 1
MenuItemName2 > MyMenu value 2
User avatar
mikeyww
Posts: 26883
Joined: 09 Sep 2014, 18:38

Re: Create menus from an array

10 May 2021, 15:53

You must have a different text file. You can upload it here.
Ecimeric
Posts: 130
Joined: 11 Jan 2017, 02:23

Re: Create menus from an array

10 May 2021, 15:58

Strike that :oops: ; thank you for your help, once again!
nowaw210915
Posts: 1
Joined: 09 May 2022, 09:34

Re: Create menus from an array

09 May 2022, 09:49

mikeyww wrote:
10 May 2021, 14:48

Code: Select all

/* menuitems.txt ---------------------------------------
MySubmenu;SubMenuItemName1;MySubmenu value 1
MySubmenu;SubMenuItemName2;MySubmenu value 2
;MenuItemName1;MyMenu value 1
;MenuItemName2;MyMenu value 2
--------------------------------------------------------
*/
Array := []
Global new := {}
Loop, Read, %A_ScriptDir%\menuitems.txt
    Array.Push(StrSplit(A_LoopReadLine, ";"))
For index, element in Array {
 If (element.1 > "") {
  Menu, % element.1, Add, % element.2, Label
  Menu, MyMenu, Add, % element.1, % ":" element.1
 } Else Menu, MyMenu, Add, % element.2, Label
 new[element.2] := element.3
}
Gosub, F3
F3::Menu, MyMenu, Show

Label(ItemName, ItemPos) {
 MsgBox, % new[ItemName]
}
Is it possible to create a dropdown menu inside a dropdown menu in a similar way?
Something like:

MySubmenu;SubMenuItemName1;MySubmenu value 1
MySubmenu;SubMenuItemName1;SubSubMenuItemName1;MySubmenu value 3
MySubmenu;SubMenuItemName1;SubSubMenuItemName2;MySubmenu value 4
MySubmenu;SubMenuItemName2;MySubmenu value 2
;MenuItemName1;MyMenu value 1
;MenuItemName2;MyMenu value 2
User avatar
mikeyww
Posts: 26883
Joined: 09 Sep 2014, 18:38

Re: Create menus from an array

09 May 2022, 10:27

Welcome to this AutoHotkey forum!

I don't see why not. You could learn about StrSplit, and then develop a series of plain-language rules for how to handle the parsed elements. You could then turn those rules into AHK code.

Explained: StrSplitMenu

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: Anput, Lamron750, mikeyww and 227 guests