Página 1 de 1
CodeBlock com MACRO
Enviado: 17 Jun 2024 11:42
por Itamar M. Lins Jr.
Olá!
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.
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:
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