![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
|
Najlepiej
przeglądać z
Załącznik A Załącznik B Załącznik C Załącznik D Załącznik E Jak przygotować aplikacje w FoxPro na rok 2000 Załącznik F Rok 2000: problemy i rozwiązania Problem roku 2000 – często zadawane pytania
|
Microsoft a rok 2000 Załącznik E: jak przygotować aplikację na rok 2000 w Visual Basicu Poniżej przytaczamy dwa artykuły z bazy wiedzy Microsoftu (http://www.microsoft.com/kb), zawierające porady dotyczące zapewnienia poprawnego działania w roku 2000 aplikacji, które napisano przy użyciu systemów programowania Microsoft Visual Basic i Visual FoxPro. Jak przygotować aplikacje w Visual Basicu na rok 2000 Data ostatniego przeglądu: 24 czerwca 1997. Nr artykułu: Q162718. Informacje zawarte w tym artykule dotyczą systemów:
STRESZCZENIE Jako programista na pewno troszczysz się o to, jak twoje aplikacje będą obsługiwać daty po 31 grudnia 1999. Czy pierwszego stycznia 2000 twój program uzna, że jest rok 2000, 1900, czy może nawet 1980? Celem tego artykułu jest zapewnienie cię, że aplikacje w Visual Basicu będą prawidłowo działać przy datach następujących po 31 grudnia 1999. Jeśli pragniesz uzyskać od Microsoftu dokładniejsze informacje o oprogramowaniu i roku 2000, radzimy zapoznać się z dokumentacją w witrynie WWW Microsoftu pod adresem: http://www.microsoft.com/cio/year.asp BLIŻSZE INFORMACJE Wprawdzie wszystkie wersje Visual Basica obsługują lata następujące po roku 1999 (używając formatu czterocyfrowego), ale jeśli w dacie poda się rok dwucyfrowy (np. 3.7.45), wówczas Visual Basic według pewnych zasad samoczynnie domyśli się, którego stulecia ta data dotyczy. Najlepiej będzie wyjaśnić działanie Visual Basica przez podanie zarysu jego historii. Zarys historii Visual Basica We wszystkich wersjach Visual Basica do Windows przed wersją 3.0 (łącznie z jego poprzednikami, programami Visual Basic do DOS-u i QuickBasic), rok dwucyfrowy był zawsze interpretowany jako 19xx. Taka interpretacja została zakodowana w bibliotekach wykonawczych (runtime) we wszystkich wersjach, więc nie zależy ani od wersji systemu operacyjnego, ani od stulecia bieżącej daty systemowej. W czasie między wprowadzaniem Visual Basica 3.0 a implementacją wersji 4.0 powstały dwa nowe elementy: Visual Basic for Applications oraz Automatyzacja OLE. Przed ich pojawieniem się biblioteka wykonawcza Visual Basica zawierała kod realizujący konwersję roku dwucyfrowego na rok czterocyfrowy. Ponieważ Automatyzacja OLE udostępniała innym aplikacjom wiele możliwości funkcjonalnych, Visual Basic for Applications nie potrzebował już takiego kodu: zamiast niego wywoływał funkcje z bibliotek Automatyzacji OLE. Visual Basic 4.0 został opracowany z uwzględnieniem tego współdziałania, więc w większości przypadków dokonywał konwersji roku dwucyfrowego na rok czterocyfrowy przez wywoływanie funkcji z bibliotek Automatyzacji OLE. Wyjątkiem od tej zasady była funkcja DateSerial, która została zaimplementowana w bibliotece wykonawczej Visual Basica. Stało się tak, ponieważ Visual Basic wymagał większych możliwości funkcjonalnych niż biblioteka Automatyzacji OLE była w stanie udostępnić. Podczas implementacji Visual Basica 4.0 w Microsofcie stwierdzono, że zasady interpretacji dat stosowane w poprzednich wersjach Visual Basica w praktyce nie są najlepsze. Dlatego opracowano nowe zasady: rok dwucyfrowy zaczęto poddawać konwersji na rok wynikający z bieżącego stulecia (według daty systemowej), co znaczy, że wartością wywołania Year(Date("1.1.00")) jest rok w bieżącym stuleciu. Nowa reguła została zaimplementowana w bibliotekach Automatyzacji OLE, używanych przez Visual Basic 4.0 oraz Visual Basic for Applications. Biblioteka wykonawcza Visual Basica 4.0 realizowała również tę zasadę w funkcji DateSerial. Jednak po ponownym rozważeniu tej kwestii Microsoft znowu zmienił zasady interpretacji dat w bibliotekach Automatyzacji OLE (która teraz nazywa się po prostu Automatyzacja). Zmiany te obowiązują od wprowadzenia OleAut32.dll w wersji 2.20.4049. Nie dotyczą one aplikacji 16-bitowych, które używają bibliotek Automatyzacji, a jedynie 32-bitowych. Obecnie rok dwucyfrowy pomiędzy 00 a 29 (na przykład 17) jest interpretowany jako 20xx (np. 2017), natomiast rok dwucyfrowy pomiędzy 30 a 99 (na przykład 72) jest interpretowany jako 19xx (np. 1972). Nowe biblioteki Automatyzacji zapewniają też odpowiednią realizację funkcji DateSerial. Z tego powodu Visual Basic 5.0 i wersje późniejsze nie implementują już tej funkcji w swoich bibliotekach wykonawczych. Aktualna biblioteka Automatyzacji jest dostarczana wraz z Internet Explorerem 3.0 i wersjami późniejszymi, Windows NT 3.51 Service Pack 5, Windows NT 4.0, Windows 95 OSR 2, Office 97, Visual Basic 5.0 oraz z innymi produktami. Konsekwencje dla programistów używających Visual Basica Visual Basic 3.0 oraz wersje wcześniejsze interpretują zawsze rok dwucyfrowy jako 19xx. Visual Basic 4.0 (16-bitowy) interpretuje natomiast rok dwucyfrowy jako należący do stulecia odpowiadającego bieżącej dacie systemowej. Zależnie od użytej funkcji, Visual Basic dokonuje konwersji daty zgodnie z zasadami interpretacji w 16-bitowych bibliotekach Automatyzacji albo w bibliotece wykonawczej. W 16-bitowych bibliotekach Automatyzacji zasady te nie zostały zmienione od czasów wprowadzenia wersji 4.0 Visual Basica, a zatem interpretacja jest jednakowa i nie zależy od użytej funkcji. Visual Basic 4.0 (32-bitowy) dokonuje konwersji roku dwucyfrowego na rok czterocyfrowy zgodnie z zasadami interpretacji w bibliotekach Automatyzacji, z wyjątkiem funkcji DateSerial. Funkcja ta interpretuje rok dwucyfrowy jako należący do stulecia odpowiadającego bieżącej dacie systemowej. 32-bitowe biblioteki Automatyzacji (OleAut32.dll wersja 2.10), udostępnione wtedy, gdy wprowadzono Visual Basic 4.0, interpretowały rok dwucyfrowy jako należący do stulecia odpowiadającego bieżącej dacie systemowej. Późniejsze 32-bitowe biblioteki Automatyzacji (OleAut32.dll wersja 2.20 i późniejsze) interpretują rok dwucyfrowy jako 19xx, jeżeli rok dwucyfrowy należy do przedziału od 30 do 99. Jeżeli zaś rok dwucyfrowy należy do przedziału od 00 do 29, rok dwucyfrowy jest interpretowany jako 20xx. A jeśli te zasady interpretacji mi nie odpowiadają? Zamiast zasad interpretacji stosowanych przez Visual Basic można wprowadzić własne zasady. Na przykład można przyjąć, że lata dwucyfrowe od 00 do 49 odpowiadają latom 2000 do 2049, a lata dwucyfrowe od 50 do 99 odpowiadają latom 1950 do 1999. Po wprowadzeniu napisu oznaczającego datę, należy sprawdzić jego format i ustalić, ile cyfr występuje w numerze roku. Zgodnie z naszym przykładem data 1.11.45 należy do roku 2045, a nie 1945. W kodzie takiej aplikacji należy uzupełnić napis w ten sposób, aby podany został odpowiedni rok czterocyfrowy, a następnie przekształcić skorygowany napis na informację typu data. Kod przykładowy Poniższy kod, wykonywany po kliknięciu cmdConvertDate, wyznacza datę wprowadzoną do pola tekstowego o nazwie txtDate. Jeżeli data zawiera rok dwucyfrowy, jest on przekształcany na rok czterocyfrowy zgodnie z przykładową zasadą. Program wyświetla następnie datę wprowadzoną na początku, pełny rok po konwersji według przykładowej zasady, a także pełny rok po konwersji według domyślnych zasad Visual Basica. Ostatecznie data wyświetlona w txtDate jest przekształcana na jednoznaczną datę z rokiem czterocyfrowym. Gdy użytkownik opracuje kod, który realizuje ustalone przez niego zasady interpretacji lat dwucyfrowych, może go dołączyć do własnego 32-bitowego formantu za pomocą Visual Basica w wersji Control Creation. Więcej informacji o tym produkcie oraz o budowaniu własnych formantów można znaleźć w witrynie WWW Microsoftu pod adresem http://www.microsoft.com/vbasic. Poniższy kod przyjmuje, że daty są wprowadzane w formacie mm/dd/yy, ale może być łatwo dostosowany do obsługi innego formatu daty. Private Sub cmdConvertDate_Click() Dim strYear As String Dim intSlash As Integer If IsDate(txtDate) Then 'Wyszukaj pierwszy separator daty. intSlash = InStr(txtDate, "/") If intSlash > 0 Then ' Wyszukaj drugi separator daty. intSlash = InStr(intSlash + 1, txtDate, "/") If intSlash > 0 Then 'Wydziel rok z daty. strYear = Mid(txtDate, intSlash + 1) If Len(strYear) = 2 Then If CInt(strYear) < 50 Then ' Mniejszy od 50: rok = 20XX. strYear = "20" & strYear Else ' Równy lub większy od 50: rok = 19XX. strYear = "19" & strYear End If End If MsgBox "Wprowadzona data: " & txtDate MsgBox "Rok (nasza zasada): " & strYear MsgBox "Rok (domyślny w VB): " & Year(txtDate) Else MsgBox "Niewłaściwy format daty!" End If Else MsgBox " Niewłaściwy format daty!" End If Else MsgBox "Niepoprawna data!" End If ' Wprowadź jednoznaczną datę do txtDate. txtDate.Text = Left(txtDate.Text, intSlash) & strYear End Sub LITERATURA Plik pomocy do programu Microsoft Visual Basic; wyszukać tematy “Date and Variant Data Types”, “IsDate function”, “CDate and CVDate functions”. (c) Microsoft Corporation 1997. Wszelkie prawa zastrzeżone. Współautor: David Sceppa, Microsoft Corporation.
|