Substituir variável por nome dentro do texto

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Substituir variável por nome dentro do texto

Mensagem por microvolution »

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.
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!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Substituir variável por nome dentro do texto

Mensagem por JoséQuintas »

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.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Substituir variável por nome dentro do texto

Mensagem por JoséQuintas »

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

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
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.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Substituir variável por nome dentro do texto

Mensagem por JoséQuintas »

Só que num dos posts faz referência a outros arrays que não constam no fonte.

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
Isso usa os arrays linha, bloco e h_ind
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Substituir variável por nome dentro do texto

Mensagem por microvolution »

JoséQuintas escreveu: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
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.
Sim, primeiro queria entender sua colocação "menu windows é apenas uma..."????

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!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Substituir variável por nome dentro do texto

Mensagem por JoséQuintas »

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
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Substituir variável por nome dentro do texto

Mensagem por microvolution »

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.
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
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Substituir variável por nome dentro do texto

Mensagem por microvolution »

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:

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
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...
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!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Substituir variável por nome dentro do texto

Mensagem por JoséQuintas »

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.
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Substituir variável por nome dentro do texto

Mensagem por microvolution »

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!
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!
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Substituir variável por nome dentro do texto

Mensagem por rubens »

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
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Substituir variável por nome dentro do texto

Mensagem por JoséQuintas »

Não tem nada a ver PRIVATE ou PUBLIC.
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()
...
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.

Código: Selecionar todos

STATIC FUNCTION MenuDrop()
   MEMVAR nMenuLevel
   nMenuLevel++
   RETURN NIL

STATIC FUNCTION MenuUnDrop()
   MEMVAR nMenuLevel
   nMenuLevel--
   RETURN NIL
Rotinas acima sobem ou descem o nível

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
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.
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Substituir variável por nome dentro do texto

Mensagem por microvolution »

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!
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
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Substituir variável por nome dentro do texto

Mensagem por microvolution »

prezados, colocando 2 simples comandos, pude debugar o código; eis os 2 comandos:

Código: Selecionar todos

? 'estou aqui na linha xxxx'
wait
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:

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
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:
main v1 nao existe.JPG
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!
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Substituir variável por nome dentro do texto

Mensagem por Eolo »

Cara, vc apresentou a solução e depois a pergunta...
colocando 2 simples comandos, pude debugar o código...
... Com isso, descobri...
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.

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.
Responder