JoséQuintas escreveu:Não sei se entendi direito, me deu a impressão de que nem precisava macro, era só passar a variável direto.
Pelo menos no Clipper, array por padrão já equivale a ser por referência.
* 1 - Então, o erro que está dando (de acordo com a imagem anexa), informa que na matriz/vetor (array) não existe tal(is) valor(es). Veja os códigos onde a matriz MENU_CADH1 inicia até chegar ao MAIN MENU:
Código: Selecionar todos
MONTA_VETOR (LINHA,BLOCO,H_IND,'&Orçamentos',{|| EXECUTA_PROGRAMA ({|| PCI10001 ()})},'PCI10001','MENU_CADH1')
Vocês viram, que na única linha acima, são passados 6 parâmetros. No modo CONSOLE isso funcionava corretamente:
1 - LINHA: matriz local que é transferida para a função MONTA_VETOR;
2 - BLOCO: matriz local que é transferida para a função MONTA_VETOR;
3 - H_IND: matriz local que é transferida para a função MONTA_VETOR;
4 - "Orçamentos" é o elemento que passa o nome do ITEM do MAIN MENU;
5 - Aqui é executada uma função em RUN-TIME que usa a função EVAL() ; e
6 - finalmente o último parâmetro não existia no MODO CONSOLE e o acrescentei para que eu passe o verdadeiro nome da MATRIZ que montará o ITEM do MAIN MENU e respectivamente o ACTION e as demais operações. O que achei estranho é que tudo aparentemente está correto, mas, quando se clica no ITEM/MENU imediatamente aparece o erro de ARRAY.
* 2- Aqui abaixo está a segunda fase da matriz MENU_CADH1 (e todas as outras, mas, se resolver uma MATRIZ as outras também passarão a funcionar). Observem que as linhas comentadas são apenas testes que eu fiz para ver se estava gravando na substituição da
&MATRIZ_MENU para o nome real que é passado desde a chamada da função com o nome correto (vocês viram no primeiro momento e aqui chega com o nome genérico). O local da mudança de MATRIZ_MENU para o nome correto é feito na última linha dentro IF/ENDIF com a seguinte função:
AADD(&MATRIZ_MENU).,{PROMPT,ACAO,INDICE}). Uma coisa que observei que se a gente descomentar as linhas com comando "?" a matriz que contém 3 colunas, me estranha a coluna 2 estar vazia. Já as colunas 1 e 3, aparecem corretamente. Vejam e decifram por gentileza:
Código: Selecionar todos
static function MONTA_VETOR (LINHA,BLOCO,H_IND,PROMPT,ACAO,INDICE,MATRIZ_MENU)
// ? 'dentro de MONTA_VETOR'
// ? 'LINHA',LINHA,'BLOCO',BLOCO,'H_IND',H_IND
// ? 'PROMPT',PROMPT,'ACAO',ACAO,'INDICE',INDICE,'MATRIZ_MENU',MATRIZ_MENU
// ? '&MATRIZ_MENU.',&MATRIZ_MENU.
// WAIT
if E_MASTER () .or. EXISTE_PROGRAMA (INDICE)
aadd (LINHA,PROMPT)
aadd (BLOCO,ACAO)
aadd (H_IND,INDICE)
// aadd (&MATRIZ_MENU.,{ATAIL(LINHA),ATAIL(BLOCO),ATAIL(H_IND)})
aadd (&MATRIZ_MENU.,{PROMPT,ACAO,INDICE})
// aadd (&MATRIZ_MENU.,{PROMPT,ACAO,INDICE})
endif
return
* 3 - O MAINMENU no seu respectivo ACTION chama a função
{||EXECUTA_PROGRAMA2(MENU_CADH1[CADH1,3]+' ()')}. Observem as linhas comentadas, pois só funciona a que contém PCI10048(). Mas, como pode observar que cada ITEM do MAIN MENU é criada em tempo de execução, não consegui uma forma de chamar os módulos PCI100xx sem usar o recurso de uma MATRIZ, que não funciona e dá o erro de ARRAY (conforme imagem anexa):
Código: Selecionar todos
POPUP MENU_CAD[1,1]
if len(MENU_CADH1)>0
for CADH1=1 to len(MENU_CADH1)
? 'MENU_CADH1[CADH1,1]',MENU_CADH1[CADH1,1]
? 'MENU_CADH1[CADH1,2]',MENU_CADH1[CADH1,2]
? 'MENU_CADH1[CADH1,3]',MENU_CADH1[CADH1,3]
wait
MENUITEM MENU_CADH1[CADH1,1] ACTION {||EXECUTA_PROGRAMA2(MENU_CADH1[CADH1,3]+' ()')} // NAME MENU_CAD1[CAD1,3]
// MENUITEM MENU_CADH1[CADH1,1] ACTION EXECUTA_PROGRAMA2(pci10048()) // NAME MENU_CAD1[CAD1,3]
// MENUITEM MENU_CADH1[CADH1,1] ACTION {|| MENU_CADH2V1[CADH2V1,3]} // NAME MENU_CAD1[CAD1,3]
next
endif
END POPUP
O erro que é apresentado na imagem anexa, diz que é na linha MCI10000(2215) que é exatamente a linha 8 do último código acima postado.

- Error BASE/1132 Bound error: array access
Se alguém puder desvendar esse mistério, agradeceremos.
vlw!