Tava começando a dar trabalho, então parto logo pro automático....
Quando a gente define as variáveis direitinho....
Tive que usar um truque aqui, fazer o que....
cria a lista
Código: Selecionar todos
MenuOption( "Browse" )
MenuDrop()
MenuOption( "1.Browse ADO", { |o| DemoBrowseADO( .F., o ) } )
MenuOption( "2.Browse Array", { |o| DemoBrowseArray( .F., o ) } )
MenuOption( "3.Browse DBF", { |o| DemoBrowseDbf( .F., o ) } )
MenuUndrop()
MenuOption( "Button" )
MenuDrop()
MenuOption( "1.OwnerButton", { |o| DemoOwner( .F., o ) } )
#ifdef __PLATFORM_WINDOWS
MenuOption( "2.ShadeButton", { |o| DemoShadeBtn( .F., o ) } )
#endif
MenuUnDrop()
MenuOption( "Checkbox", { |o| DemoCheckbox( .F., o ) } )
MenuOption( "Combobox", { |o| DemoCombobox( .F., o ) } )
MenuOption( "Date" )
MenuDrop()
#ifdef __PLATFORM__WINDOWS
MenuOption( "1.MonthCal", { |o| DemoMonthCal( .F., o ) } )
#endif
MenuOption( "DateSelect", { |o| DemoDateSelect( .F., o ) } )
MenuOption( "Alt.DPicker", { |o| DemoAltDPicker( .F., o ) } )
MenuUnDrop()
MenuOption( "Get" )
MenuDrop()
MenuOption( "1.DemoGet2", { |o| DemoGet2( .F., o ) } )
MenuUnDrop()
MenuOption( "Listbox" )
MenuDrop()
MenuOption( "1.Listbox Alt", { |o| DemoListBoxSub( .F., o ) } )
MenuUndrop()
MenuOption( "Menu" )
MenuDrop()
MenuOption( "1.menu", , "demomenu.prg", { |o| DemoMenu( .F., o ) } )
MenuOption( "2.menuxml", , "demomenuxml.prg", { |o| DemoMenuXml( .F., o ) } )
MenuUnDrop()
MenuOption( "Say" )
MenuDrop()
MenuOption( "1.DemoGet2", { |o| DemoGet2( .F., o ) } )
MenuUnDrop()
MenuOption( "Splitter" )
MenuDrop()
MenuOption( "1.Treeview", { |o| DemoTreeview( .F., o, aInitList ) } )
MenuOption( "2.XML Tree", { |o| DemoXmlTree( .F., o ) } )
MenuUnDrop()
MenuOption( "Tab" )
MenuDrop()
MenuOption( "1.Lenta", { |o| DemoLenta( .F., o ) } )
MenuOption( "2.Tab", { |o| DemoTab( .F., o ) } )
MenuUnDrop()
MenuOption( "Timer", { |o| DemoGet2( .F., o ) } )
MenuOption( "Trackbar" )
MenuDrop()
MenuOption( "1.HTrack", { |o| DemoHTrack( .F., o ) } )
MenuUnDrop()
MenuOption( "Treeview" )
MenuDrop()
MenuOption( "1.Treeview", { |o| DemoTreeview( .F., o, aInitList ) } )
MenuOption( "2.XML Tree", { |o| DemoXmlTree( .F., o ) } )
MenuUnDrop()
MenuOption( "UpDown", { |o| DemoUpDown( .F., o ) } )
MenuOption( "AppData", { |o| DemoDbfData( .F., o ) } )
Como a gente faz a tab? tab.... page... conteudo.... endpage....
Foi isso que fiz.
Mas sem recursividade, porque só vai ter dois níveis, e a de dentro tem tamanho diferente da de fora.
Código: Selecionar todos
FOR EACH aOption IN aMenuOptions
BEGIN PAGE aOption[ 1 ] OF oTab
IF Len( aOption[ 2 ] ) == 0 // no other level
IF ValType( aOption[ 3 ] ) == "B"
Eval( aOption[ 3 ], oTab )
ELSE
ENDIF
ELSE
FOR EACH oTab2 IN { Nil } // to have unique otab2
@ 30, 30 TAB oTab2 ITEMS {} SIZE 800, 500 OF oTab
FOR EACH aOption2 IN aOption[ 2 ]
BEGIN PAGE aOption2[ 1 ] OF oTab2
IF ValType( aOption2[ 3 ] ) == "B"
Eval( aOption2[ 3 ], oTab2 )
ELSE
ENDIF
END PAGE OF oTab2
NEXT
NEXT
ENDIF
END PAGE OF oTab
NEXT
Falta só preencher o ELSE.
O ELSE é para os casos aonde não dá pra ficar na tab, como por exemplo mostrar menus.
Nesse caso é um button pra chamar o exemplo.
Agora mais fácil mexer nas opções.
E agora tá bem visível que chamo os exemplos individuais.
O programa com tudo junto é praticamente isso acima.