opa
Toledo escreveu:
Entre as linhas 27 e 28 faltou um END POPUP.
Abraços,
Prezado, mais uma vez obrigado pela ajuda interativa!
Bom, fiz os testes e o MENU POPUP já está quase todo completo. Então, resolvi testar o ACTION de cada função, mas, pude observar que agora estão acontecendo erros que antes não aconteciam no CONSOLE MODE. Eu explico:
Código: Selecionar todos
MONTA_VETOR (LINHA,BLOCO,H_IND,'Formatador-1',{|| EXECUTA_PROGRAMA ({|| PCI10998 ()})},'PCI10998','MENU_FOR')
Bom, de acordo com o código abaixo, essa linha acima era a responsável por no momento do pressionamento do ENTER ou da letra em destaque (TECLA HOTKEY) o programa ou módulo em questão era acionado. E, pra isso um loop usando o INKEY() nós usávamos para que o MENU ficasse esperando o acionamento de alguma tecla. E que fazia esse aguardamento era as linhas abaixo que ficam imediatamente após a linha acima:
Código: Selecionar todos
if len (LINHA) > 0
OPCAO := MENU_VERTICAL (LIN,COL,LINHA,BLOCO,H_IND,OPCAO)
restscreen (0,0,maxrow (),maxcol (),S_TEL)
endif
Agora, só falta colocar parte do código da função MENU_VERTICAL, não vou postar todo o código pois é muito grande, mas, vou postar algumas partes e o local do pressionamento do ENTER onde é acionada a função EVAL(). Vejam:
Código: Selecionar todos
function MENU_VERTICAL (LIN1,COL1,ELEM,BLOCO,IND_HELP,INICIO)
memvar K_HELP,K_UTIL,K_CNS
local I := 1,;
J := 1,;
N_PROMPT := len (ELEM),;
PROMPT := aclone (ELEM),;
HOTKEY := array (len (ELEM)),;
TECLA := 1,;
S_CURSOR := set (_SET_CURSOR),;
COMPL := 0
afill (HOTKEY,'')
set cursor off
if LIN1 = 1
LIN1++
endif
FORM_PROMPT (PROMPT)
COMPL := MAX_ELEM_VETOR (PROMPT)
COL1 := if (COL1 + COMPL + 1 < 80,COL1,COL1 - (COL1 + COMPL + 1 - 80) - 1)
MOLDURA (LIN1,COL1,LIN1 + N_PROMPT + 1,COL1 + COMPL + 1,.f.,'')
COL1++
for I := 1 to N_PROMPT
PROMPT [I] := if (at ('~',PROMPT [I]) = 0,padr (PROMPT [I],COMPL),padr (PROMPT [I],COMPL+1))
ESCR_BAR_NORMAL (LIN1 + I,COL1,PROMPT [I])
if at ('~',PROMPT [I]) <> 0
HOTKEY [I] := upper (substr (PROMPT [I],at ('~',PROMPT [I]) + 1,1))
endif
next I
I := if (INICIO <> nil,INICIO,1)
do while .t.
ESCR_BAR_DESTAQUE (LIN1 + I,COL1,PROMPT [I])
TECLA := inkey (0)
do case
case TECLA = K_ENTER
eval (BLOCO [I],LIN1 + I + 1,COL1 + 1)
case TECLA = K_ESC
TECLA := I
exit
endcase
enddo
set (_SET_CURSOR,S_CURSOR)
return TECLA
Bom, de acordo com a função acima (destacamos a matriz
BLOCO nas linhas 1 e 34) a função EVAL () aciona a matriz BLOCO que em seguida novamente a MONTA_VETOR que consequentemente executa EXECUTA_PROGRAMA. Vejam:
Código: Selecionar todos
static function EXECUTA_PROGRAMA (PROGRAMA)
// MINIMIZE WINDOW F2
// RELEASE WINDOW F2
set key TECLA_UTIL to UTIL_PROG
close all
eval (PROGRAMA)
ABRE_ARQ_ACESSO ()
set key TECLA_HELP to
set key TECLA_UTIL to
return
Bom, expus todas essas funções, para que V.Sas. nos ajudem a compreender as mensagens de erro que estão aparecendo.
Se eu colocar no modo gráfico dentro da ACTION os seguintes códigos apresentam, respectivamente as mensagens de erro:
EXEMPLO1
Código: Selecionar todos
if len(MENU_CADH2V1)>0
for CADH2V1=1 to len(MENU_CADH2V1)
MENUITEM MENU_CADH2V1[CADH2V1,1] ACTION MENU_CADH2V1[CADH2V1,2] // NAME MENU_CAD1[CAD1,3]
next
endif
MENSAGEM ERRO EXEMPLO1
Código: Selecionar todos
Error BASE/1132 Bound error:array access
called from (b) MCI10000(2232)
...
A linha acima é: exatamente a linha que chama o tal EXECUTA_PROGRAMA() do MONTA_VETOR() que usa o EVAL():
Código: Selecionar todos
MENUITEM MENU_CADH2V1[CADH2V1,1] ACTION MENU_CADH2V1[CADH2V1,2] // NAME MENU_CAD1[CAD1,3]
EXEMPLO2
Código: Selecionar todos
if len(MENU_CADH1)>0
for CADH1=1 to len(MENU_CADH1)
MENUITEM MENU_CADH1[CADH1,1] ACTION MENU_CADH2V1[CADH2V1,3] // NAME MENU_CAD1[CAD1,3]
next
endif
as linhas acima, modifiquei apenas qual posição da matriz é acionada (já postei anteriormente como funcionam esse MENU_CAD(CAD1,3) ou MENU_CAD(CAD1,2)) e mesmo assim apresenta o mesmo erro anterior.
Agora para funcionar sem erros, o único jeito que descobri é no exemplo 3 abaixo. Bom, eu quero entender por que do jeito antigo (MODO CONSOLE funcionava) e agora não mais funciona:
EXEMPLO3
Código: Selecionar todos
if len(MENU_CADH1)>0
for CADH1=1 to len(MENU_CADH1)
MENUITEM MENU_CADH1[CADH1,1] ACTION EXECUTA_PROGRAMA2(pci10048()) // NAME MENU_CAD1[CAD1,3]
next
endif
Código: Selecionar todos
static function EXECUTA_PROGRAMA2 (PROGRAMA)
MINIMIZE WINDOW F2
RELEASE WINDOW F2
set key TECLA_UTIL to UTIL_PROG
close all
PCI10048() // ou &PROGRAMA. (acho que tanto faz, não testei ainda esse exemplo)
ABRE_ARQ_ACESSO ()
set key TECLA_HELP to
set key TECLA_UTIL to
return
Nesse exemplo3, observem que irá funcionar, mas, não é o correto, pois terei que fazer em todos os PRGs que estão em MODO CONSOLE uma pequena alteração.
Outra coisa, mas, dentro do mesmo assunto:
Observem que ao final dessa função EXECUTA_PROGRAMA2, tem set key TECLA_HELP to e TECLA_UTIL to...
percebi que no MODO_GRÁFICO as teclas de função (F1 ao F12) que usava no modo CONSOLE (@ say/get ou inkey) não são acionadas para executar algumas tarefas especiais que eram:
F1 - HELP
F2 - MENU UTILITÁRIOS
F3 - repetir última digitação do campo @SAY/GET
F4 - chama o browse de pesquisa no arquivo
etc etc...
Então, alguém sabe como fazer para isso voltar a funcionar ou ser acionado?
por enquanto é só!
JESUS está voltando, queiram crer ou não, Ele é real e está sentado numa cadeira Real de realeza. Leia a Bíblia Atos 17:30-31