CodeBlock com MACRO

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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 + " )}" )
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 180
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

CodeBlock com MACRO

Mensagem 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...
Anexos
2024-06-17_221832.png
2024-06-17_221832.png (9.31 KiB) Exibido 2413 vezes
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
alxsts
Colaborador
Colaborador
Mensagens: 3107
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

CodeBlock com MACRO

Mensagem 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: < || ... >
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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á.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

CodeBlock com MACRO

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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