código escrito · artículos digitales de informática
 
Las barras de progreso ideales
06.07.2003 :: Jaime Irurzun

Desde que comencé a programar – que no a hacer programas -, no he podido entender que sea tan engorroso crear una barra de progreso (meter) con Fivewin.
¿Por qué cuando creamos un meter hay que indicarle un total y decirle cuándo debe pintarse la barra? Si ahora quiero crear uno para mostrar el progreso de una tarea que se está realizando - por ejemplo una reindexación -, tengo que hacerlo más o menos de esta manera:

FUNCTION Reindexar()

LOCAL oDlg, oMtr, nTotal := nSet := 0
LOCAL aInd := { { “strZero( nCodigo, 5 )”, “tCodigo”, “! deleted()” },;
{ “upper( cTitulo )”, “tTitulo”, “! deleted()” } }

nTotal := Clientes->( recCount() ) * len( aInd )

DEFINE DIALOG oDlg RESOURCE "Reindexar"

REDEFINE METER oMtr VAR nSet TOTAL nTotal ID 300 OF oDlg
oDlg:bStart := { || sysRefresh(), RndxMtrs( oMtr ), oDlg:end() }

ACTIVATE DIALOG oDlg

RETURN nil

FUNCTION RndxMtrs( oMtr, aInd )

LOCAL cInd := cTag := cFor := space( 01 )
LOCAL nTags := len( aInd ), nI := 0

FOR nI := 1 TO nTags
cInd := aInd[ nI, 1 ]
cTag := aInd[ nI, 2 ]
cFor := aInd[ nI, 3 ]
INDEX ON &cInd TAG &cTag FOR &cFor;
eval( oMtr:set( Clientes->( recNo() ) * len( aInd ) ), sysRefresh() )
NEXT

RETURN nil

No es que sea demasiado complicado, pero siempre he pensado que sería muchísimo más sencillo tener una clase que se pudiera utilizar de esta forma:

// instrucciones del programa

// activar barra de progreso
// instrucciones que el meter tiene que representar
// destruir barra de progreso

// instrucciones del programa

Supongo que si al menos para Fivewin nadie ha hecho nada parecido hasta ahora será que es complicado. Se trata de indicar cuándo debe comenzar a pintarse el meter y cuándo debe acabar. Que él solo se encargue de calcular el tiempo que puede tardar en hacerlo y de pintar la barra proporcionalmente. ¿Conocéis algún lenguaje o GUI que permita algo así? Solo es por curiosidad.

comentarios (3) |


Comentarios del artículo
1 · abel · 06.07.2003

En java el componente tampoco es tan sencillo como tú indicas:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JProgressBar.html

Tienes que lanzarlo en un thread aparte y otra serie de asuntos. Supongo que el que tú lo controles te da más poder.

2 · Kronen · 07.07.2003

¿Calcular automáticamente el tiempo que tarda en reindexarte? Me parece que eso es imposible.

Claro que puede haber bibliotecas para facilitarte la tarea. En la api de windows puedes pasar tu rutina de la barra de progreso a varias funciones sin tener que indicar el rango ni el paso, por ejemplo CopyFileEx ya se encarga de actualizar según la cantidad de datos transferida.

De cualquier otra forma el "tempo" lo debes marcar tú en tu rutina poniendo el rango mín-máx y el número de unidades a avanzar. La verdad es q no programo en xBase y no entiendo tu codigo, pero lo tienes hecho así, no? El rango máximo es el total de usuarios y avanzarías la barra de progreso un paso por cada indexación.

3 · Jaime Irurzun · 07.07.2003

Eso es, Kronen.
Si te fijas en esto:

eval( oMtr:set( Clientes->( recNo() ) * len( aInd ) ), sysRefresh() )

Lo que hace es evaluar todo eso cada vez que regenera una clave. Actualiza el meter al número total de registros (recNo) por el número de TAGs (len(aInd)). Y actualiza para que se vea el pintado.

Pues aunque parece imposible, a ver si alguien idea una forma de conseguirlo.














































Creative Commons - Jaime Irurzun y Aitor Martin