Substituir variável por nome dentro do texto
Moderador: Moderadores
-
microvolution
- Usuário Nível 5

- Mensagens: 1231
- Registrado em: 02 Set 2011 22:17
- Contato:
Substituir variável por nome dentro do texto
Prezado JoséQuintas, muito bacana o código, só que testei e deu a mesma mensagem no mesmo local.
Se tiver outra sugestão, vamos testar.
Se tiver outra sugestão, vamos testar.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Substituir variável por nome dentro do texto
Ok.
Pelo menos retirou a questão da execução.
Agora é mesmo com relação ao array.
Vou revisar os posts desde o início.
Pelo menos retirou a questão da execução.
Agora é mesmo com relação ao array.
Vou revisar os posts desde o início.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Substituir variável por nome dentro do texto
Talvez fosse melhor rever o código, mas tudo bem.
Esquisito isso de codeblock executando codeblock....
Teste modificando aqui.
Se não me engano, array automaticamente é por referência. Caso contrário, só colocar @menu_cad1
Não se esqueça que menu Windows é apenas uma pequena parte da questão.
O conteúdo de tudo nem sempre é visível entre os módulos.
Mas esses detalhes dependem da biblioteca gráfica que usa.
Esquisito isso de codeblock executando codeblock....
Teste modificando aqui.
Se não me engano, array automaticamente é por referência. Caso contrário, só colocar @menu_cad1
Código: Selecionar todos
cls
Private Menu_Cad1:={}
Monta_Vetor("Fornecedor",{|| Executa({|| PCI()})},"PCI1",Menu_Cad1)
? 'Elementos: ',Len(Menu_Cad1)
? 'Conteudo 1: ',Menu_Cad1[1,1]
inkey(0)
Return
Func Monta_Vetor(Prompt,Acao,indice,matriz_menu)
AADD(matriz_menu,{Prompt,Acao,indice})
Return Nil
Func Executa()
Retu Nil
Func PCI()
Retu Nil
O conteúdo de tudo nem sempre é visível entre os módulos.
Mas esses detalhes dependem da biblioteca gráfica que usa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Substituir variável por nome dentro do texto
Só que num dos posts faz referência a outros arrays que não constam no fonte.
Isso usa os arrays linha, bloco e h_ind
Código: Selecionar todos
static function MONTA_VETOR (LINHA,BLOCO,H_IND,PROMPT,ACAO,INDICE,[b]MATRIZ_MENU[/b])
if E_MASTER () .or. EXISTE_PROGRAMA (INDICE)
aadd (LINHA,PROMPT)
aadd (BLOCO,ACAO)
aadd (H_IND,INDICE)
aadd (&[b]MATRIZ_MENU[/b].,{ATAIL(LINHA),ATAIL(BLOCO),ATAIL(H_IND)})
endif
return
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
microvolution
- Usuário Nível 5

- Mensagens: 1231
- Registrado em: 02 Set 2011 22:17
- Contato:
Substituir variável por nome dentro do texto
Sim, primeiro queria entender sua colocação "menu windows é apenas uma..."JoséQuintas escreveu:Teste modificando aqui.
Se não me engano, array automaticamente é por referência. Caso contrário, só colocar @menu_cad1
Não se esqueça que menu Windows é apenas uma pequena parte da questão.Código: Selecionar todos
cls Private Menu_Cad1:={} Monta_Vetor("Fornecedor",{|| Executa({|| PCI()})},"PCI1",Menu_Cad1) ? 'Elementos: ',Len(Menu_Cad1) ? 'Conteudo 1: ',Menu_Cad1[1,1] inkey(0) Return Func Monta_Vetor(Prompt,Acao,indice,matriz_menu) AADD(matriz_menu,{Prompt,Acao,indice}) Return Nil Func Executa() Retu Nil Func PCI() Retu Nil
O conteúdo de tudo nem sempre é visível entre os módulos.
Mas esses detalhes dependem da biblioteca gráfica que usa.
Bom, fiz as alterações e como era esperado, não deu mensagem de erro, pois ao clicar em FORNECEDOR não tem (ou tinha) nada dentro das funções EXECUTA() e PCI().
Acho q era isso mesmo q vc queria saber...
bom, agora o q colocar dentro dessas funções e que seja comum a todas opções do MENU? tipo passar os argumentos para serem executados em RUN-TIME?
vlw!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Substituir variável por nome dentro do texto
No meu menu eu coloco o nome do módulo a ser chamado.
Ao clicar na opção, o módulo é executado.
Sobre o que coloquei:
O menu fica disponível, e pode ser chamado a qualquer momento.
Isso significa que o andamento do programa não vai seguir sequência como no Clipper.
Mas nesse caso, depende de como a lib gráfica trata isso.
A lib gráfica contém mais do que apenas a parte gráfica, contém todo comportamento do aplicativo com mais de um módulo rodando ao mesmo tempo - até mesmo se permite isso de dois módulos ao mesmo tempo.
Pode ser que afete a área de arquivo em uso, pode ser que variáveis públicas sejam ou não visíveis ao módulo, e por aí vai.
No meu caso foi onde decidi usar multithread.
E acabei descobrindo um jeito de fazer isso que o pessoal do Harbour não havia pensado.
Isso até entrou para os exemplos do Harbour depois.
O post de quando mostrei isso completou 2 anos:
https://groups.google.com/forum/#!topic ... RuFtYAmnRA
Ao clicar na opção, o módulo é executado.
Sobre o que coloquei:
O menu fica disponível, e pode ser chamado a qualquer momento.
Isso significa que o andamento do programa não vai seguir sequência como no Clipper.
Mas nesse caso, depende de como a lib gráfica trata isso.
A lib gráfica contém mais do que apenas a parte gráfica, contém todo comportamento do aplicativo com mais de um módulo rodando ao mesmo tempo - até mesmo se permite isso de dois módulos ao mesmo tempo.
Pode ser que afete a área de arquivo em uso, pode ser que variáveis públicas sejam ou não visíveis ao módulo, e por aí vai.
No meu caso foi onde decidi usar multithread.
E acabei descobrindo um jeito de fazer isso que o pessoal do Harbour não havia pensado.
Isso até entrou para os exemplos do Harbour depois.
O post de quando mostrei isso completou 2 anos:
https://groups.google.com/forum/#!topic ... RuFtYAmnRA
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
microvolution
- Usuário Nível 5

- Mensagens: 1231
- Registrado em: 02 Set 2011 22:17
- Contato:
Substituir variável por nome dentro do texto
Prezado JoséQuintas, vi seus 2 exemplos e os testei, mas, infelizmente sou muito leigo pra entender os códigos.
Gostaria de saber - na prática, qual a relação entre eles e o meu MENU?
Se puder - mais uma vez, me ajudar a entender o meu problema ou outra alternativa pra funcione, ficarei muito satisfeito, pois está tudo parado, sem passar para o próximo nível, enquanto não resolvo esse.
Gostaria de saber - na prática, qual a relação entre eles e o meu MENU?
Se puder - mais uma vez, me ajudar a entender o meu problema ou outra alternativa pra funcione, ficarei muito satisfeito, pois está tudo parado, sem passar para o próximo nível, enquanto não resolvo esse.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
-
microvolution
- Usuário Nível 5

- Mensagens: 1231
- Registrado em: 02 Set 2011 22:17
- Contato:
Substituir variável por nome dentro do texto
acrescentando...
o único jeito que consegui fazer foi no braço mesmo. E, do jeito abaixo acho muito amador e o código fica muito grande. Veja como consegui fazer o primeiro MENU:
Obs:
1 - As linhas comentadas são as que deveriam funcionar;
2 - Observe que fiz vários IF/ENDIF um dentro do outro verificando se a matriz contém o próximo elemento. Se existir então crio manualmente (no braço) a linha com o ACTION com a função EXECUTA_PROGRAMA2() e os respectivos PCI100xx que será executado (no modo console);
3 - O código ficou maior desnecessariamente;
4 - Era isso que aquela única linha deveria fazer através da matriz MENU_CAD1;
5 - Espero que vc ou alguém me ajude a entender minhas dúvidas.
vlw...
o único jeito que consegui fazer foi no braço mesmo. E, do jeito abaixo acho muito amador e o código fica muito grande. Veja como consegui fazer o primeiro MENU:
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]
// ? 'for/next CADH1',CADH1
// wait
// ITEM MENU_CADH1[CADH1,1] ACTION {||EXECUTA_PROGRAMA2(MENU_CADH1[CADH1,3])} // NAME MENU_CAD1[CAD1,3]
MENUITEM MENU_CADH1[CADH1,1] ACTION BuildExecuteBlock( MENU_CADH1[CADH1,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
*/
MENUITEM MENU_CADH1[1,1] ACTION {||EXECUTA_PROGRAMA2('PCI10001()')}
if len(MENU_CADH1)>1
MENUITEM MENU_CADH1[2,1] ACTION {||EXECUTA_PROGRAMA2('PCI10047()')}
if len(MENU_CADH1)>2
MENUITEM MENU_CADH1[3,1] ACTION {||EXECUTA_PROGRAMA2('PCI10043()')}
if len(MENU_CADH1)>3
MENUITEM MENU_CADH1[4,1] ACTION {||EXECUTA_PROGRAMA2('PCI10048()')}
endif
endif
endif
endif
END POPUP
1 - As linhas comentadas são as que deveriam funcionar;
2 - Observe que fiz vários IF/ENDIF um dentro do outro verificando se a matriz contém o próximo elemento. Se existir então crio manualmente (no braço) a linha com o ACTION com a função EXECUTA_PROGRAMA2() e os respectivos PCI100xx que será executado (no modo console);
3 - O código ficou maior desnecessariamente;
4 - Era isso que aquela única linha deveria fazer através da matriz MENU_CAD1;
5 - Espero que vc ou alguém me ajude a entender minhas dúvidas.
vlw...
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Substituir variável por nome dentro do texto
Mas os fontes que coloquei não são os seus fontes?
Se não for, então melhor começar o assunto do zero novamente.
Por algum motivo seu array não contém o elemento 3.
Seu uso parece até ser mais simples que o meu.
No meu caso é um único array pra tudo, todas as opções horizontais/verticais e submenus.
Se não for, então melhor começar o assunto do zero novamente.
Por algum motivo seu array não contém o elemento 3.
Seu uso parece até ser mais simples que o meu.
No meu caso é um único array pra tudo, todas as opções horizontais/verticais e submenus.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
microvolution
- Usuário Nível 5

- Mensagens: 1231
- Registrado em: 02 Set 2011 22:17
- Contato:
Substituir variável por nome dentro do texto
sim JoséQuintas os códigos q vc postou antes do seu exemplo do "group" referente ao link são meus sim..
parece que esse tal elemento MENU_CADH1[1,3], existe no momento da criação do Menu, só que no Action, por algum motivo o harbour não consegue mais enxergá-lo, é como se fosse assim:
- no clipper como a coisa é procedural e linha por linha e para fazer os MENUs HORIZONTAL e VERTICAL eu usava o recurso do INKEY() para esperar até que o usuário pressionasse ENTER por cima da opção desejada ou pressionasse a tecla HOTKEY (na cor destacada) que aí o interpretador de comandos acionava então a rotina do EVAL() onde chamava o MONTA_VETOR() que chamava o EXECUTA_PROGRAMA() que chamava o EVAL() novamente. É uma confusão que funcionava;
- já no harbour, como essa questão de DEFINE WINDOW é encerrado com um END WINDOW e só é ativado após todo ser formado em WINDOW CENTER WINDOW ACTIVATE; Então no momento do clique essa MATRIZ ainda não está completa; só pode ser isso, pois já tentei as 3 colunas da matriz MENU_CADH1[1,1] ou [1,2] que dá o mesmo erro de ARRAY.
Então, se alguém souber de alguma forma para se resolver isso, senão terei que fazer tudo manualmente, como fiz no código exemplo anterior.
Ah! essa matriz eu estou criando-a como PUBLIC e não PRIVATE no início da FUNCTION() desse módulo; Será que isso também pode ser um dos motivos do erro?
Aguardo mais opiniões e sugestões!
parece que esse tal elemento MENU_CADH1[1,3], existe no momento da criação do Menu, só que no Action, por algum motivo o harbour não consegue mais enxergá-lo, é como se fosse assim:
- no clipper como a coisa é procedural e linha por linha e para fazer os MENUs HORIZONTAL e VERTICAL eu usava o recurso do INKEY() para esperar até que o usuário pressionasse ENTER por cima da opção desejada ou pressionasse a tecla HOTKEY (na cor destacada) que aí o interpretador de comandos acionava então a rotina do EVAL() onde chamava o MONTA_VETOR() que chamava o EXECUTA_PROGRAMA() que chamava o EVAL() novamente. É uma confusão que funcionava;
- já no harbour, como essa questão de DEFINE WINDOW é encerrado com um END WINDOW e só é ativado após todo ser formado em WINDOW CENTER WINDOW ACTIVATE; Então no momento do clique essa MATRIZ ainda não está completa; só pode ser isso, pois já tentei as 3 colunas da matriz MENU_CADH1[1,1] ou [1,2] que dá o mesmo erro de ARRAY.
Então, se alguém souber de alguma forma para se resolver isso, senão terei que fazer tudo manualmente, como fiz no código exemplo anterior.
Ah! essa matriz eu estou criando-a como PUBLIC e não PRIVATE no início da FUNCTION() desse módulo; Será que isso também pode ser um dos motivos do erro?
Aguardo mais opiniões e sugestões!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
- rubens
- Colaborador

- Mensagens: 1520
- Registrado em: 16 Ago 2003 09:05
- Localização: Nova Xavantina - MT
Substituir variável por nome dentro do texto
Olá...
Também não consegui fazer do jeito que você tá tentando... por algum motivo a minigui não transporta o literal do vetor e sim o seu conteúdo... Daí a minha solução foi mandar o nome da função como texto sem as aspas (nao sei porque, mas dava erro aqui quando mandava 'cadcli()', tive que mandar 'cadcli') e mandava um action no item do menu para uma função genérica com o literal da função e dentro da função genérica acrescenta o '()' daí mando executar a função que veio no parâmetro... mas observe que veio literal(texto mesmo) e não a função.. dê uma olhada no meu exemplo aí de repente te ajuda em alguma coisa...
viewtopic.php?f=45&t=16293
Rubens
Também não consegui fazer do jeito que você tá tentando... por algum motivo a minigui não transporta o literal do vetor e sim o seu conteúdo... Daí a minha solução foi mandar o nome da função como texto sem as aspas (nao sei porque, mas dava erro aqui quando mandava 'cadcli()', tive que mandar 'cadcli') e mandava um action no item do menu para uma função genérica com o literal da função e dentro da função genérica acrescenta o '()' daí mando executar a função que veio no parâmetro... mas observe que veio literal(texto mesmo) e não a função.. dê uma olhada no meu exemplo aí de repente te ajuda em alguma coisa...
viewtopic.php?f=45&t=16293
Rubens
"Eu e minha casa servimos ao Senhor e você
"
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Substituir variável por nome dentro do texto
Não tem nada a ver PRIVATE ou PUBLIC.
Como faço o meu, desde os tempos do Clipper:
A rotina acima é a montagem do menu.
Normalmente uso o nome e não codeblock, porque através dele é que verifico se usuário tem acesso.
Rotinas acima sobem ou descem o nível
Montagem do array.
O array é composto por título, array, nome/codeblock
O array (segundo elemento) é pra submenus
Então, não tem limite nenhum de níveis.
O array é criado normalmente, e elementos adicionados, usando variáveis private.
É praticamente o mesmo que você usa pra criar o array.
Talvez a declaração MEMVAR? Se na falta dela o compilador considerar PRIVATE, serão criadas variáveis novas!!!!
Por falar nisso... o modo que passei em outros posts, ou usaria o array como local, ou nem precisaria passar como parâmetro já que é private.
Olhando o post acima, também pensei numa coisa:
Dá uma olhada também como o ACTION é definido no CH.
De repente o compilador troca pra { || suaaction }, e aí nada que faça vai funcionar.
Nesse caso a saída seria escrever baseado no que está no CH, já convertido.
*** como disse antes, tem coisa que depende do comportamento da LIB utilizada, e quem usa a LIB sabe dizer melhor.
Como faço o meu, desde os tempos do Clipper:
Código: Selecionar todos
FUNCTION MenuCria()
MEMVAR nMenuLevel, oMenuOptions
PRIVATE nMenuLevel, oMenuOptions
nMenuLevel := 0
oMenuOptions := {}
MenuOption( "Movto" )
MenuDrop()
MenuOption( "Pedidos/Notas Fiscais" )
MenuDrop()
MenuOption( "Orçamentos/Pedidos", "P0600PED" )
MenuOption( "Emissor JPA", "PEMISSOR" )
MenuOption( "Nota Fiscal (Serviços)", { || PNOT0010() } )
MenuUnDrop()
MenuUnDrop()
...
Normalmente uso o nome e não codeblock, porque através dele é que verifico se usuário tem acesso.
Código: Selecionar todos
STATIC FUNCTION MenuDrop()
MEMVAR nMenuLevel
nMenuLevel++
RETURN NIL
STATIC FUNCTION MenuUnDrop()
MEMVAR nMenuLevel
nMenuLevel--
RETURN NIL
Código: Selecionar todos
STATIC FUNCTION MenuOption( cCaption, oModule )
LOCAL nCont, oLastMenu
MEMVAR nMenuLevel, oMenuOptions
oLastMenu := oMenuOptions
FOR nCont = 1 TO nMenuLevel
oLastMenu := oLastMenu[ Len( oLastMenu ) ]
IF ValType( oLastMenu[ 2 ] ) # "A"
oLastMenu[ 2 ] := {}
ENDIF
oLastMenu := oLastMenu[ 2 ]
NEXT
AAdd( oLastMenu, { cCaption, {}, oModule } )
RETURN NIL
O array é composto por título, array, nome/codeblock
O array (segundo elemento) é pra submenus
Então, não tem limite nenhum de níveis.
O array é criado normalmente, e elementos adicionados, usando variáveis private.
É praticamente o mesmo que você usa pra criar o array.
Talvez a declaração MEMVAR? Se na falta dela o compilador considerar PRIVATE, serão criadas variáveis novas!!!!
Por falar nisso... o modo que passei em outros posts, ou usaria o array como local, ou nem precisaria passar como parâmetro já que é private.
Olhando o post acima, também pensei numa coisa:
Dá uma olhada também como o ACTION é definido no CH.
De repente o compilador troca pra { || suaaction }, e aí nada que faça vai funcionar.
Nesse caso a saída seria escrever baseado no que está no CH, já convertido.
*** como disse antes, tem coisa que depende do comportamento da LIB utilizada, e quem usa a LIB sabe dizer melhor.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
microvolution
- Usuário Nível 5

- Mensagens: 1231
- Registrado em: 02 Set 2011 22:17
- Contato:
Substituir variável por nome dentro do texto
prezados Rubens e JoséQuintas os moderadores mudaram minhas respostas para outro tópico, aliás criaram um novo.
Se puderem nos ajudar favor acompanhar o novo tópico que foi criado em:
https://pctoledo.org/forum/viewto ... 45&t=16301
vlw!
Se puderem nos ajudar favor acompanhar o novo tópico que foi criado em:
https://pctoledo.org/forum/viewto ... 45&t=16301
vlw!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
-
microvolution
- Usuário Nível 5

- Mensagens: 1231
- Registrado em: 02 Set 2011 22:17
- Contato:
Substituir variável por nome dentro do texto
prezados, colocando 2 simples comandos, pude debugar o código; eis os 2 comandos:
Com isso, descobri que a função EXECUTA_PROGRAMA() estava com um erro, pois ela estava dentro de outra função, ou seja, antes de terminar uma função por nome de INICIO_MV () começava a função acima citada.
Com essa descoberta que não apresentava o verdadeiro erro, agora, aquele erro de array não mais existe.
Mas, infelizmente essa variável que existe no FOR/NEXT está apresentando como não mais existe no momento do clique. Vejam um dos locais que acontece o erro:
A variável V1 acima - que é determinada no laço FOR/NEXT existe e inicia no laço, mas, quando clicamos no MENUITEM em questão nos é mostrada uma mensagem de erro que ela não existe.
Vejam a tela com o erro: aguardo algumas opiniões do amigo JoséQuintas, Rubens, Toledo, Eolo, Itamar e demais se puderem nos ajudar.
Código: Selecionar todos
? 'estou aqui na linha xxxx'
waitCom essa descoberta que não apresentava o verdadeiro erro, agora, aquele erro de array não mais existe.
Mas, infelizmente essa variável que existe no FOR/NEXT está apresentando como não mais existe no momento do clique. Vejam um dos locais que acontece o erro:
Código: Selecionar todos
if len(MENU_CAD)>2
POPUP MENU_CAD[3,1]
if len(MENU_CADH3V1)>0
for V1=1 to len(MENU_CADH3V1)
MENUITEM MENU_CADH3V1[V1,1] ACTION {||EXECUTA_PROGRAMA2(&MENU_CADH3V1[V1,3]+' ()')} // NAME MENU_CAD1[CAD1,3]
next
endif
END POPUP
endif
Vejam a tela com o erro: aguardo algumas opiniões do amigo JoséQuintas, Rubens, Toledo, Eolo, Itamar e demais se puderem nos ajudar.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
MICROVOLUTION - 16 anos Evoluindo Com Você!
Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Substituir variável por nome dentro do texto
Cara, vc apresentou a solução e depois a pergunta...
A parte mais difícil já tá pronta, qual seja identificar o erro e em que linha de qual função ele pipocou. Tá lá: “Error Bas3/1003 Variable does not exist: V1 (variável V1 não existe)”, linhas x, y, z das funções A, B, C, desde a Main() até exatamente onde o pau surgiu...
Complicado vc copiar e colar alguma coisa, dentro de um Main() com 4.327 linhas (fora os outros PRGs?), e querer que alguém no Forum aponte exatamente onde está o pepino...
Aliás, 4.327 linhas? Deuzulivre. Meus PRGs têm, no máximo, 100. E acho muito.
Então, que tal vc tentar debugar este segundo erro por conta própria, colocando algum comando aí no meio do trem pra checar cada valor, passo a passo, até descobrir onde tá o furo? Se vc conhece os fundamentos e tem um help das funções (saber como elas funcionam), é só conferir.colocando 2 simples comandos, pude debugar o código...
... Com isso, descobri...
A parte mais difícil já tá pronta, qual seja identificar o erro e em que linha de qual função ele pipocou. Tá lá: “Error Bas3/1003 Variable does not exist: V1 (variável V1 não existe)”, linhas x, y, z das funções A, B, C, desde a Main() até exatamente onde o pau surgiu...
Complicado vc copiar e colar alguma coisa, dentro de um Main() com 4.327 linhas (fora os outros PRGs?), e querer que alguém no Forum aponte exatamente onde está o pepino...
Aliás, 4.327 linhas? Deuzulivre. Meus PRGs têm, no máximo, 100. E acho muito.