Página 1 de 1

Como usar & (Macro) no Harbou 3.4?

Enviado: 04 Ago 2018 12:12
por clodoaldomonteiro
Boas,

Estou convertendo meus fontes de xHarbour 1.00 para Harbour 3.4 e vi que este interpreta de uma forma diferente o uso de & (Macro).

Exemplo:

Código: Selecionar todos

      FOR i=1 TO FCOU()
         msg=FIEL(i)
          M->&msg = IF((fgrep .OR. reg_cop!=NIL).AND.!EMPT(rep[1]), rep[i], &msg.)
      NEXT

      /*
      inicializa campos de relacionamentos do com os campos do arquivo
      superior (pai)
      */
      FOR i=1 TO LEN(sistema[op_sis,O_CPRELA])
         msg=FIEL(VAL(SUBS(sistema[op_sis,O_ORDEM,1],i*3-2,3)))
          M->&msg. = &(sistema[op_sis,O_CPRELA,i])
      NEXT
Os comandos com & devem ser mudados para: M->&(msg), e pergunto o porque disso, se existe maneira de contornar?

Outra coisa, é que nas Framework que usava, tem muita comando com um "." (ponto) no final, tipo: "&msg.", que também está causando erro de syntax no Harbour, e pra falar a verdade nem sei para que serve esse Ponto no final.

Como usar & (Macro) no Harbou 3.4?

Enviado: 04 Ago 2018 20:34
por JoséQuintas
O ponto era uma coisa do tempo do clipper, porque as vezes a macro pegava a continuação que não era pra pegar.
A indicação de memória ou campo faz parte da variável, então provavelmente colocar dentro da macro.

Código: Selecionar todos

&( "m->" + variável )
&( "field->" + variável )
&( "cliente->" + variável )
e se valer igual arquivo, tentar isto:

Código: Selecionar todos

m->( &( variável ) )
field->( &( variável ) )
cliente->( &( variável ) )
Nada diferente do que fazemos com outras coisas:

Código: Selecionar todos

cliente->( RecNo() )
cliente->( LastRec() )
cliente->( Eof() )
cliente->( dbSkip() )
Mas na prática eu evito macro ao máximo.
Prefiro digitar campo a campo do que FOR/NEXT.
É que se eu quiser procurar aonde mexe com um campo nota->ValorIcms, basta procurar nos fontes, e com macro é impossível.

Macro é mais lenta do que o campo direto, mas na maioria dos casos essa diferença nem dá pra perceber.