Jump to content



Photo

Menu from INI


  • Please log in to reply
2 replies to this topic

#1 taietel

taietel

    I'm the third from the left...

  • Active Members
  • PipPipPipPipPipPip
  • 722 posts

Posted 19 May 2010 - 08:19 PM

I'm trying to make a GUI with a dinamic menu, from an ini file. The structure of the ini is something like this:

[Menu1]
Submenu11=cmd11
Submenu12=cmd12
[Menu2]
Submenu21=cmd21
[Menu3]
Submeniu31=cmd31
Submeniu32=cmd32
Submeniu33=cmd33
[Menu4]
Submenu41=cmd41
Submenu42=cmd42


The problem is that I can not get the values. I have read a post (http://www.autoitscript.com/forum/index.php?showtopic=106850&view=findpost&p=753987) from PsaltyDS, but I'm stucked...

The code so far:

AutoIt         
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) $sIni = @ScriptDir & "\menu.ini" $hForm = GUICreate("Sample INI menu", 633, 452, 192, 124) $readmenu = IniReadSectionNames($sIni) ;read section names to array For $i = 1 To $readmenu[0]     $mnu = GUICtrlCreateMenu($readmenu[$i]) ;create menu from section names     $var = IniReadSection($sIni, $readmenu[$i])     For $j = 1 To UBound($var) - 1         $var[$j][0]=GUICtrlCreateMenuItem($var[$j][0], $mnu); create submenus         GUICtrlSetOnEvent(-1, "_MenuItemHit")         ;the values are in the $var[$j][1]     Next Next GUISetOnEvent($GUI_EVENT_CLOSE, "_Close") GUISetState(@SW_SHOW) While 1     Sleep(10) WEnd Func _MenuItemHit()     Local $ctrlMenu = @GUI_CtrlId     Local $hMenu = @GUI_CtrlHandle     Local $iIndex, $sText     For $iIndex = 1 To UBound($var) - 1         If $var[$iIndex][0] = $ctrlMenu Then             $sText = $var[$iIndex][1]             ExitLoop         EndIf         If $sText = "" Then $sText = "<Not Found>"     Next     ConsoleWrite("_MenuItemHit():  ID = " & $ctrlMenu & "; Handle = " & $hMenu & "; Text = " & $sText & @LF) EndFunc Func _Close()     Exit EndFunc


If I try with Menu4, for example, it triggers the cmd41 and cmd42, but not for the other submenus.

Please point me in the right direction. Thank you in advance!

Edited by taietel, 19 May 2010 - 08:28 PM.






#2 PsaltyDS

PsaltyDS

    Most Venerable Penguin

  • MVPs
  • 13,279 posts

Posted 20 May 2010 - 02:28 AM

The problem is that you are re-using the $var array for each section. The $var from the first section is over-written by the second section... etc. Only the data for the last section is left in the array by the time the GUI is shown. You need to collect them all into one array for searching when the _MenuItemHit() event runs.

:idea:
Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law

#3 taietel

taietel

    I'm the third from the left...

  • Active Members
  • PipPipPipPipPipPip
  • 722 posts

Posted 20 May 2010 - 05:25 PM

Thank you Psalty! I realized that after reading your post   :idea:.

I try to make a launcher for programs I use most and if I update manually the ini file, the menu will also update.

I finally got it to work (the script it's kind of messy...    Posted Image ):

AutoIt         
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiMenu.au3> Opt("GUIOnEventMode", 1) $sIni = @ScriptDir & "\menu.ini" $hForm = GUICreate("Sample INI menu", 633, 452, 192, 124) Global $readmenu = IniReadSectionNames($sIni) ;read section names to array Global $vr[100][100] Global $sname, $vname For $i = 1 To UBound($readmenu) - 1     $mnu = GUICtrlCreateMenu($readmenu[$i]) ;create menu from section names     $var = IniReadSection($sIni, $readmenu[$i])     For $j = 1 To UBound($var) - 1               $vr[$j][0] = GUICtrlCreateMenuItem($var[$j][0], $mnu); create submenus            $vr[$j][1] = $var[$j][1]            $sname &= $vr[$j][0] & "|"            $vname &= $vr[$j][1] & "|"            GUICtrlSetOnEvent($vr[$j][0], "_MenuItemHit")     Next Next GUISetOnEvent($GUI_EVENT_CLOSE, "_Close") GUISetState(@SW_SHOW) While 1    Sleep(10) WEnd Func _MenuItemHit()       Local $ctrlMenu = @GUI_CtrlId       Local $iIndex, $sText     Local $snm = StringSplit($sname, "|")     Local $vnm = StringSplit($vname, "|")     For $i = 1 To UBound($readmenu) - 1             For $iIndex = 1 To UBound($vr) - 1                     If $ctrlMenu = $snm[$iIndex] Then                              $sText = $vnm[$iIndex]                              ExitLoop                     EndIf                     ;If $sText = "" Then $sText = "<Not Found>"             Next     Next       ConsoleWrite("Menu ID = " & $ctrlMenu & " command to execute = " & $sText & @LF)     ;If $sText ="" Then     ;   ShellExecute($sText) ;this way it can open executables, documents...     ;else     ;MsgBox(0,"Error:", "Nothing to run." & @CRLF & "Check your INI!")     ;EndIf EndFunc Func _Close()      Exit EndFunc


I know there is an easy way to do that but I can not figure it right now...

Edited by taietel, 20 May 2010 - 06:09 PM.





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users