ďťż
Lemur zaprasza
Ile pracowałeś z danym programem ??? Pisząc pewien program postanowiłem napisać ciekawą procedurkę, która powie użytkownikowi programu, że pracował a tym programem np. 3 godziny. Zadanie wydaje się proste, ale to tylko pozory. Procedurkę pisałem z pół godziny. Poniżej postaram się omówić ten problem : 1. Jak pobrać ile sekund ktoś pracował z programem ??? Wydaje się bajecznie proste. Deklarujemy zmienną globalną a w Form_Load wpisujemy np. Czas=Timer. W Form_Unload wpisujemy Czas=Czas-Timer. Zmienna timer zapamiętuje, ile sekund upłynęło od północy. Wszystko było by w porządku, gdyby nie fakt, że ktoś może uruchomić program np. za 10 dwunasta (w nocy) a zamknąć np. o pierwszej w nocy. Wtedy w zmiennej czas będzie nieprawidłowa wartość tj. program okłamie użytkownika. Jeśli uruchomi program np. o trzeciej a zamknie o czwartej, to problemu nie ma, bo zmienna Timer zeruje się o północy. Dlatego trzeba inaczej przechwycić ilość sekund, pracy programu. Można skorzystać z funkcji API, ale jeśli windows chodzi 47 dni, to funkcja coś głupieje. Najprostsze rozwiązanie to nałożenie na Formularz Timer z interwałem 1000 (1 sekunda) i z kodem : Czas=Czas+1 Jest to chyba najprostszy sposób, ale ma dwie wady : pierwsz to taka, że Timer jest niedokładny i w ciągu godziny potrafi oszukać nas na kilka sekund. Druga wada, to MsgBox, który blokuje chwilowo Timer. Jeśli poaże się MsgBox modalny systemowo a gość pójdzie na 2 godziny do kibla, to program okłamie użytkownika. Ale mam nadzieję, że użytkownicy naszego programu, nie będą chorowali na biegunkę ;-) Ja uważam, że Timer jest najwygodniejszy i najdokładniejszy. 2. Jak przekonwertować liczbę sekund na godziny i minuty ??? Jeśli ktoś nasz program używa dłużej niż 59 sekund to powinien wiedzieć ile minut pracuje z programem. Bo np. 340 sekund nie wiele mówi. Każdy może sobie obliczyć, że 5*60=300 czyli 340 sekund to 5 minut i 40 sekund. Ale po co przemęczać naszego biednego użytkownika programu, skoro możemy napisać kilka linii kodu ??? Oto przykładowy kod : Sek = Czas For a = 1 To Int(Sek / 60) Min = Min + 1 Next a ' Obecnie Mamy liczbe minut Sek = Sek - (60 * Min) ' obecnie mamy liczbe sekund For a = 1 To Int(Min / 60) Godz = Godz + 1 Next a Min = Min - (60 * Godz) Zmienna Sek zawiera liczbę sekund, min liczbę minut a godz liczbę godzin. Ten kawałek kodu zmieni 3672 sekundy na 1 godzinę, 1 minutę i 12 sekund. Zasada działania jest prosta : najpierw od zmiennej Sek są odejmowane całe 'sześćdziesiątki' czyli wielokrotności liczby 60. Taka jedna sześćdziesiątka zwiększa zmienną min o 1. Jeśli zmienna min jest większa od 60 to trzeba te sześćdziesiątki odjąć a zwiększyć zmienną godz o 1 za każdą sześćdziesiątkę. Mamy aż 3 zmienne. Algorytm działa dobrze (przynajmniej u mnie). No ale tutaj się pojawia kolejny problem : 3. Ach ta nasza pokręcona gramatyka ... No właśnie, musimy jakoś zrobić, aby procedurka wyświetlająca dane ile spędziłeś z naszym programem nie mówiła w stylu Kali mieć. podam przykład : 1) 10 sekund 2) 2 sekund Jak widać ten drugi zwrot to błąd gramatyczny. Niestety kolejny problem to nauczenie naszego programu Polskiej gramatyki. Nie jest to trudne, ale dość monotonne i pokiełbasione. Oto podstawy gramatyki : mówimy : 1 sekundę (program pracował jedną sekundę), 2/3/4 sekundy, 5/6/7/8/9/10 sekund. Wystarczy popatrzeć się na ostatnią cyfrę. Jeśli jest to 1 to mówimy sekund (np. 21 sekund, ale wyjątkiem jest liczba 1 godzine mówimy jedną sekundę). Jeśli ostatnia cyfra to 2/3/4 to mówimy program pracował (dwadzieścia/trzydzieści)dwie sekundy. A cała reszta czyli liczby kończące się na 5/6/7/8/9/0 mówi się sekund np. (czterdzieści)pięć sekund. Ale tutaj jest wyjątek !!! Jeśli liczba jest z zakresu 11-19 to mówimy sekund i powyższe rególy nas nie dotyczą !!! Ufff gadam jak Miodek. Jeśli godzi o słowa : godzina i minuta to ich odmiana jest taka sama jak odmiana słowa sekunda. Dobra, dam teraz odpowiedni fragment kodu, bo i tak nic nie zrozumiałeś z moich ględzin. Jak widać kod VB pozwala Tobie zrozumieć, co tutaj piszę ;-) ' Zabawa w gramatykę strSek = " sekund" Tmp = Right$(Trim(Str(Sek)), 1) If Tmp = 1 Then strSek = " sekund" If Tmp = 2 Or Tmp = 3 Or Tmp = 4 Then strSek = " sekundy" If Sek >= 10 And Sek < 20 Then strSek = " sekund" If Sek = 1 Then strSek = " sekundę" strMin = " minut" Tmp = Right$(Trim(Str(Min)), 1) If Tmp = 1 Then strMin = " minute" If Tmp = 2 Or Tmp = 3 Or Tmp = 4 Then strMin = " minuty" If Min >= 10 And Min < 20 Then strMin = " minut" If Min = 1 Then strMin = " minutę" strGodz = " godzin" Tmp = Right$(Trim(Str(Godz)), 1) If Tmp = 1 Then strGodz = " godzine" If Tmp = 2 Or Tmp = 3 Or Tmp = 4 Then strGodz = " godziny" If Godz >= 10 And Godz < 20 Then strGodz = " godzin" If Godz = 1 Then strGodz = " godzinę" Zmienne strGodz, strMin i strSek zawierają odpowiednią odmianę słowa w zależności od zmiennych sek, min i godz. Ostatni etap to np. wyświetlenie MsgBox'a : MsgBox "Z tym programem pracowałeś aż :" + Str(Godz) + strGodz + Str(Min) + strMin + " i" + Str(Sek) + strSek, 64, "Czas pracy programu" 4. Podsumowanie Pisząc tą procedurkę mieliśmy 3 problemy : Dowiedzieć się, ile sekund ktoś używał naszego programu Z liczby sekund trzeba obliczyć liczbę minut i godzin, bo 350 sekund nie wiele mówi Nauczyć nasz program gramatyki Jak widać ta mała procedurka zajęła wiele linii kodu i kilka zmiennych. A poniżej przytoczę cały kod (musisz utorzyć Timera i zmienną globalną Czas !!!) Public Sub IlePracowałeś() Dim Sek As Long Dim Min As Long Dim Godz As Long Dim Tmp As String * 1 Dim strSek As String Dim strMin As String Dim strGodz As String Sek = Czas For a = 1 To Int(Sek / 60) Min = Min + 1 Next a ' Obecnie Mamy liczbe minut Sek = Sek - (60 * Min) ' obecnie mamy liczbe sekund For a = 1 To Int(Min / 60) Godz = Godz + 1 Next a Min = Min - (60 * Godz) ' Zabawa w gramatykę strSek = " sekund" Tmp = Right$(Trim(Str(Sek)), 1) If Tmp = 1 Then strSek = " sekund" If Tmp = 2 Or Tmp = 3 Or Tmp = 4 Then strSek = " sekundy" If Sek >= 10 And Sek < 20 Then strSek = " sekund" If Sek = 1 Then strSek = " sekundę" strMin = " minut" Tmp = Right$(Trim(Str(Min)), 1) If Tmp = 1 Then strMin = " minute" If Tmp = 2 Or Tmp = 3 Or Tmp = 4 Then strMin = " minuty" If Min >= 10 And Min < 20 Then strMin = " minut" If Min = 1 Then strMin = " minutę" strGodz = " godzin" Tmp = Right$(Trim(Str(Godz)), 1) If Tmp = 1 Then strGodz = " godzine" If Tmp = 2 Or Tmp = 3 Or Tmp = 4 Then strGodz = " godziny" If Godz >= 10 And Godz < 20 Then strGodz = " godzin" If Godz = 1 Then strGodz = " godzinę" 'Wyświetl wynik MsgBox "Z tym programem pracowałeś aż :" + Str(Godz) + strGodz + Str(Min) + strMin + " i" + Str(Sek) + strSek, 64, "Czas pracy" End Sub Omówienie zmiennych. W naszym projekcie jest dużo zmiennych. Pasowało by się dowiedzieć do czego jaka zmienna służy : Dim Sek As Long - ta zmienna zawiera liczbę sekund Dim Min As Long - ta zmienna zawiera liczbę minut Dim Godz As Long - ta zmienna zawiera liczbę godzin Dim Tmp As String * 1 - zmienna tymczasowa do Right$, czyli zawiera ostani znak cyfry. Dim strSek As String - ta zmienna zawiera odpowiednią odmianę słowa sekunda Dim strMin As String - ta zmienna zawiera odpowiednią odmianę słowa minuta Dim strGodz As String - ta zmienna zawiera odpowiednią odmianę słowa godzina Jesli nie rozumiesz, co tutaj napisałem, to się nie martw, bo masz gotowy kawałek kodu ;-) Jelcyn jelcyn@pnet.pl |