Estou postando a forma que sempre usei em Clipper 5.2. Teste o exemplo abaixo e veja se lhe ajuda.
Coloquei na função UPDBAR(), um retardo de Inkey(.1), apenas para o caso se seu DBF conter poucos registros, assim, esse retardo permite você ver a progressão da barra. Para enviar ao Cliente, sugiro remover esse retardo.
Código: Selecionar todos
#include "box.ch" // Constantes manifestas da DispBox
Private cNomeNtx, cChaveNtx, msg, corbox := "W+/N", cortit := "GR+/N"
Clear Screen
Use CLIENTES
cNomeNtx := "CLIENTE1.NTX" // Nome do índice
cChaveNtx := "codigo+nome" // Chave do índice
msg:="Criando o índice => " + cNomeNtx // mensagem ao usuário
NTX("&cChaveNtx.","&cNomeNtx.",msg)
Return Nil
FUNC NTX(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)
LOCA Local1, Local2, qtdreg
PRIV chvind:=TRIM(Arg1)
Local1:=RECC()
qtdreg:=IF((Local1/50)<1,1,INT(Local1/50))
Local2:=LTRIM(TRAN(Local1,"@E 99,999,999"))
Local2:=OPNBAR(Arg3,Local2+" registros",Arg5,Arg6,Arg7,Arg8)
INDEX ON &chvind. TO (Arg2) EVAL UPDBAR(Local2,100*RECN()/Local1) EVERY (qtdreg)
UPDBAR(Local2,100) // completa o termometro
RETU Nil
FUNC OPNBAR(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)
LOCA Local1, Local2, Local3, Local4, Local5, Local6, Local7, ;
Local8, Local9, Local10, Local11
Local1:={}
Local3:=SET(20, "SCREEN")
Arg2:=IF(Arg2=Nil, "", Arg2)
Arg3:=IF(Arg3=Nil, 10, Arg3)
Arg4:=IF(Arg4=Nil, 13, Arg4)
Arg5:=IF(Arg5=Nil,corbox, Arg5)
Arg6:=IF(Arg6=Nil,cortit, Arg6)
IF (Arg3 > 19)
Arg3:=19
ENDI
IF (Arg4 > 25)
Arg4:=25
ENDI
Local5:=Arg3+4
Local6:=Arg4+53
AADD(Local1, SAVESCREEN(Arg3, Arg4, Local5+1, Local6+1))
Local2:=SETCOLOR(cortit)
DISPBEGIN()
DispBox(Arg3, Arg4, Local5, Local6, B_SINGLE )
SETCOLOR(corbox)
IF (!EMPTY(Arg1))
IF (LEN(Arg1) > Local6 - Arg4 - 3)
Arg1:=LEFT(Arg1, Local6 - Arg4 - 3)
ENDI
@ Arg3, Arg4+(Local6-Arg4-LEN(Arg1)-1)/2 SAY (" "+Arg1+" ")
ENDI
IF (!EMPTY(Arg2))
IF (LEN(Arg2) > Local6 - Arg4 - 3)
Arg2:=LEFT(Arg2, Local6 - Arg4 - 3)
ENDI
@ Local5, Arg4+(Local6-Arg4-LEN(Arg2)-1)/2 SAY (" "+Arg2+" ")
ENDI
@ Arg3+1, Arg4+25 SAY (TRAN(0,"999%"))
@ Arg3+3, Arg4+2 SAY ("")
FOR Local4:=1 TO 9
@ Arg3+3, Arg4+1+Local4*5 SAY ("")
NEXT
@ Arg3+3, Local6-2 SAY ("")
@ Arg3+2, Arg4+2 SAY (REPL(CHR(177), 50))
DISPEND()
SETCOLOR(Local2)
AADD(Local1, Arg3)
AADD(Local1, Arg4)
AADD(Local1, IF(PROCNAME(1)="NTX",-1,0))
AADD(Local1, Arg5)
AADD(Local1, Arg6)
SETCURSOR(0)
SET(20, Local3)
RETU Local1
FUNC UPDBAR(Arg1, Arg2)
LOCA Local1, Local2, Local3
IF (Arg2 > 100)
Arg2:=100
ENDI
Local3:=INT(Arg2 / 2)
IF (VALTYPE(Arg1)="A")
IF (Arg1[4] < 0)
Arg1[4]:=0
ELSEIF (Local3 > Arg1[4])
Local2:=SET(20, "SCREEN")
Local1:=SETCOLOR(Arg1[6])
@ Arg1[2]+1, Arg1[3]+25 SAY (TRAN(Arg2, "999%"))
@ Arg1[2]+2, Arg1[3]+2 SAY (REPL(CHR(219), Local3))
Arg1[4]:=Local3
SETCOLOR(Local1)
SET(20, Local2)
ENDI
ENDI
inkey(.1) // para enviar ao cliente, sugiro não usar retardo
RETU (.T.)