poniedziałek, 27 maja 2013

Najprostszy i najlepszy pasek postępu

Wydaje mi się, że każdy programista pisząc swoją pierwszą dłuższą procedurę (dłuższą w zakresie ilości kodu, ale też szczególnie długiego czasu jej wykonywania), która to procedura ma trafić do innego użytkownika myśli o tym, aby dodać do aplikacji informację o postępie wykonania operacji. Koncepcja ta jest ze wszech miar słuszna, ale nie każde rozwiązanie jakie zastosujemy pozostaje właściwym. Osobiście jestem zwolennikim minimalizmu w tym zakresie zgodnie z którym zamiast wyskakujących okien opartych o formularze wykorzystajmy po prostu pasek stanu (Status Bar) naszej aplikacji, szczególnie, że metoda ta również może być efektywna.

Rozwiązanie uwzględnia dwie koncepcje. Wystarczy w poniższej linii
1Application.StatusBar = pasekTXT...

wybrać jeden z wariantów:

pasekTXT_A -który postęp będzie wyświetlał jako tekst "Wykonano: xx.0%"
pasekTXT_B -który postęp wykonania wyświetli jako układ symboli >|||||     <

Poniższy kod to przykład stworzony wyłącznie w celach prezentacyjnych. Adaptacja do własnych potrzeb wydaje się być jednak bardzo łatwa.
01Sub Pasek_Postępu_StatusBar()
02    
03    Dim i As Long
04    Dim loopEnd As Long
05        
06    Dim pasekTXT_A As String
07    Dim pasekTXT_B As String
08    Dim długośćTXT_B As Byte
09        loopEnd = 15
10        długośćTXT_B = 20
11    For i = 1 To loopEnd
12        
13    'wariant 1- tekst z postępem procentowym
14 
15    pasekTXT_A = "Wykonano: " & Format(i / loopEnd, "00.0%")
16        
17    'wariant 2- pasek postępu >||||     <
18 
19    pasekTXT_B = ">" & String(Int((i / loopEnd) * długośćTXT_B), "|") & _
20        String(długośćTXT_B - Int((i / loopEnd) * długośćTXT_B), " ") & "<"
21        
22        Application.StatusBar = pasekTXT_B
23        
24        'zatrzymanie w celu prezentacyjnym
25        Application.Wait Now + TimeValue("00:00:01")
26        
27    Next
28    
29    Application.StatusBar = False
30    
31End Sub

1 komentarz:

  1. Wszystko fajnie działa. Dzięki.
    Jedyne co zmieniłem to ten fragment kodu:
    Application.Wait Now + TimeValue("00:00:01")
    bo mi dość mocno przedłużało wykonanie samej aplikacji.

    OdpowiedzUsuń