ďťż

art7

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
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • teen-mushing.xlx.pl
  • Wątki
    Powered by wordpress | Theme: simpletex | © Lemur zaprasza