Para hacer barras de avance necesitas saber cuánto representa el 100% del proceso a graficar con la barra. Por ejemplo, si quieres hacer la barra de avance que indique el porcentaje que lleva copiado un archivo necesitas saber qué tamaño tiene el archivo, el resto es simplemente calcular el porcentaje de lo ya copiado.
El porcentaje actual está dado por la fórmula:
Porcentaje = ValorFinal / ValorActual * 100
De modo que si el archivo mide 1024 KB y llevas 512 KB copiados entonces el porcentaje es 50%.
50 = 1024 / 512 * 100
Ahora bien, hay que traducir esto a posiciones de pantalla.
Supongamos que estás en modo texto de 25 filas por 80 columnas y la barra es horizontal, y quieres que al 100% ocupe 70 columnas. Se deduce de esto que al ir el 50% de la copia la barra habrá llenado 35 columnas. Evidentemente hay una relación entre una cosa y la otra.
Si 1024 son 70, cabría preguntar cuánto representa 1 en columnas. Esta relación nos la da la división 70 / 1024 = 0,07, entonces 0,07 * 512 (que es el valor actual) nos da 35,84. Como la pantalla está dividida en números enteros, solo tomamos la parte entera del resultado.
La fórmula completa para determinar hasta dónde hay que llenar la barra según el valor actual sería:
ColumnaActual = (ColumnaFinal / ValorFinal) * ValorActual
Como estamos en Pascal y hay una división real implicada para obtener un número que debe ser entero sería:
ColumnaActual := Trunc((ColumnaFinal / ValorFinal) * ValorActual);
Y el porcentaje sería:
Porcentaje := ValorFinal / ValorActual * 100;
Siendo Porcentaje de tipo Real.
Bien pero como podrás darte cuenta la variable ColumaFinal nos da la posición absoluta en pantalla, es decir a partir de la columa 1, quizá quieras que la barra esté centrada en la pantalla, siendo ésta de 70 columnas hay que desplazarla 5 columnas a la derecha, ningún problema, solo hay que sumar 5 al resultado y ya está.
Lo demás es jugar con el GotoXY
.