Página 1 de 3

Substituir variável por nome dentro do texto

Enviado: 14 Nov 2005 16:47
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

Enviado: 14 Nov 2005 17:33
por filizola
variavel="Ze Bedeu"

"Iremos apresentar agora nosso amigo &VARIAVEL. com muita honra"

Enviado: 15 Nov 2005 12:34
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

Enviado: 15 Nov 2005 13:41
por rrfsistemas
Estarei olhando e testando obrigado. :D

Enviado: 15 Nov 2005 18:28
por filizola
é isso aí o AND tem razão, o exemplo do forum é fantástico, eu inclusive uso este recurso dele.

Substituir variável por nome dentro do texto

Enviado: 26 Jun 2015 21:17
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!

Substituir variável por nome dentro do texto

Enviado: 26 Jun 2015 22:40
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,

Substituir variável por nome dentro do texto

Enviado: 27 Jun 2015 00:29
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]

Substituir variável por nome dentro do texto

Enviado: 03 Jul 2015 01:40
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.

Substituir variável por nome dentro do texto

Enviado: 03 Jul 2015 18:51
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!

Substituir variável por nome dentro do texto

Enviado: 03 Jul 2015 20:09
por JoséQuintas
Esse erro é quando tenta acessar o elemento de um array que não existe.

Substituir variável por nome dentro do texto

Enviado: 03 Jul 2015 21:49
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.

Substituir variável por nome dentro do texto

Enviado: 03 Jul 2015 22:22
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.

Substituir variável por nome dentro do texto

Enviado: 04 Jul 2015 11:23
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.

Substituir variável por nome dentro do texto

Enviado: 04 Jul 2015 12:21
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 ) }