Substituir variável por nome dentro do texto

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
rrfsistemas
Usuário Nível 3
Usuário Nível 3
Mensagens: 249
Registrado em: 11 Jul 2004 18:16
Localização: Uberlândia/MG

Substituir variável por nome dentro do texto

Mensagem por rrfsistemas »

Preciso de algum exemplo de como trabalhar com variáveis dentro de um texto, ou seja, substituir uma variável pelo seu conteúdo dentro de um texto e depois justifica-lo dentro da página.

Se alguem puder me indicar ou me ajudar fico grato...

100 + :xau
"Não é a ferramenta que faz o artesão e sim a sua criatividade...""
Renato Ribeiro Ferreira
Tecnologia em Analise de Sistemas de Informação
http://www.rrfsistemas.hd1.com.br
( VFP 9 + MySql e/ou Oracle 11 ) - ...Harbour/MiniGui...
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

variavel="Ze Bedeu"

"Iremos apresentar agora nosso amigo &VARIAVEL. com muita honra"
And
Usuário Nível 3
Usuário Nível 3
Mensagens: 163
Registrado em: 25 Set 2005 18:31
Localização: São Paulo/SP

Mensagem por And »

Se o exemplo do Filizola não for o bastante, tem um exemplo de como fazer o que precisa na seção de download postado pelo Toledo.


Link:

https://pctoledo.org/download/cop ... t&deonde=2


:xau
Anderson
Clipper 52e/Clipper 53b/Blinker 7/Vlib/Fglib/DBFNTX
_______________________________________________
Migrando para [x]Harbour 0.99.60 (SimpLex) + MiniGUI 1.2 Exp. (Build 22)
_______________________________________________
Assine o manifesto dos artistas pela preservação da amazônia.
Avatar do usuário
rrfsistemas
Usuário Nível 3
Usuário Nível 3
Mensagens: 249
Registrado em: 11 Jul 2004 18:16
Localização: Uberlândia/MG

Mensagem por rrfsistemas »

Estarei olhando e testando obrigado. :D
"Não é a ferramenta que faz o artesão e sim a sua criatividade...""
Renato Ribeiro Ferreira
Tecnologia em Analise de Sistemas de Informação
http://www.rrfsistemas.hd1.com.br
( VFP 9 + MySql e/ou Oracle 11 ) - ...Harbour/MiniGui...
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

é isso aí o AND tem razão, o exemplo do forum é fantástico, eu inclusive uso este recurso dele.
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 »

olá pessoal, já se passaram 10 anos deste tópico. rsrs.
Espero que alguém possa me ajudar, pra que eu evite de abrir um novo tópico.

O meu caso não é apenas uma variável qualquer e sim uma MATRIZ/VETOR. Observem a chamada a função MONTA_VETOR e seu conteúdo:

Código: Selecionar todos

MONTA_VETOR (LINHA,BLOCO,H_IND,'&Fornecedores',{|| EXECUTA_PROGRAMA ({|| PCI10005 ()})},'PCI10005',[b]'MENU_CAD1'[/b])

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
Bom, se os caros colaboradores e professores observarem coloquei 2 itens em destaque e é exatamente o meu problema e pensei que daria certo, mas, o harbour, ou melhor a HMG 3.0.XX apresenta a seguinte mensagem de erro:

Código: Selecionar todos

Error BASE/1065 Argument error: &
Called from MONTA_VETOR(nnnn)
...
Então, em todas as vezes que chamo a função MONTA_VETOR, passo pra ela alguns argumentos, mas o argumento final (nesse caso aqui MENU_CAD1) é uma MATRIZ pública, ou seja, eu preciso que dentro da função MONTA_VETOR eu aproveite apenas o nome que é o verdadeiro conteúdo.

Bom, não sei se expliquei ou se compliquei, mas, o valor passado entre aspas "MENU_CAD1" é o nome de uma matriz de apenas uma linha, e,quando ela é recebida na função o nome é mudado para MATRIZ_MENU, que recebe o conteúdo MENU_CAD1. Então quando chega a vez da linha:
aadd (&MATRIZ_MENU.,{ATAIL(LINHA),ATAIL(BLOCO),ATAIL(H_IND)}) o erro citado é retornado.

alguém tem alguma ideia para mim?
vlw!
Ah! EU CREIO QUE DEUS EXISTE e você é como o pai de um certo cantor que morreu tão jovem? Pense, assim como nos dias de Noé, será na volta do Filho do Homem: JESUS CRISTO!
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
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Substituir variável por nome dentro do texto

Mensagem por Toledo »

Amigo, compilei com o Clipper e funcionou:

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
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
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 »

realmente o prezado Toledo tem razão...
verifiquei e revisei o código e nalgum momento, a variável estava com um pequeno erro de ortografia.
Desculpa o incômodo.

[Editado]
Editado pela última vez por Toledo em 27 Jun 2015 08:14, em um total de 1 vez.
Razão: Esta mensagem foi editada para retirar um texto que já foi postado em um outro tópico na seção correta para assuntos sobre MiniGui.
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 »

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.
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: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
Error BASE/1132 Bound error: array access
Se alguém puder desvendar esse mistério, agradeceremos.
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 »

Esse erro é quando tenta acessar o elemento de um array que não existe.
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:Esse erro é quando tenta acessar o elemento de um array que não existe.
sim sei; disso "já estou cabeludo de saber".

Agora, enviei todos os meus códigos pra que vc ou alguém me ajude, pois nos testes que fiz não apresenta nenhuma falta desse elemento.
Compile vc mesmo e descubra, por favor, se puder!
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 »

Ok, agora entendi.
Não tem nada a ver com Clipper.

Vai ter que confirmar com quem usa a LIB gráfica.

É possível que quem execute a rotina seja o Windows, e não o programa, e por isso a variável não existe no momento da execução, ou contém apenas .F.

Talvez seja melhor redefinir o estilo de criar o menu.

Pode tentar também o uso de uma função, ao invés do array diretamente.

Código: Selecionar todos

STATIC xArray := {}

FUNCTION OArray()
   RETURN xArray
Mas antes disso, convém verificar se não tem um jeito mais simples de fazer isso.
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 »

certo...
mas não entendi como usar essa sua sugestão...

pode ser mais específico em qual das minhas funções se encaixaria essa sua? ou seja, é possível vc mostrar-me como trocar?
ou uma outra sugestão de mudança.
Se vc ver todo o contexto desse tópico, verá que nada mais ou nada menos - resumindo tudo, é o seguinte:
1 - tenho um arquivo DBFNTX (aliás tudo é DBFNTX ainda) que contem todos os nomes dos módulos (contas a pagar, a receber, vendas, clientes,etc) e outro arquivo de mesmo nome mas em .TXT. Esses 2 arquivos funcionam assim: se o tal usuário pode ter acesso àquele tal opção do menu (no clipper antigo funcionava e no harbour modo console perfeitamente bem e funcional) o menu ou as opções dele são criadas em RUN-TIME.
2 - Existem 2 funções dentro do meu .PRG de funções que criam o MENU POPUP (modo console) que chamam-se MENU_HORIZONTAL() e MENU_VERTICAL(). Elas pegam e trabalham em conjunto com esses 2 arquivos e vão criando as opções do MENU POPUP (modo console e sem mouse) através da função E_MASTER() dentro da função MONTA_VETOR() (que está aqui postado) e monta o menu para o usuário que logar.

Então, foi através disso, para migrar para modo gráfico que preciso fazer. Se ou alguém aqui do fórum mais capacitado que eu, tiver uma outra ideia ou sugestão ficarei honrado com o aprendizado.
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 »

Acabei passando respostas referente à criação, e não à execução.

O codeblock vai usar o conteúdo no momento do click, e não o conteúdo que está no momento da criação do codeblock, por isso o erro.

O action só precisa saber da opção, e não do array.

Então.... colocar no action o que é do action.

Código: Selecionar todos

POPUP MENU_CAD[1,1]
 if len(MENU_CADH1)>0
  for CADH1=1 to len(MENU_CADH1)
   MENUITEM MENU_CADH1[CADH1,1] ACTION BuildExecuteBlock( MENU_CADH1[CADH1,3] )
  next
 endif
END POPUP

FUNCTION BuildExecuteBlock( xOpcao )
RETURN { || Executa_Programa2( xOpcao ) }
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/
Responder