Página 1 de 1

CodeBlock com MACRO

Enviado: 17 Jun 2024 11:42
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

{ || fFuncao( cABC, &cABC ) }
Preciso compilar esse código, só que o Harbour não aceita.

Saudações,
Itamar M. Lins Jr.

CodeBlock com MACRO

Enviado: 17 Jun 2024 12:08
por JoséQuintas
Dependendo do que tem no segundo ABC, pode ter outra saída.
O problema pode só piorar, dependendo das variáveis lá dentro.

Código: Selecionar todos

bCode := &( "{ || Funcao( cABC, " + cAbc + " )}" )

CodeBlock com MACRO

Enviado: 17 Jun 2024 22:11
por ivanil
Tudo depende do que você quer ao final, mas para este caso bem específico, uma simples chamada para explodir a macro já resolve, pegará o valor em tempo real.

Mas não esqueça das outras opções, Ponteiro da função, hb_ExecFromArray...

CodeBlock com MACRO

Enviado: 18 Jun 2024 11:04
por Itamar M. Lins Jr.
Olá!
Dessa forma funciona, sempre funcionou.
{ || fFuncao( &cABC ) }
Dai precisei passar mais 1 parâmetro.
{ || fFuncao( &cABC, NovoParametro ) }
Ai já não aceita. Não quero declarar PRIVATE ou PUBLIC o parâmetro.
Vou ver como função.

Saudações,
Itamar M. Lins Jr.

CodeBlock com MACRO

Enviado: 18 Jun 2024 21:34
por JoséQuintas
Tem algumas situações aonde o harbour só consegue trabalhar com a macro sozinha, se não me engano no valid também acontece isso.
Teste se &(variavel) aceita
Uma que descobri outro dia é usar FOR/EACH mas depende da situação.

Código: Selecionar todos

FOR nCont = 1 TO 10
   FOR EACH nMacroCont = nCont TO nCont
      bCode := { || nMacroCont }
   NEXT
NEXT
Isso teria o mesmo efeito que criar uma função, porque nMacroCont fica protegida de interferências.
Se usar nCont não vai ter o mesmo resultado.

CodeBlock com MACRO

Enviado: 19 Jun 2024 14:03
por alxsts
Olá!

Use um codeblock estendido. Dentro dele poderá escrever um Prg inteiro e talvez nem precise usar macro.

Código: Selecionar todos

LOCAL bBlock := { |n|

                  LOCAL nVar 

                   FOR nVar := 1 To 10
                      QOut( nVar * n )  
                   NEXT

                   RETURN nVar
                }

// ...

? Eval( bBlock, 7 )
Nota:
Em Harbour, um codeblock estendido é delimitado da mesma forma como em Cl*pper: { || ... }. Já no xHarbour, um codeblock estendido é delimitado pelos símbolos menor que e maior que: < || ... >

CodeBlock com MACRO

Enviado: 19 Jun 2024 14:33
por Itamar M. Lins Jr.
Olá!
No caso é um codeblock de um BOTÃO
...
ON CLICK {|| FuncaoX(&nPDV) } //Aqui ok
ON CLICK {|| FuncaoX(&nPDV,oDlg) } //Aqui fault! Pode ser uma limitação do Harbour. Veja que está como parâmetro da função tem uma virgula e está dentro de uma função.
ON CLICK {|| FuncaoX(&nPDV),MaisUmaFunc(),... } //Ok.
...

Saudações,
Itamar M. Lins Jr.

CodeBlock com MACRO

Enviado: 19 Jun 2024 15:03
por Itamar M. Lins Jr.
Olá!
Descobri que enquanto a função recebe o parametro na linha em baixo usando a palavra PARAMETERS funciona.
Function xFuncao
Parameters oDlg
...
ON CLICK {|| FuncaoX(&nPDV,oDlg) } //Aqui funciona.
...
Function xFuncao(oDlg)
...
ON CLICK {|| FuncaoX(&nPDV,oDlg) } //Aqui dá erro.
...

Saudações,
Itamar M. Lins Jr.

CodeBlock com MACRO

Enviado: 19 Jun 2024 16:14
por JoséQuintas
Significa que a linha inteira vai pra máquina virtual, e não apenas onde tem macro.

isso é o mesmo que:

Código: Selecionar todos

FUNCTION ( x )
PRIVATE b
b := x
Só vai tornar o fonte mais inseguro do que já está.

Porque &nPDV?

Volte atrás de onde saiu esse nPDV e modifique lá.

CodeBlock com MACRO

Enviado: 20 Jun 2024 09:38
por Itamar M. Lins Jr.
Olá!
Entendi!!!!!
Um CodeBlock é uma função um .prg.

Se a variável for local ele não enxerga!
Assim agora funciona!
Function MyFunc(oDlg)
{|oDlg| fOutraFunc(&nPDV,oDlg)}

As duas barras é o mesmo que a ENTRADA ou seja passagem do parâmetro para dentro do CodeBlock.
E, tem que usar &(macro) pq se não usar irá passar sempre o valor do ultimo botão.(numero)

for nPDV := 1 to 100
... ON CLICK {||fOutraFunc(nPDV)}
next
Assim como tá em cima só chega 100(passa para a fOutraFunc()) em todos, quer dizer o ultimo.

Saudações,
Itamar M. Lins Jr.

CodeBlock com MACRO

Enviado: 20 Jun 2024 12:47
por JoséQuintas
Escrevi o for/each errado quando postei:

Código: Selecionar todos

FOR nCont = 1 TO 100
   FOR EACH nBlock IN { nCont }
       ON CLICK { || Funcao( oDlg, nBlock ) }
   NEXT
NEXT
Poderia ser FOR EACH nCont IN { 1,2,3,4,5,6.... } mas aí vai fonte pra criar o array, ou já cria função pra coisas desse tipo.

Código: Selecionar todos

FOR EACH nCont IN ArrayNumeros( 100 )
   ON CLICK { || Funcao( oDlg, nCont ) }
NEXT

FUNCTION ArrayNumeros( n )

   LOCAL aList := {}

   FOR nCont = 1 TO n
      AAdd( aList, nCont )
   NEXT

   RETURN aList