bom dia nobres Jairo e JQuintas!
me sinto honrado pela participação dos senhores nesse post que não é de minha autoria e sim do próprio professor Quintas.
Bom, o meu menu clipper (console = setas, esc, enter e com um pouco de mouse) pra chamar o próximo módulo é assim:
Código: Selecionar todos
MONTA_VETOR_wvg (LINHA,BLOCO,H_IND,'~Empresas' ,{|| EXECUTA_PROGRAMA ({|| PCI10024 ()})},'PCI10024',oMenu)
Observem que EXECUTA_PROGRAMA chama o bloco PCI10024() que é uma função, ou seja, um outro módulo onde realmente executa tudo.
modifquei o MONTA_VETOR acima para a realidade minha de acordo com o que o nobre JQuintas nos passou:
Código: Selecionar todos
MenuDrop()
if MONTA_VETOR_wvg2 ('PCI10001')
MenuOption(HB_AnsiToOem("Orçamentos"),PCI10001())
endif
MenuUnDrop()
O problema - na minha ignorância, é exatamente em que a linha MenuOption, transfira o PCI1001() para dentro do:
Código: Selecionar todos
STATIC FUNCTION MenuOption(mPrompt,mProg)
LOCAL nCont
LOCAL mNow
MEMVAR nMenuLevel, aaMenuOption
mProg := iif( mProg==NIL, "", mProg)
mNow := aaMenuOption
FOR nCont = 1 TO nMenuLevel
mNow := mNow[Len(mNow)]
IF ValType(mNow[2]) # "A"
mNow[2] := {}
ENDIF
mNow := mNow[2]
NEXT
Aadd(mNow,{mPrompt,{},mProg})
RETURN NIL
então, não consegui entender o resultado final desta função MENUOPTION que leva o PCI10001() (apenas exemplo) para a função BUILDMENU:
Código: Selecionar todos
FUNCTION BuildMenu( oMenu, acMenu)
LOCAL nCont, oSubMenu, bCode
FOR nCont = 1 TO Len( acMenu )
// msginfo ( acMenu[ nCont, 1 ])
IF Len( acMenu[ nCont, 2 ] ) == 0
// msginfo('dentro do IF')
// bCode := [{|| ExecutePrg( "] + acMenu[ nCont, 3 ] + [" ) }]
// bCode := EXECUTA_PROGRAMA ({|| acMenu[ nCont, 3 ] ()})
// EXECUTA_PROGRAMA ({|| PCI10003 ()})
// bCode := [{|| EXECUTA_PROGRAMA( "] + acMenu[ nCont, 3 ] + [" ) }]
bCode := [ {|| EXECUTA_PROGRAMA_wvg ( "] + acMenu[ nCont, 3 ] + [" ) } ]
// bCode := acMenu[ nCont, 3 ]
// bCode := &(acMenu[ nCont, 3 ])
// bCode := &(acMenu[ nCont, 3 ])
// bCode := ({|| EXECUTA_PROGRAMA_wvg ({|| (&(acMenu[ nCont, 3 ])) ()})})
// bCode := ({|| EXECUTA_PROGRAMA_wvg ({|| acMenu[ nCont, 3 ] ()})})
// bCode := ({|| EXECUTA_PROGRAMA_wvg ({|| Prg ()})})
// MsgInfo(bcode)
// cCmd := [ {|| Executa_Programa_wvg( "] + bCode + [" ) } ]
// Eval (&(cCmd))
// msginfo (bcode)
// msginfo (&(bcode))
// msginfo (&bcode.)
// oMenu:AddItem( acMenu[ nCont, 1 ] , &( bCode ) )
oMenu:AddItem( acMenu[ nCont, 1 ] , bCode )
ELSE
oSubMenu := WvgMenu():new( oMenu, , .T. ):Create()
BuildMenu( oSubMenu, acMenu[ nCont, 2 ] )
oMenu:AddItem( oSubMenu, acMenu[ nCont, 1 ] )
ENDIF
NEXT
RETURN NIL // BuildMenu( oMenu, acMenu )
Eis o problema: a função (módulo) PCI1001() chegar aqui no bCode.
Obs.: as linhas comentadas foram diversas tentativas que fizemos de entender o funcionamento de toda a tragetória do PCI1001() até chegar aqui e ir para dentro da função EXECUTA_PROGRAMA_WVG() que contém o EVAL.
Vejam essa função abaixo:
Código: Selecionar todos
function EXECUTA_PROGRAMA_wvg (PROGRAMA)
msginfo(PROGRAMA)
set key TECLA_UTIL to UTIL_PROG
close all
eval (PROGRAMA)
// eval (&(PROGRAMA))
ABRE_ARQ_ACESSO ()
set key TECLA_HELP to
set key TECLA_UTIL to
return nil // EXECUTA_PROGRAMA_wvg
Nada, funciona. Inclusive está com linha comentada pois foi mais uma tentativa de execução.
Como sou apenas um "ignorante" e nada sei, a coisa pra mim é complexa de se entender, principalmente se tratando de coisa gráfica.
Então, o que precisa acontecer - na minha opinião, é que o conteúdo da "PROGRAMA" que chega aqui na função EXECUTA_PROGRAMA_WVG() seja realmente o que era na função MONTA_VETOR().
Resumindo, pra mim o problema é de comunicação entre as funções, que na função:
Código: Selecionar todos
MONTA_VETOR_wvg (LINHA,BLOCO,H_IND,'~Grupos' ,{|| EXECUTA_PROGRAMA ({|| PCI10007 ()})},'PCI10007',oMenu)
Acima, funcionava, agora abaixo não funciona:
Código: Selecionar todos
bCode := [ {|| EXECUTA_PROGRAMA_wvg ( "] + acMenu[ nCont, 3 ] + [" ) } ]
Simples. Mas, pra mim complexo de se entender.
o conteúdo acMenu[nCont,3] é que o causador do problema, mas, não sei resolver essa fórmula!
rs