Vamos entender isso então:
Este era o código que ele estava usando:
CAB_REL1(TITULOPRI,TITULOSEC,TITULOTER)
? " No | Nome da Conta de Entrada "
? "-----+----------------------------------------------------------------------------------------"
DO WHILE .NOT. EOF()
IF L=67
? REPLICATE ("-",TAM_REL)
? ""
__Eject()
L:=1
CAB_REL1(TITULOPRI,TITULOSEC,TITULOTER)
? " No | Nome da Conta de Entrada "
? "-----+----------------------------------------------------------------------------------------"
Fácil entender que L começa em 1, linha 0 (zero) da impressora. Então quando L for 67, ele está na linha 66 do formulário, e fecha com
? REPLICATE ("-",TAM_REL). Em seguida ele usa
? "". Como o limite de impressão são de 66 linhas, agora ele está na linha 67, e é quando ele coloca o
__Eject() (o mesmo que EJECT). Esse EJECT foi colocado na primeira linha da próxima página, como mostra a postagem dele mais acima, e era ele que causava o EJECT da folha em branco antes de iniciar a impressão das páginas seguintes.
Possível confusão:
@ 0,0 SAY REPLICATE ("=",TAM_REL)
Se ele iniciava a impressão na linha Zero, porque não removia o caractere Chr(12) - (O EJECT)?
Porque após o EJECT, os valores PRow() e PCol() passam a serem ZERO. Portanto, a linha corrente do inicio do cabeçalho, era a linha Zero mas após o EJECT que foi colocado, também como mostra a postagem dele mais acima.
Entendendo a alteração:
The difference between ? and ?? is that the ? command first outputs a carriage-return/line-feed pair so that the output of <expression,...> always begins at a new line, while ?? outputs the values of <expression,...> at the current cursor or printhead position.
Assim, como ele grava o arquivo via
SET PRINTER TO ARQ1.TXT, o sistema está usando
FWrite() para gerar o arquivo. Ao trocar
@ 0,0 Say... por
??, a linha inicial da próxima página que era o caractere EJECT, foi sobreposta, então não tem o EJECT que solta a folha em branco.
NOTA: Se a página é impressa em seu limite de linha, não precisa usar EJECT, a folha acabou e é ejetada, e a impressora puxa a próxima. O sistema apenas precisa zera o contador, nesse caso o "L", como ele faz. Se quer usar o EJECT, precisa ser no máximo na última linha da folha anterior, o que não é necessário, então se vai usar
@ x,y Say ... precisa usar SetPRC( 0,0 ). Quando usa "?" ou "??", apenas controla número de página, inicio e final pelo número de linhas da folha, sem nenhuma outra preocupação com SetPRC() ou o que seja para gerar o arquivo. Apenas na última folha, verificar se a folha foi completamente usada, caso não, então sim usar o EJECT para ejetar a folha.
Sobre EJECT aplicar automaticamente SetPRC( 0, 0 ):
The EJECT command ejects the current page from the printer by sending a form feed control character (Chr(12)) to the printer. In addition, the functions for maintaining the current postion of the printhead are reset to zero (see PCol() and PRow()).