PoprzedniaWyżejGłównaSpis treściIndex hasełZnajdźBokGora
BokGora

Google
 

Przykładowa aplikacja



poprzednia...


Po dodaniu menu i kontrolek oraz ustawieniu ich właściwości przechodzimy do pisania kodu programu.
Zaczniemy od polecenia Option Explicit. Wymusza ono deklarowanie każdej używanej zmiennej. W ten sposób łatwiej będzie kontrolować poprawność pisanego kodu, ponieważ błędne wpisanie nazwy zmiennej będzie sygnalizowane przez Visual Basic jako błąd (gdyby nie było rozkazu Option Explicit, to błędne wpisanie nazwy zmiennej spowodowałoby stworzenie nowej zmiennej o tej nazwie i przeważnie trudny do znalezienia błąd logiczny).
Rokaz Option Explicit należy dopisać do sekcji deklaracji ogólnych (General Declarations). Aby to zrobić otwieramy okno Code. Można otworzyć to okno przez wybranie polecenia Code menu View, wcisnięcie F7 lub kliknięcie dwukrotnie na formie lub dowolnej kontrolce, a następnie wybranie z listy ObjectBox - z lewej na górze - (General), a z listy Procedure/EventsBox - z prawej na górze - (Declarations)).
Okno Code wyświetli zawartość tej sekcji.
Jeżeli w opcjach Visual Basic (zakładka Editor okna Options polecenia Options menu Tools) opcja Require Variable Declarations jest zaznaczona, to rozkaz Option Explicit jest dopisywany automatycznie przy tworzeniu formy. Jeżeli go nie ma, to go dopisujemy:

Option Explicit


Teraz dodamy kod do polecenia Koniec menu Zegar.
Gdy użytkownik wybierze to polecenie, to program powinien zakończyć swoje działanie. Musimy więc dopisać kod do zdarzenia Click menu mnuZegarKoniec. Aby to zrobić rozwijamy na formie menu Zegar i klikamy polecenie Koniec. Okno Code otworzy się na procedurze mnuZegarKoniec_Click() (można również otworzyć to okno przez wybranie polecenia Code menu View, wcisnięcie F7 lub kliknięcie dwukrotnie na formie lub dowolnej kontrolce, a następnie wybranie z listy ObjectBox - z lewej na górze - mnuZegarKoniec, a z listy Procedure/EventsBox - z prawej na górze - Click).
Okno Code wyświetli pierwszą i ostatnią linię procedury mnuZegarKoniec_Click:

Private Sub mnuZegarKoniec_Click()

End Sub

Do ciała procedury musimy wstawić kod, który zakończy program. Można do tego celu użyć rozkazu End, który automatycznie kończy program. Jednak rozwiązaniem preferowanym przez wielu programistów jest użycie rozkazu UnLoad, który wykorzystuje podaną nazwę formy, aby usunąć ją z pamięci (jeżeli jest tylko jedna forma w pamięci, to zakończy on działanie programu i zwolni całą zajmowaną pamięć). Użyjemy więc rozkaz UnLoad z nazwą formy frmZegar:

Private Sub mnuZegarKoniec_Click()
   UnLoad frmZegar
      'usunięcie formy frmZegar z pamięci
End Sub

Dodajmy teraz kod do zdarzenia Load formy frmZegar, które występuje, gdy forma jest ładowana do pamięci (a więc przy uruchomieniu programu). Wybieramy w oknie Code obiekt frmZegar i procedurę zdarzenia Load. Visual Basic automatycznie wstawia początek i koniec procedury.
Po załadowaniu programu data i czas mają być wyświetlane w długich formatach. Musimy więc gdzieś przechowywać informację o formatach wyświetlania daty i czasu. W tym celu zadeklarujemy sobie dwie zmienne, jedna będzie przechowywać format daty a druga czasu. Ponieważ zmienne te będą wykorzystywane nie tylko przez zdarzenie Load, ale również np. przez zdarzenie Timer kontrolki tmrZegar (aby co sekundę zmieniać wyświetlany czas), więc zadeklarujemy te zmienne jako globalne i będą one dostępne przez wszystkie procedury. W tym celu powracamy do sekcji deklaracji ogólnych (wybieramy (General) i (Declarations)) i dopisujemy deklaracje zmiennych. Ponieważ zmienne mają być dostępne dla wszystkich procedur (a więc publiczne) użyjemy do ich deklaracji rozkazu Public. A ponieważ funkcja Format() wymaga podania formatów w postaci łańcuchów, więc deklarowane zmienne będą łańcuchowe:

Option Explicit   'wymuszenie deklaracji zmiennych
   'zmienne globalne przechowujące formaty daty i czasu
Public gstrFormatDaty As String
Public gstrFormatCzasu As String

Teraz możemy powrócić do procedury zdarzenia Form_Load() i przypisać tam wartości zmiennym gstrFormatDaty i gstrFormatCzasu, jakie przyjmą one po uruchomieniu programu. Predefiowane formaty funkcji Format to: Long Date, Medium Date, Short Date, Long Time, Medium Time i Short Time. Ponieważ początkowo data i czas mają być wyświetlane w formatach długich, więc wykorzystamy formaty Long Date i Long Time:

Private Sub Form_Load()
   gstrFormatDaty = "Long Date"
   gstrFormatCzasu = "Long Time"
      'ustawienie wartości początkowych formatów daty i czasu
End Sub

Do zdarzenia Form_Load należy też dodać kod, który wyświetli bieżący czas i datę. Jeżeli tego nie dodamy, to do pierwszego wystąpienia zdarzenia Timer (a więc przez 1 sekundę) zamiast daty i czasu będą wyświetlane wartości, ustawione w oknie Properties (00:00:00).
Musimy dopisać kod programu, który zmieni tekst wyświetlany w kontrolkach lblData i lblCzas. Ale takie samo zadanie będzie musiał wykonać kod programu, który będzie zawarty w procedurze zdarzenia Timer. Tam też trzeba będzie wyświetlić nowe wartości daty i czasu w kontrolkach lblData i lblCzas. Zamiast więc dwa razy pisać ten sam kod, możemy wpisać go raz do zdarzenia tmrZegar_Timer() i wywołać tą procedurę ze zdarzenia Form_Load().
Przechodzimy więc do obiektu tmrZegar i zdarzenia Timer. Dodajemy tam kod, który pobierze aktualny czas i datę (przy użyciu funkcji Date() i Time()) oraz sformatuje te wartości przy użyciu funkcji Format zgodnie z formatowami zawartymi w zmiennych gstrFormatDaty i gstrFormatCzasu.
Możemy również dodać rozkaz, który zmieni tekst wyświetlany na pasku tytułowym formy, aby również wyświetlał czas. Gdy forma zostanie zminimalizowana, to przy jej ikonie będzie wyświetlany aktualny czas.

Private Sub tmrZegar_Timer()
   lblCzas.Caption = Format(Time, gstrFormatCzasu)
      'wyświetlenie czasu w określonym formacie
   lblData.Caption = Format(Date, gstrFormatDaty)
      'wyświetlenie daty w określonym formacie
   frmZegar.Caption = "Zegar " & lblCzas.Caption
      'wyświetlenie czasu na pasku tytułowym formy
End Sub

Teraz możemy do zdarzenia Form_Load() dodać wywołanie procedury zdarzenia tmrZegar_Timer(), aby przy uruchomieniu programu wyświetlić bieżącą datę i czas:

Private Sub Form_Load()
   gstrFormatDaty = "Long Date"
   gstrFormatCzasu = "Long Time"
      'ustawienie wartości początkowych formatów daty i czasu
   Call tmrZegar_Timer
      'wywołanie procedury zdarzenia Timer kontrolki Timer,
      'aby ustalić datę i czas wyświetlane w etykietach
End Sub

Wprawdzie użycie rozkazu Call, aby wywołać procedurę, nie jest obowiązkowe, jednak podkreśla, że używana jest inna procedura programu.

Po wyświetleniu nowych wartości daty i czasu dobrze było by umieścić kontrolki centralnie na środku wysokości i szerokości formy. Można odpowiedni kod dodać do zdarzenia Form_Load(), ale taki sam kod trzeba będzie wykonać, gdy użytkownik zmieni rozmiar formy (aby znowu umieścić kontrolki na środku formy) lub gdy użytkownik zmieni czcionkę lub format wyświetlania daty lub czasu, co spowoduje zmianę szerokości lub wysokości etykiet. Dodamy więc osobną procedurę, którą będziemy wywoływać za każdym razem, gdy zajdzie taka potrzeba.
Dodajemy więc do programu procedurę UstawEtykiety. Aby to zrobić należy wybrać polecenie AddProcedurę z menu Tools. W oknie dialogowym należy wpisać nazwę procedury, ustawić typ na Sub i zakres na Public.

AddProcedure

Można również wpisać w oknie Code pierwszą linię (nagłówek) procedury, a Visual Basic sam uzupełni nazwę. Nie można jednak zrobić tego wewnątrz innej procedury, trzeba wpisać tę linię pomiędzy innymi procedurami, lub na końcu, za ostatnim rozkazem End...

Do tej procedury dodajemy kod, który umieści kontrolki lblData i lblCzas na środku wysokości i szerokości formy. Wykorzystamy do tego właściwości Left, Top kontrolek, dla określenia ich pozycji, Height, Width kontrolek, żeby pobrać ich wysokość i szerokość oraz ScaleHeight, ScaleWidth formy, aby pobrać rozmiar wewnętrznego obszaru formy (bez ramek, menu i paska tytułowego).
Aby umieścić kontrolkę na środku szerokości formy musimy: pobrać szerokość formy, odjąć od niej szerokość kontrolki, a pozostała różnica jest niewykorzystanym obszarem szerokości formy. Jeżeli podzielimy ją przez 2, to otrzymamy obszar, który będzie między brzegiem kontrolki a brzegiem formy, zarówno z lewej jak i z prawej strony kontrolki. Możemy więc na tej pozycji ustalić położenie lewego brzegu kontrolki. Podobnie postępujemy z drugą kontrolką Label.

PolozenieKontrolek

Aby ustalić położenie pionowe kontrolek, musimy sprawdzić, która kontrolka jest wyświetlana. Jeżeli wyświetlana jest tylko kontrolka lblData to od wysokości formy odejmujemy wysokość kontrolki i dzielimy różnicę przez 2. Jeżeli widoczna jest tylko kontrolka lblCzas to wykonujemy te same obliczenia dla jej wysokości. Jeżeli jednak widoczne są obydwie kontrolki to od wysokości formy musimy odjąć sumę wysokości obydwu kontrolek oraz odległości między nimi. Jeżeli tę różnicę podzielimy przez 2, to uzykamy wysokość, na której będzie się zaczynać górna kontrolka. Aby określić pozycję dolnej kontrolki musimy do położenia górnej kontrolki dodać jej wyokość oraz odległość między kontrolkami. W ten sposób uzyskamy ułożenie kontrolek centralnie pionowo i poziomo na formie.

Public Sub UstawEtykiety()
   lblData.Left = (frmZegar.ScaleWidth - lblData.Width) / 2
   lblCzas.Left = (frmZegar.ScaleWidth - lblCzas.Width) / 2
      'ustalenie położenia etykiet centralnie w połowie szerokości formy
   If lblData.Visible = True Then
      If lblCzas.Visible = True Then
         lblData.Top = (frmZegar.ScaleHeight - lblCzas.Height - lblData.Height - 100) / 2
         lblCzas.Top = lblData.Top + lblData.Height + 100
            'jeżeli widoczna jest i data i czas, ustalenie położenia etykiet
            'centralnie w połowie wysokości formy
      Else
         lblData.Top = (frmZegar.ScaleHeight - lblData.Height) / 2
            'jeżeli widoczna jest tylko data, ustalenie położenia etykiety
            'centralnie w połowie wysokości formy
      End If
   Else
      lblCzas.Top = (frmZegar.ScaleHeight - lblCzas.Height) / 2
         'jeżeli widoczny jest tylko czas, ustalenie położenia etykiety
         'centralnie w połowie wysokości formy
   End If
End Sub

Możemy teraz wywołać tą procedurę ze zdarzenia Form_Load(), aby ułożyć etykiety centralnie po uruchomieniu programu. Możemy również wywołać ją ze zdarzenia Resize formy, aby ustawić etykiety centralnie, po każdej zmianie rozmiaru przez użytkownika. Ponieważ zdarzenie Resize jest wywoływane przy urchomieniu programu, po zdarzeniu Load, nie musimy wywoływać procedury UstawEtykiety ze zdarzenia Form_Load(), ponieważ i tak zostanie ona wywołana ze zdarzenia Form_Resize(). Dodajmy więc wywołanie procedury UstawEtykiety do zdarzenia Form_Resize():

Private Sub Form_Resize()
   'ustawienie nowych pozycje etykiet po zmianie rozmiaru
   Call UstawEtykiety
End Sub

W ten sposób po uruchomieniu programu wyświetlana będzie data i czas w kontrolkach lblData i lblCzas ustawianych na środku formy. Co sekundę będzie wywoływane zdarzenie tmrZegar_Timer, które wprowadzi nowy czas i datę do etykiet, a po zmianie rozmiau przez użytkownika, etykiety ustawią się na środku formy. Wybranie polecenia Koniec z menu Zegar zakończy działanie programu.

dalej...






Google
 
Poprzednia | Wyżej | Strona główna | Spis Treści | Index haseł | Opis VB

BokDol
PoprzedniaWyżejGłównaSpis treściIndex hasełZnajdźBokGora
BokGora