配合前面的读取INI到对象,就可以完成INI到菜单的转换了。
附赠读取文件目录到对象 :SubtreeToObj()
不过有些地方需要修改一二。
Code: Select all
Search:={google:"google.com",bing:"bing.com"}
images:={google:"google.com/images",bing:"bing.com/images"}
Network:={Search:Search,images:images}
ObjToMenu("测试",{Network:Network,Subtree:SubtreeToObj(A_ScriptDir)})
menu,测试, show
ObjToMenu(m,f,z:=""){
for i,n in f
if IsObject(n)
h.=ObjToMenu(i,n,z m)
else
{
Menu,% z m ,add,% i,Start
h:=1
}
if h and z
menu,% z?z:m,add,% m,% ":" z m
return h
}
return
Start:
SubtreeToObj(p,b*){
if FileExist(p:=RTrim(p,"\"))
{
k:={(p):1},j:=f:=[]
if b.MaxIndex()
{
Loop, %p%\*, , 1
{
if !k[A_LoopFileDir]
{
j:=f,k[A_LoopFileDir]:=1
StringReplace, x, A_LoopFileDir, %p%\
loop,parse,x,\
IsObject(j[a_loopfield]) ? (j:=j[a_loopfield]) : (j:=j[a_loopfield]:=[])
}
j[A_LoopFileName]:={"":A_LoopFileLongPath}
for i,n in b
j.Insert(n,%n%)
}
}
else Loop, %p%\*, , 1
{
if !k[A_LoopFileDir]
{
j:=f,k[A_LoopFileDir]:=1
StringReplace, x, A_LoopFileDir, %p%\
loop,parse,x,\
IsObject(j[a_loopfield]) ? (j:=j[a_loopfield]) : (j:=j[a_loopfield]:=[])
}
j[A_LoopFileName]:={"":A_LoopFileLongPath}
}
Return f
}
}