Differenze tra le versioni di "Pseudo-ProgressBar in un'applicazione 'a riga di comando'"

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Se si scrivendo un'applicazione ''a riga di comando'' (quindi senza supporto grafico), evidentemente <SPAN Style="text-decoration:underline">non</span> sarà possibile utilizzare l'oggetto grafico ''ProgressBar''. Per ottenere, allora, in console/Terminale un ''effetto'' simile ad una ''ProgressBar'', può essere utilizzata una soluzione, che adopera ovviamente caratteri, simile alla seguente:
+
Se si scrivendo un'applicazione ''a riga di comando'' (quindi senza supporto grafico), evidentemente <SPAN Style="text-decoration:underline">non</span> sarà possibile utilizzare il Controllo grafico ''ProgressBar''.
 +
<BR>Per ottenere, allora, in console/Terminale un ''effetto'' simile a una ''ProgressBar'', può essere utilizzata una soluzione, che adopera ovviamente caratteri, simile alla seguente:
 +
<FONT Color=gray>' ''La Costante "LUNGHEZZA" imposta la lunghezza della pseudo-progressbar che sarà mostrata nella console/terminale.''
 +
' ''E' la quantità di caratteri stampati nella console/terminale.''</font>
 
  Private Const LUNGHEZZA As Byte = 50
 
  Private Const LUNGHEZZA As Byte = 50
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim b, c As Byte
 
   Dim b, c As Byte
Riga 9: Riga 12:
 
   For b = 1 To LUNGHEZZA  
 
   For b = 1 To LUNGHEZZA  
 
     Inc c
 
     Inc c
     Write "\r" & String(b, "=") & "]" & Space(LUNGHEZZA + 1 - b) & CStr(c * (100 / LUNGHEZZA)) & "%"
+
     Write "\r" & String(b, "=") & "]" & Space(LUNGHEZZA + 1 - b) &
 +
          CStr(c * (100 / LUNGHEZZA)) & "%"
 
     Flush
 
     Flush
 
     Wait 0.1
 
     Wait 0.1
 
   Next
 
   Next
 
    
 
    
  '''End'''
+
  End
 
Se si vorrà avere l'effetto di una barra colorata (in verde), la riga con la funzione "Write" dovrà essere cambiata così:
 
Se si vorrà avere l'effetto di una barra colorata (in verde), la riga con la funzione "Write" dovrà essere cambiata così:
  Write "\r\e[42m" & Space(b) & "\e[0m" & Space(LUNGHEZZA + 1 - b) & CStr(c * (100 / LUNGHEZZA)) & "%"
+
Write "\r\e[42m" & String(b, " ") & "\e[0m" & Space(LUNGHEZZA + 1 - b) & CStr(c * (100 / LUNGHEZZA)) & "%"
Di seguito mostriamo un esempio pratico, nel quale si mostrerà lo stato d'avanzamento in percentuale della copia di un file:
+
Di seguito mostriamo un esempio pratico, nel quale si mostrerà lo stato d'avanzamento in percentuale della copia di un file. Al termine sarà mostrato anche il tempo impiegato.
 
  Private Const LUNGHEZZA As Byte = 50
 
  Private Const LUNGHEZZA As Byte = 50
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl1, fl2 As File
 
   Dim fl1, fl2 As File
 
   Dim b, c As Byte
 
   Dim b, c As Byte
 
   Dim k As Integer
 
   Dim k As Integer
   Dim orig, s As String
+
   Dim orig, copia, s As String
 +
  Dim tmp As Date
 
   
 
   
   orig = "<FONT Color=gray>' ''/percorso/del/file/da/copiare''</font>"
+
   orig = "<FONT Color=gray>''/percorso/del/file/da/copiare''</font>"
 
   
 
   
  fl1 = Open "<FONT Color=gray>' ''/tmp/copia''</font>"" For Create <FONT Color=gray>' ''Percoso ove il file verrà copiato''</font>
+
  <FONT Color=gray>' ''Percorso ove ad esempio il file verrà copiato:''</font>
 +
  copia = "/tmp/copia." & File.Ext(orig)
 +
 +
  fl1 = Open copia For Create
 
   fl2 = Open orig For Read
 
   fl2 = Open orig For Read
 
   
 
   
 
   k = (Lof(fl2) \ 100)
 
   k = (Lof(fl2) \ 100)
 
   c = 100 \ LUNGHEZZA
 
   c = 100 \ LUNGHEZZA
 +
 +
  tmp = Now
 
   
 
   
 
   Repeat
 
   Repeat
 
     Inc b
 
     Inc b
     If b < 101 Then  
+
     If b < 101 Then
       Write "\r" & String(b \ c, "=") & "]" &  
+
       Write "\r\e[42m" & Space(b \ c) & "\e[0m" &
            Space(LUNGHEZZA + 1 - (b \ c)) & CStr(b) & "%"
+
            Space(LUNGHEZZA + 1 - (b \ c)) & CStr(b) & "%"
 
       Flush
 
       Flush
 
     Endif
 
     Endif
Riga 47: Riga 57:
 
   Until Eof(fl2)
 
   Until Eof(fl2)
 
   
 
   
 +
  Print "\n\n\e[31m"; CStr(Time(0, 0, 0, DateDiff(tmp, Now, gb.Millisecond)))
 
   fl2.Close
 
   fl2.Close
 
   fl1.Close
 
   fl1.Close
 
   
 
   
   If Stat("/tmp/copia").Size == Stat(orig).Size Then Print "\nCopia del file avvenuta con successo."
+
   If Stat("/tmp/copia").Size == Stat(orig).Size Then Print "\n\e[0mCopia del file avvenuta con successo."
 
   
 
   
  '''End'''
+
  End

Versione attuale delle 10:30, 28 nov 2023

Se si scrivendo un'applicazione a riga di comando (quindi senza supporto grafico), evidentemente non sarà possibile utilizzare il Controllo grafico ProgressBar.
Per ottenere, allora, in console/Terminale un effetto simile a una ProgressBar, può essere utilizzata una soluzione, che adopera ovviamente caratteri, simile alla seguente:

' La Costante "LUNGHEZZA" imposta la lunghezza della pseudo-progressbar che sarà mostrata nella console/terminale.
' E' la quantità di caratteri stampati nella console/terminale.
Private Const LUNGHEZZA As Byte = 50


Public Sub Main()
 
 Dim b, c As Byte

 For b = 1 To LUNGHEZZA 
   Inc c
   Write "\r" & String(b, "=") & "]" & Space(LUNGHEZZA + 1 - b) &
          CStr(c * (100 / LUNGHEZZA)) & "%"
   Flush
   Wait 0.1
 Next
 
End

Se si vorrà avere l'effetto di una barra colorata (in verde), la riga con la funzione "Write" dovrà essere cambiata così:

Write "\r\e[42m" & String(b, " ") & "\e[0m" & Space(LUNGHEZZA + 1 - b) & CStr(c * (100 / LUNGHEZZA)) & "%"

Di seguito mostriamo un esempio pratico, nel quale si mostrerà lo stato d'avanzamento in percentuale della copia di un file. Al termine sarà mostrato anche il tempo impiegato.

Private Const LUNGHEZZA As Byte = 50


Public Sub Main()

 Dim fl1, fl2 As File
 Dim b, c As Byte
 Dim k As Integer
 Dim orig, copia, s As String
 Dim tmp As Date

 orig = "/percorso/del/file/da/copiare"

' Percorso ove ad esempio il file verrà copiato:
 copia = "/tmp/copia." & File.Ext(orig)

 fl1 = Open copia For Create
 fl2 = Open orig For Read

 k = (Lof(fl2) \ 100)
 c = 100 \ LUNGHEZZA

 tmp = Now

 Repeat
   Inc b
   If b < 101 Then
     Write "\r\e[42m" & Space(b \ c) & "\e[0m" &
            Space(LUNGHEZZA + 1 - (b \ c)) & CStr(b) & "%"
     Flush
   Endif
   Read #fl2, s, -k
   Write #fl1, s, -k
 Until Eof(fl2)

 Print "\n\n\e[31m"; CStr(Time(0, 0, 0, DateDiff(tmp, Now, gb.Millisecond)))
 fl2.Close
 fl1.Close

 If Stat("/tmp/copia").Size == Stat(orig).Size Then Print "\n\e[0mCopia del file avvenuta con successo."

End