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: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, 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/
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
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 2325 vezes
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, 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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
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: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 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: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, 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/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, 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