Programowanie Wizualno Obiektowe
Transkrypt
Programowanie Wizualno Obiektowe
Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 1 Programowanie Wizualno Obiektowe Zajęcia 3, część 1 (dokończenie zajęć 2) Temat 2: Wykorzystanie komponentów podstawowych (panele, TComboBox, TRadioGroup, TStringGrid) i obsługa ich własności podstawowych, projektowanie menu i menu z przyciskami skrótów (TMainMenu, TToolbox), wykorzystanie okien dialogowych (Standard Dialogs), programowanie akcji (TActionList). Obsługa kilku formularzy (TForm). Projektowanie prostej bazy danych. Zadanie: Należy napisac apliację, która będzie umożliwiała tworzenie i przeglądanie zbioru rekordów o czasopismach (określone przez nazwę, typ oraz ich dostepność). Aplikacja ma się składac z kilku okien otwieranych z głównego menu. Wyjście z programu zrealizowac poprzez okno dialogowe. Aplikacja ma się składac z następujących formularzy. - Okno z menu głównym i paskiem statusu do wyświetlania informacji o ilosci wpisanych elementów. (Obsługa programu) - Okno do wpisywania (Wprowadzanie danych) - Okno do wypisywania informacji o wszystkich wpisanych rekordach. (Przeglądanie danych) danych do kolejnych Rysunek 3.1. Postać interfejsu użytkownika dla programu 3_1 rekordów. Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 2 1. Utworzenie aplikacji Otwieramy nowa aplikację File>NewApplication Zapisujemy projekt przy pomocy File>Save All w katalogu gdzie będzie kompilowany nasz projekt 3. Projektowanie okna z głównym menu Rysunek 3.2. Postać głónego okna programu 3_1 3.1. Dodajemy odpowiednie komponenty w kolejności • 1 komponent TMainMenu (paleta Standard). • 1 komponent TToolbar (paleta Win32) • 1 komponent TImageList (paleta Win32) • 1 komponent TStatusBar (paleta Win32) 3.2. Należy zaprojektować menu główne (kliknięcie na komponent TMainMenu) tak aby miało następujące funkcje (skróty klawiszowe należy dodać do każdego elementu menu zmieniając jego własność ShortCut>Skrót ): - Plik - Otwórz Plik (skrót Ctrl+L) - Zapisz do Pliku (skrót Ctrl+S) - Dodawanie elementów (sktót Ctrl+A) - Koniec (skrót Alt+F4) 3.3. Kliknąć na komponent TImageList , powinno pokazać się okienko do ustawiania własności obrazków które później pokażą się na przyciskach szybkiego dostępu. Rysunek 3.3. Okno do ustawiania własności listy obrazków Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 3 Każdy z rysunków, które indeksowane są od 0 można dodać wciskając Add i wybierając odpowiedni rysunek z katalogu Program Files->Common Files->Borland Shared->Images->Buttons i wybierając odpowiedni rysunek. Jeśli podczas wybrania rysunku dzieli się on na dwa rysunki należy jeden z nich skasować (jeden z nich to rysunek pokazujący się podczas dezaktywacji przycisku). Wybrać jeden rysunek odpowiednio do każdej z funkcji wywoływanej z paska skrótów. 3.4. Klikając prawym przyciskiem myszy na komponent TToolBar można dodać kolejne przyciski przy pomocy komendy New Button, oraz ewentualnie przerwę pomiędzy grupami przycisków przy pomocy komendy New Separator (utworzyć 4 przyciski). Aby następnie powiązać przyciski z rysunkami należy we własnościach komponentu TToolBar ustawić własność Images na ImageList1 (nazwa komponentu z listą obrazków). 3.5. Utworzyć pasek statusu z trzema panelami. Odpowiednio o szerokościach: Panel 0: 100 Panel 1: 50 Panel 2: reszta dostępnego miejsca (tworzenie paska statusu omówiono na poprzednich zajęciach) (Skompilować program i uruchomić) 4. Projektowanie okna do dodawania nowych rekordów Do zaprojektowania tego okna, należy najpierw utworzyć jego formularz, jako oddzielny formularz w projekcie. Nowy formularz do projektu dodaje się wybierając opcje File->New->Form. Rysunek 3.4. Postać okna do dodawania nowych rekordów Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 4 4.1. Dodajemy następujące komponenty w kolejności • 1 komponent TLabel (paleta Standard) • 1 komponent TEdit (paleta Standard) • 1 komponent TComboBox (paleta Standard) • 1 komponent TRadioGroup (paleta Standard) • 3 komponenty TButton (paleta Standard) 4.2. Dodać odpowiednie opcje do komponentu pola wielokrotnego wyboru (TComboBox). Opcje do tego komponentu dodaje się edytując własność Items. Otwiera się wtedy Edytor kolejnych elementów do wyboru (tzw. String List Editor). Utworzyć 4 elementy określające rodzaje wpisywanych czasopism (kolejne elementy zapisywane są w kolejnych linijkach): ‘Dziennik’, ‘Tygodnik’, ‘Miesiecznik’, ‘Kwartalnik’. Rysunek 3.5. Postać okna do dodawania nowych rekordów Ustawić listę opcji na pierwszy element, poprzez ustawienie własności ItemIndex (indeks elementu w TComboBox) na 0. 4.3. Dodać odpowiednie opcje do komponentu wyboru opcji TRadioGroup. Opcje do tego komponentu dodaje się edytując własność Items. Otwiera się wtedy Edytor kolejnych elementów do wyboru (tzw. String List Editor). Utworzyć 2 elementy określające dostępność wpisywanych czasopism (kolejne elementy zapisywane są w kolejnych linijkach): ‘Tak’, ‘Nie’. Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 5 Rysunek 3.6. Postać okna do dodawania nowych rekordów Ustawić listę opcji na pierwszy element, poprzez ustawienie własności ItemIndex (indeks elementu w TRadioGroup) na 0. Ponieważ na panelu TRadioGroup wszystkie przyciski są zgrupowane i przekazują informacje o swoim statusie, czy są, czy też nie są wybrane (własność Enabled) to aktywacja jednego elementu automatycznie dezaktywuje pozostałe. (Skompilować program i uruchomić) 5. Projektowanie okna wypisywania informacji zapisanych rekordach Do zaprojektowania tego okna, należy najpierw utworzyć jego formularz, jako oddzielny formularz w projekcie. Rysunek 3.7. Postać okna do wyświetlania rekordów Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 6 5.1. Dodajemy następujące komponenty w kolejności • 1 komponent TStringGrid (paleta Additional) • 1 komponent TButton (paleta Standard) (Skompilować program i uruchomić) 6. Programowanie funkcji odpowiadających kolejnym zdarzeniom 6.1 Programowanie akcji Następnie należy zaprojektować odpowiednie akcje, czyli inaczej procedury wykonujące odpowiednie operacje. Akcje przydatne są przy budowie dużych aplikacji wtedy gdy te same procedury wykorzystywane są przez różne komponenty. W przypadku przedstawionego programu akcje będą wykorzystywane zarówno przez przyciski komponentu TToolBar jak i wybrane elementy komponentu TMainMenu. Akcje zapisuje się w komponencie TActionList. \ Należy kliknąć na komponent TActionList i utworzyć akcje obsługujące funkcje programu (np.: Zapisz do pliku, Otwórz plik, O Programie , Zamknij) Rysunek 3.8. Edytor Akcji Dwa razy klikając na daną akcje możemy dodać odpowiednią funkcję związaną z wywołaniem danej akcji. W przypadku naszego programu będą to następujące akcje: Akcja 1: Zakończenie działania programu z wykorzystaniem okienka dialogowego Nie zamykając projektu dodajemy do niego okno dialogowe (nowy formularz) wybierając opcje File->New->Other->Dialogs i wybierając okno Standard Dialog (np. Standard Dialog (Horizontal) ). Rysunek 3.9. Standardowe okno dialogowe do zakończenia pracy z programem Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 7 Następnie należy w pliku związanym z tym oknem dialogowym (np. Unit2.cpp) sprawdzić, jak nazywa się obiekt odpowiadający za okno dialogowe (np. OKBottomDlg). Aby umożliwić wywoływanie okienka dialogowego z programu głównego, oraz pobierać z niego informacje, należy dołączyć jego plik nagłówkowy na początku programu związanego z głównym formularzem (np. Unit1.cpp), przy pomocy dyrektywy: #include "Unit2.h" postać akcji jest następująca: void __fastcall TForm1::KoniecAcnExecute(TObject *Sender) { OKBottomDlg->ShowModal(); if (OKBottomDlg->ModalResult==mrOk){ //zamkniecie formularza glownego this->Close(); }; } Akcja 2: Otwarcie okna do dodawania nowych elementów do bazy danych void __fastcall TForm1::DodawanieAcnExecute(TObject *Sender) { Form4->Show(); } 7. Projektowanie bazy danych (przykład z tablicą o określonym rozmiarze) Celem programu jest zapisywanie nowych rekordów do bazy danych wykorzystując interfejs graficzny, oraz ich przeglądanie na oddzielnym formularzu. W najprostszym przypadku do przechowywania danych będziemy wykorzystywali tablice jednowymiarową o określonym rozmiarze, która będzie zawierała obiekty/rekordy klasy TCzasopismo, opisującej własności kolejnego czasopisma: - nazwę typ czasopisma (tygodnik, miesięcznik, dziennik, kwartalnik, rocznik) dostępność (własność logiczna) Klasę TCzasopismo należy zdefiniować w oddzielnym pliku TCzasopismo.cpp, o nazwie takiej samej jak nazwa klasy. W jej części publicznej należy zadeklarować zmienne opisujące czasopismo. #include <vcl.h> class TCzasopismo { private: protected: public: AnsiString nazwa; AnsiString typ; bool dostepnosc; TCzasopismo(); ~TCzasopismo(); Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych 8 }; Następnie dołączyć do pliku unit1.cpp plik z definicją klasy TCzasopismo #include ”TCzasopismo.cpp” W części publicznej formularza należy zadeklarować tablicę n - elementową (np. n=10), która będzie zawierała poszczególne rekordy: ... public: ... // User declarations TCzasopismo Tablica[10]; int ostatni; 7.1. Programowanie interfejsu do wprowadzania danych Przycisk do dodawania danych powinien pozwalać na wpisywanie elementów do tablicy zadeklarowanej w formularzu głównym. Aby móc modyfikować tablicę, należy dołączyć odpowiedni plik nagłówkowy skojarzony z Formularzem głównym: #include "Unit1.h" Odpowiednia procedura dodająca elementu do tablicy jest następująca: void __fastcall TForm4::DodajBtnClick(TObject *Sender) { if (Form1->ostatni<10){ Form1->ostatni++; //stworzenie nowego elementu w tablicy Form1->Tablica[Form1->ostatni-1].nazwa=Form4->NazwaEdt>Text; Form1->StatusBar1->Panels->Items[1]->Text=IntToStr(Form1>ostatni); //sprawdzenie typu danego elementu switch (this->TypCBox->ItemIndex) { case 0:Form1->Tablica[Form1->ostatni1].typ="Dziennik"; break; case 1:Form1->Tablica[Form1->ostatni1].typ="Tygodnik" ; break; case 2:Form1->Tablica[Form1->ostatni1].typ="Miesiecznik" ; break; case 3:Form1->Tablica[Form1->ostatni1].typ="Kwartalnik" ; break; default:Form1->Tablica[Form1->ostatni1].typ="brak. inf"; break; }; //sprawdzenie dostepnosci if (this->DostepnyRGroup->ItemIndex==0){ Form1->Tablica[Form1->ostatni-1].dostepnosc=true; }else{ Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych }else{ } }; } 9 Form1->Tablica[Form1->ostatni-1].dostepnosc=false; this->DodajBtn->Enabled=false; 7.3. Wyświetlanie danych z bazy na oddzielnym formularzu Przycisk do wyświetlania danych w oddzielnym formularzu. Dane będą wyświetlane w oddzielnym formularzu w tabeli z wykorzystaniem komponentu podstawowego TStringGrid. Aby można było wyświetlać i obsługiwać ten formularz należy dołączyć odpowiedni plik nagłówkowy z nim związany. #include "Unit2.h" Podstawowe własności komponentu TStringGrid to: RowCount FixedRows, FixedCols Cells[wiersz][kolumna] Scrollbars - określenie ilości rzędów, zwiększenie tej wartości pozwala na dodanie nowego rzędu. - określenie rzędów i kolumn o zablokowanych komórkach, czyli takich które się nie przesuwają podczas przewijania z wykorzystaniem pasków przewijania (ang. scrollbars). - wpisanie łańcucha znaków do odpowiedniej komórki. - wyświetlenie pasków przewijania (wartość ssVertical – paski pionowe, wartość ssHorizontal – paski poziome, wartość ssBoth – paski poziome i pionowe, wartość ssNone – bez pasków). Odpowiednia procedura wyświetlające elementy z tablicy w oddzielnym formularzu jest związania z naciśnięciem na przycisk ‘Wyświetl’ Może być następująca: void __fastcall TForm4::WyswietlBtnClick(TObject *Sender) { //wyswietlenie formularza Form2->Show(); //okreslenie ilosci rzedow pokazywanych na poczatku Form2->StringGrid1->RowCount=2; Form2->StringGrid1->FixedRows=1; //dodanie opisu do kolumn Form2->StringGrid1->Cells[0][0]="nr kol."; Form2->StringGrid1->Cells[1][0]="nazwa"; Form2->StringGrid1->Cells[2][0]="typ"; Form2->StringGrid1->Cells[3][0]="dostepnosc"; //wyswietlenie wszystkich elementow z tablicy na nowym formularzu for (int i=0;i<Form1->ostatni;i++){ //dodanie nowego pustego wiersza Form2->StringGrid1->RowCount++; //wpisanie wartosci do odpowiednich komorek Form2->StringGrid1->Cells[0][i+1]=IntToStr(i+1); Form2->StringGrid1->Cells[1][i+1]=Form1->Tablica[i].nazwa; Form2->StringGrid1->Cells[2][i+1]=Form1->Tablica[i].typ; //sprawdzenie i wypisanie inf. o dostepnosci Programowanie Wizualno Obiektowe - zajęcia 3 (PWO_BCPP_3_1) Tworzenie i kompilowanie projektów – projektowanie prostej bazy danych } }; 10 if (Form1->Tablica[i].dostepnosc==true){ Form2->StringGrid1->Cells[3][i+1]="dostępny"; }else{ Form2->StringGrid1->Cells[3][i+1]="niedostępny"; }; 8. Dodatkowa poprawa funkcjonalności programu Po napisaniu programu istotne jest umożliwienie zamykania poszczególnych okienek bez konieczności zamykania całego programu. Dodatkowo ważne jest blokowanie odpowiednich przycisków w momencie, gdy nie można już wykonać polecenia z nimi związanego 8.1 Zamykanie poszczególnych formularzy z wykorzystaniem przycisków ‘Zamknij’. void __fastcall TForm2::Button1Click(TObject *Sender) { this->Close(); } 8.2 Informacja o programie (dodatkowy element w menu głównym i na liście akcji) Do wypisania informacji o programie można wykorzystać standardowe okno dialogowe o nazwie About Box, żeby je utworzyć należy stworzyć nowy formularz w istniejącym projekcie File>New>Other...>Forms>About box. Ponieważ nowy formularz jest tworzony automatycznie z modułem, który go opisuje, moduł ten o musimy dodać do spisu modułów w module związanym z naszym głównym formularzem #include ”Unit5.h”; Okno dialogowe będzie miało nazwę AboutBox. Akcja/funkcja wypisująca informacje o programie w tym oknie będzie wyglądała następująco. void __fastcall TForm1::OProgramieAcnExecute(TObject *Sender) { AboutBox->ProductName="program 'Baza danych'"; AboutBox.ShowModal; } Rysunek 3.10. Standardowe okno dialogowe do zakończenia pracy z programem