Talvez agilize fazer isso através de Ãndice.
Mas é tanta coisa assim pra excluir?
Tem aquele meu, de sempre, que mostra até o tempo estimado pra terminar.
Uso até na reindexação, mas aà precisa algo mais.
Basicamente é GrafTempo( "texto" )
e depois GrafTempo( nAtual, nTotal )
Pra usar em DBF, sem Ãndice, pode usar RecNo() e LastRec().
Se for com Ãndice, cria nAtual := 0, e na chamada GrafTempo( nAtual++, LastRec() )
/*
ZE_GRAFTEMPO - GRAFICOS DE PROCESSAMENTO
1990.05 - José Quintas
*/
#include "inkey.ch"
#include "set.ch"
#include "josequintas.ch"
#ifdef FlagShip
#define GRAFTEMPO_ON .T.
#else
#define GRAFTEMPO_ON .T.
#endif
#define GRAFMODE 1
#define GRAFTIME 2
#define GRAF_MARCACAO "I" // Chr(30) nao aparece no Linux
#define GRAF_TXT_BAR 1
#define GRAF_TXT_TEXT 2
#define GRAF_SEC_OLD 3
#define GRAF_SEC_INI 4
FUNCTION GrafProc( nRow, nCol )
STATIC GrafInfo := { 1, "X" }
LOCAL mSetDevice
hb_Default( @nCol, MaxCol() - 2 )
hb_Default( @nRow, MaxRow() - 1 )
IF GrafInfo[ GRAFTIME ] != Left( Time(), 8 )
mSetDevice := Set( _SET_DEVICE, "SCREEN" )
@ nRow, nCol SAY "(" + Substr( "|/-\", GrafInfo[ GRAFMODE ], 1 ) + ")" COLOR SetColMensagem()
GrafInfo[ GRAFMODE ] = iif( GrafInfo[ GRAFMODE ] == 4, 1, GrafInfo[ GRAFMODE ] + 1 )
Set( _SET_DEVICE, mSetDevice )
GrafInfo[ GRAFTIME ] := Left( Time(), 8 )
ENDIF
RETURN .T.
FUNCTION GrafTempo( xContNow, xContTotal )
STATIC aStatic := { "", "", 0, 0 }
LOCAL nSecNow, nSecRemaining, nSecElapsed, nCont, nPos, cTxt, cCorAnt
LOCAL nPercent, cTexto, mSetDevice
IF ! GRAFTEMPO_ON
RETURN NIL
ENDIF
IF pCount() == 0
xContNow := ""
ENDIF
IF Empty( aStatic[ GRAF_TXT_BAR ] )
aStatic[ GRAF_TXT_BAR ] := Replicate( ".", MaxCol() )
FOR nCont = 1 to 10
nPos := Int( Len( aStatic[ GRAF_TXT_BAR ] ) / 10 * nCont )
cTxt := lTrim( Str( nCont, 3 ) ) + "0%" + GRAF_MARCACAO
aStatic[ GRAF_TXT_BAR ] := Stuff( aStatic[ GRAF_TXT_BAR ], ( nPos - Len( cTxt ) ) + 1, Len( cTxt ), cTxt )
NEXT
aStatic[ GRAF_TXT_BAR ] := GRAF_MARCACAO + aStatic[ GRAF_TXT_BAR ]
ENDIF
mSetDevice := Set( _SET_DEVICE, "SCREEN" )
DO CASE
CASE ValType( xContNow ) == "C"
cTexto := xContNow
aStatic[ GRAF_SEC_INI ] := Int( Seconds() )
CASE xContTotal == NIL
nPercent := xContNow
CASE xContNow >= xContTotal
nPercent := 100
OTHERWISE
nPercent := xContNow / xContTotal * 100
ENDCASE
xContNow := iif( ValType( xContNow ) != "N", 0, xContNow )
xContTotal := iif( ValType( xContTotal ) != "N", 0, xContTotal )
cCorAnt := SetColor()
SetColor( SetColMensagem() )
nSecNow := Int( Seconds() )
IF nPercent == NIL
aStatic[ GRAF_SEC_OLD ] := nSecNow
Mensagem()
@ MaxRow(), 0 SAY aStatic[ GRAF_TXT_BAR ]
aStatic[ GRAF_TXT_TEXT ] := cTexto
ELSEIF nPercent == 100 .OR. ( nSecNow != aStatic[ GRAF_SEC_OLD ] .AND. nPercent != 0 )
aStatic[ GRAF_SEC_OLD ] := nSecNow
nSecElapsed := nSecNow - aStatic[ GRAF_SEC_INI ]
DO WHILE nSecElapsed < 0
nSecElapsed += ( 24 * 3600 ) // Acima de 24 horas
ENDDO
nSecRemaining := nSecElapsed / nPercent * ( 100 - nPercent )
@ MaxRow() - 1, 0 SAY aStatic[ GRAF_TXT_TEXT ] + " " + Ltrim( Transform( xContNow, "@E 999,999,999,999" ) ) + "/" + Ltrim( Transform( xContTotal, "@E 999,999,999,999" ) )
cTxt := "Gasto:"
cTxt += " " + Ltrim( Str( Int( nSecElapsed / 3600 ), 10 ) ) + "h"
cTxt += " " + Ltrim( Str( Mod( Int( nSecElapsed / 60 ), 60 ), 10, 0 ) ) + "m"
cTxt += " " + Ltrim( Str( Mod( nSecElapsed, 60 ), 10, 0 ) ) + "s"
cTxt += Space(3)
cTxt += "Falta:"
cTxt += " " + Ltrim( Str( Int( nSecRemaining / 3600 ), 10 ) ) + "h"
cTxt += " " + Ltrim( Str( Mod( Int( nSecRemaining / 60 ), 60 ), 10, 0 ) ) + "m"
cTxt += " " + Ltrim( Str( Mod( nSecRemaining, 60 ), 10, 0 ) ) + "s"
@ Row(), Col() SAY Padl( cTxt, MaxCol() - Col() - 3 )
GrafProc()
@ MaxRow(), 0 SAY Left( aStatic[ GRAF_TXT_BAR ], Len( aStatic[ GRAF_TXT_BAR ] ) * nPercent / 100 ) COLOR SetColFocus()
ENDIF
SetColor( cCorAnt )
SET( _SET_DEVICE, mSetDevice )
RETURN .T.