Programowanie Wizualno Obiektowe Zajęcia 2, część 2 1 Temat 2: Zadanie: Wykorzystanie komponentów podstawowych (przyciski, pola edycyjne, etykiety) i obsługa ich własności podstawowych, projektowanie menu, wykorzystanie okien dialogowych (obsługa dwóch formularzy). Należy napisac apliację, która będzie umozliwiała edycje plików tekstowych. Wczytanie plików i zapis należy wykonać wykorzystując menu główne, standardowe okna dialogowe do otwierania i zapisywania plików, oraz komponent TMemo. Informację o pliku należy wyświetlac na pasku statusu. Wyjście z programu zrealizowac poprzez okno dialogowe. Dodatkowo: - dodać podpowiedź do każdego z komponentów wizualnych - dodac skróty klawiszowe do kazdej z opcji menu - dodac filtry do okien dialogowych do otwierania i zapisywnia plików - czyścić pole TMemo przy pomocy PopUpMenu Rysunek 2.1. Postać interfejsu użytkownika dla programu 1 1. Otwieramy nowa aplikację File>NewApplication 2. Zapisujemy projekt przy pomocy File>Save All w katalogu gdzie będzie kompilowany nasz projekt 3. Dodajemy odpowiednie komponenty w kolejności 1 pole edycyjne TMemo (paleta Standard) o nazwie (własność name): - TekstMemo 1 komponent TMainMenu (paleta Standard). 1 komponent TPopupMenu (paleta Standard). 1 komponent TOpenDialog (paleta Dialogs) 1 komponent TSaveDialog (paleta Dialogs) 1 komponent TStatusBar (paleta Win32)
4. Po kliknięciu na komponent MainMenu otworzy się tzw. Menu Designer służący do zaprojektowania głównego menu tekstowego. Należy zaprojektować menu główne tak, aby miało następujące funkcje. - Plik - Otwórz Plik (skrót Ctrl+L) - Zapisz do Pliku (skrót Ctrl+S) - Koniec (skrót Alt+F4) Z każdą opcją można skojarzyć odpowiednią kombinacje klawiszy która ją wywołuje. Skróty klawiszowe można dodać do każdego elementu menu zmieniając jego własność ShortCut>Skrót. 2 Rysunek 2.2. Projketowanie głównego menu 5. Projektowanie paska statusu. Pasek statusu może być wykorzystany do wyświetlania informacji nt. aktualnie wykonywanych czynności. Składa się on z tzw. paneli których zbiór należy do klasy TPanels. Na początku pracy z paskiem statusu należy stworzyć panele do wyświetlania informacji. Jedną z metod dodania paneli do paska statusu to wykorzystanie inspektora obiektów. Klikając na własność Panels komponentu StatusBar uruchamia się okno edycyjne paska statusu (EditStatusPanels). Wybierając opcję Add new można dodać nowy panel. Każdy nowy panel paska statusu jest elementem klasy TStatusPanel i zapisywany jest jako element tablicy StatusBar->Panels->Items. Podstawowe własności panelu to: Text tekst wypisywany na panelu, Width szerokość jaką zajmuje panel w pasku statusu (jeśli nie jest określona to przyjmuje całą możliwą szerokość). Rysunek 2.3. Edycja paska statusu (dodawanie paneli) Drugą z metod dodawania paneli do paska statusu jest dodanie ich poprzez odpowiednie komendy w kodzie programu, na przykład podczas tworzenia fomularza:
3 void fastcall TForm1::FormCreate(TObject *Sender) //dodanie nowego panelu this->statusbar1->panels->add(); //zmiana własności wybranego panelu this->statusbar1->panels->items[0]->text="nazwa pliku"; this->statusbar1->panels->items[0]->width=70; 6. Piszemy odpowiednie procedury (obsługa zdarzenia OnClick przycisków) 6.1 Wczytywanie pliku tekstowego do pola Memo. Aby zrealizować tą opcję, należy skorzystać ze standardowego okna dialogowego służącego do otwierania plików OpenDialog. We własnościach komponentu OpenDialog określić pliki, które mogą być wyświetlane wybierając własność Filter i definiując filtry do wyboru odpowiednich plików wykorzystując tzw. edytor filtrów FilterEditor i modyfikując pola: Filter Name nazwa odpowiedniego filtru np. plik tekstowy, Filter - możliwe do otwierania rozszerzenia np. *.txt. Rysunek 2.4. Dodawanie filtrów do okna dialogowego OpenDialog Wczytywanie pliku tekstowego z wykorzystaniem okienka dialogowego jest wykonywane poprzez obsługę zdarzenia OnClick odpowiedniego elementu głównego menu. void fastcall TForm1::WczytajPlik1Click(TObject *Sender) if (this->opendialog1->execute()) this->tekstmemo->lines->loadfromfile(this->opendialog1->filename); ; this->statusbar1->panels->items[0]->text="wczytano plik:"+this->opendialog1->filename; Otwarcie Okna dialogowego do otwarcia pliku wykonuje się poprzez wywołanie metody tego okna Execute(). Powoduje to otwarcie tego okna w trybie modalnym (bez możliwości przełączania pomiędzy oknami programu). Po wybraniu odpowiedniego pliku, jego nazwa przechowywana jest w zmiennej OpenDialog->FileName. 6.2 Zapisywanie informacji z pola Memo do pliku tekstowego Aby zrealizować tą opcję, należy skorzystać ze standardowego okna dialogowego służącego do zapisywania plików SaveDialog. Właściwości tego komponentu zmienia się analogiczne jak właściwości komponentu OpenDialog.
4 void fastcall TForm1::Zapiszdopliku1Click(TObject *Sender) if (this->savedialog1->execute()) this->tekstmemo->lines->savetofile(this->savedialog1->filename); ; this->statusbar1->panels->items[0]->text="zapisano do pliku:"+this->savedialog1->filename; 6.3 Zamykanie programu z wykorzystaniem okna dialogowego Wygodnym ze względu na użytkownika sposobem wychodzenia z programu jest wykorzystanie okna dialogowego, czyli oddzielnego formularza przy pomocy którego oczekuje się na potwierdzenie wyjścia z programu. 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 2.5. Standardowe okno dialogowe do zakończenia pracy z programem 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" następnie wywołać okno dialogowe poprzez obsługę zdarzenia OnClick dla opcji Koniec w głównym menu na głównym formularzu. void fastcall TForm1::Koniec1Click(TObject *Sender) OKBottomDlg->ShowModal(); if (OKBottomDlg->ModalResult==mrOk) this->close(); ; Otwarcie okienka dialogowego wykonuje się poprzez wybranie metody: Show() - możliwe jest przełączanie pomiędzy oknami programu ShowModal() - przełączanie pomiędzy oknami programu jest zablokowane Informacje o tym, który przycisk okna dialogowego został naciśnięty można uzyskać sprawdzając własność okienka dialogowego ModalResult. Każdy z przycisków ma przyporządkowaną wartość o standardowej nazwie: Przycisk OK ModalResult==mrOk Przycisk Cancel ModalResult==mrCancel
5 7. Wykorzystanie menu kontekstowego PopUpMenu. Menu kontekstowe zostanie wykorzystane do czyszczenia zawartości komponentu Memo. Jest to menu które będzie się pokazywało po najechaniu na skojarzony z nim komponent kursorem i kliknięciu prawym klawiszem. Projektuje się je analogicznie jak MainMenu. Należy więc dodać opcję Wyczyść przy pomocy Menu Designera. Rysunek 2.6. Projektowanie PopUpMenu Następnie aby skojarzyc menu kontekstowe z komponentem Memo, należy zapisać w jego własności PopUpMenu nazwę skojarzonego z nim menu kontekstowego. Kolejnym krokiem jest obsługa zdarzenia OnClick opcji Wyczysc : void fastcall TForm1::Wyczy1Click(TObject *Sender) this->tekstmemo->lines->clear(); UWAGA Dla każdego z komponentów, które mogą mieć dodane menu kontekstowe można skojarzyć różne menu kontekstowe. Takie rozdzielenie opcji na kilka menu odpowiadających różnym komponentom zwiększa czytelność programu. Należy jednak nie zapomnieć o zapewnieniu pełnej funkcjonalności programu poprzez menu główne. W menu kontekstowym powinny znajdować się głównie opcje dodatkowe. 8. Dodawanie podpowiedzi do komponentów wizualnych. Do każdego z komponentów wizualnych można dodać podpowiedź informującą użytkownika o danym komponencie. Polega ona na ustawieniu własności Hint dla komponentów wizualnych. Następnie, aby taka podpowiedź się ukazywała po najechaniu na dany komponent (bez kliknięcia!!) należy ustawić własność ShowHint->true. KONIEC