ZASADY PROGRAMOWANIA semestr zimowy 2003/2004 Zajecia: 11 Zajecia z Delphi: 4 Temat: Zadanie: Obsluga standardowych okien dialogowych. Komponenty: TMainMenu, TPanel, TradioButton, TComboBox, TMemo, TStatusBar. Program powinien: umozliwic wprowadzanie danych osobowych (imie i nazwisko) do tablicy typu rekordowego oraz usuwanie ostatniego elementu; po wybraniu opcji dodatkowych za pomoca okna wyboru z rozwijanym menu oraz za pomoca alternatywnego wyboru opcji, powinien wyswietlic dane w oknie edycyjnym zgodnie z wyborem uzytkownika; zawartosc okna powinien móc zapisywac do pliku tekstowego. 1. Otwieramy nowa aplikacje: File>New>Application. 2. Zapisujemy projekt wraz z modulem: File>Save All w katalogu, w którym kompilator bedzie mógl utworzyc plik exe. 3. Dodajemy komponenty w kolejnosci (zmieniamy cechy Name i Caption): panele Tpanel (paleta Standard) oraz ich elementy okno TMemo pasek stanu TstatusBar (paleta Win32) menu programu TmainMenu (paleta Standard) oraz komponent standardowego okna zapisywania do pliku TsaveDialog (paleta Dialogs) na oknie Memo po uruchomieniu programu nie beda one widoczne.
2 Panele grupuja elementy na nich umieszczone tworza strukture drzewiasta (patrz. Object TreeView). Ustawienie suwaków dla okna Memo: zakladka Properties okna Objecy Inspector, pole ScrollBars wybieramy ssboth. 4. Projektowanie menu programu rozpoczynamy od dwukrotnego klikniecia na komponencie MainMenu pojawia sie Menu Designer, wprowadzajac poszczególne pozycje otrzymujemy: 5. Dwukrotne klikniecie na element menu Wyjscie doda funkcje obslugujaca zdarzenie onclick, gdzie na poczatku wpisujemy tylko (elementy dopisywane kursywa): procedure TForm1.Wyjscie1Click(Sender: TObject); Close; PRZYPOMNIENIE: jezeli nie mamy pewnosci jakie pola i metody posiada dany obiekt nalezy wpisac jego nazwe i kropke. Kompilator wyswietli liste dostepnych opcji. W tym przypadku mozna bylo napisac Form1. i poczekac: wybór wystarczy zatwierdzic enterem.
3 6. Za pomoca kodu programu mozna utworzyc panele na pasku statusu oraz ustalic ich szerokosci, aby wykonac to w momencie uruchomienia programu nalezy wybrac zdarzenie OnCreate zakladka Events dla obiektu Form1. procedure TForm1.FormCreate(Sender: TObject); var i : integer; for i := 0 to 4 do form1.statusbar1.panels.add; form1.statusbar1.panels[0].width:=75; form1.statusbar1.panels[1].width:=75; form1.statusbar1.panels[2].width:=150; form1.statusbar1.panels[3].width:=150; 7. Deklarujemy nasz typ rekordowy i wektor danych przed deklaracja klasy (te deklaracje moga byc równiez umieszczone w czesci prywatnej naszej klasy TForm): type osoba = record imie : string; nazwisko : string; dane = array[1..10] of osoba; oraz nasze zmienne (w czesci prywatnej klasy TForm1): private MojeDane : dane; Ostatni : integer; PokazPierwszy : boolean; PokazWszystkie : boolean; PokazImie : boolean; PokazNazwisko : boolean;
4 8. Deklarujemy wlasne procedury wpisywania danych do naszego wektora MojeDane. Deklaracje w czesci prywatnej: procedure DodajElement(imie:string;nazwisko:string); procedure UsunElement; oraz w czesci implementacyjnej kod procedur: procedure TForm1.DodajElement; Ostatni:=Ostatni+1; if Ostatni <11 then Form1.IlElementowLbl.Caption:=IntToStr(Ostatni); Form1.StatusBar1.Panels[1].Text:='Elementow '+IntToStr(Ostatni); MojeDane[Ostatni].imie:=imie; MojeDane[Ostatni].nazwisko:=nazwisko; Form1.UsunBtn.Enabled:=true; if Ostatni = 10 then Form1.TablicaZapelnionaLbl.Caption:='Tablica z danymi wypelniona'; Form1.StatusBar1.Panels[4].Text:='KONIEC WPROWADZANIA DANYCH'; Form1.DodajBtn.Enabled:=false; W nawiazaniu do przypomnienia, jezeli wpiszemy nazwe formularza, to potem po kropce mamy dostepne jego cechy (pola i metody). Zostalo to pokazane powyzej kursywa teksty wpisywane przez nas, a tekstem normalnym wykorzystane podpowiedzi kompilatora. W dalszej czesci pomijane bedzie takie formatowanie tekstu tego dokumentu. Nasza procedura usuwania nie bedzie usuwac elementów tylko zmieni wskaznik ostatniego elementu kolejne dodanie imienia i nazwiska spowoduje nadpisanie: procedure TForm1.UsunElement; Ostatni:=Ostatni-1; Form1.ImieEdit.Clear; Form1.NazwiskoEdit.Clear; Form1.IlElementowLbl.Caption:=IntToStr(Ostatni); Form1.StatusBar1.Panels[1].Text:='Elementow '+IntToStr(Ostatni); Form1.DodajBtn.Enabled:=true; Form1.TablicaZapelnionaLbl.Caption:=''; if Ostatni =9 then Form1.TablicaZapelnionaLbl.Caption:='jest jeszcze jedno miejsce'; Form1.StatusBar1.Panels[4].Text:=''; if Ostatni=0 then Form1.UsunBtn.Enabled:=false; Nalezy zwrócic uwage na blokowanie przycisków dodawania i usuwania. Jezeli nie mamy elementów, to nie mozemy ich usuwac. Kiedy mamy wypelniony wektor z danymi, to nie mozemy dalej dopisywac. Przcisk Usun nalezy na wstepie zablokowac (cecha Enabled). W tych procedurach odwolujemy sie do paneli paska stanu programu. Nalezy go utworzyc w czesci inicjalizujacej program. W tym celu nalezy kliknac na formularz i wybrac zdarzenie OnCreate i nastepnie zdefiniowac nasze parametry wejsciowe:
5 procedure TForm1.FormCreate(Sender: TObject); var i : integer; for i:=0 to 4 do form1.statusbar1.panels.add; form1.statusbar1.panels[0].width:=50; form1.statusbar1.panels[1].width:=75; form1.statusbar1.panels[2].width:=100; form1.statusbar1.panels[3].width:=150; Ostatni:=0; Form1.TablicaZapelnionaLbl.Caption:=''; Aby indeksowac petle nalezy dodac zmienna i pomiedzy czescia publiczna i implementacyjna: public { Public declarations } var Form1: TForm1; i : integer; implementation 9. Podlaczenie wlasnych procedur dodawania i usuwania pod przyciski Dodaj i Usun. procedure TForm1.DodajBtnClick(Sender: TObject); Form1.DodajElement(Form1.ImieEdit.Text,Form1.NazwiskoEdit.Text); procedure TForm1.UsunBtnClick(Sender: TObject); Form1.UsunElement; TForm1.DodajBtnClick i TForm1.UsunBtnClick informuje nas o tym, ze procedury dotycza zdarzenia OnClick. 10. Wykorzystanie obiektu ComboBox i RadioButton. Aby zdeklarowac liste wyborów obiektu ComboBox nalezy w zakladce Properties inspektora obiektów znalezc pole Items i kliknac w Tstrings, pojawi sie String List Editor. Wpisjemy kolejno ciagi znaków odpowiadajace naszym opcjom. UWAGA Pierwszy element listy ma indeks 0.
6 Jezeli dokonujemy wyboru za pomoca obiektu ComboBox nalezy uaktualnic nasze zmienne. W tym celu wybieramy zdarzenie OnChange. Dodatkowo odblokowujemy przycisk wyswietlania w momencie, gdy juz mamy zaznaczone któres z pól RadioButton. procedure TForm1.WyborCmbBoxChange(Sender: TObject); if Form1.PierwszeRadBtn.Checked or Form1.WszystkieRadBtn.Checked then Form1.WyswietllBtn.Enabled:=true; if Form1.WyborCmbBox.ItemIndex =0 then PokazImie:=true; PokazNazwisko:=false; end else if Form1.WyborCmbBox.ItemIndex =1 then PokazNazwisko:=true; PokazImie:=false; end else PokazImie:=true; PokazNazwisko:=true; Instrukcje uaktualniania naszych zmiennych mozna równiez umiescic w konstrukcji case of. Jezeli nie mielismy zaznaczonego wpierw zadnego z pól RadioButton zmiana wyboru ComboBox nie odblokuje przycisku Wyswietl, w zwiazku z tym nalezy stworzyc procedury, które umozliwia odblokowanie przycisku, w przypadku, kiedy wpierw dokonujemy wyboru z listy, a pózniej wyboru alternatywnego (za pomoca RadioButton). procedure TForm1.PierwszeRadBtnClick(Sender: TObject); if Form1.WyborCmbBox.ItemIndex in [0..2] then Form1.WyswietllBtn.Enabled:=true; procedure TForm1.WszystkieRadBtnClick(Sender: TObject); if Form1.WyborCmbBox.ItemIndex in [0..2] then Form1.WyswietllBtn.Enabled:=true;
7 11. Obsluga wyswietlania w oknie Memo. W zaleznosci od wybranych opcji, w oknie maja zostac wyswietlone imiona, nazwiska lub imiona i nazwiska z uwzglednieniem, czy maja to byc wszystkie elementy z wektora, czy tez tylko pierwszy. W petli indeksowanej do 1 lub do Ostatni dodawane sa linie w oknie Memo, które wczesniej sa skladane w stringu linia zgodnie z wyborem uzytkownika. Po dodanu nowej linii zmienna linia przyjmuje wartosc pusta. procedure TForm1.WyswietllBtnClick(Sender: TObject); var i,licznik:integer; linia:string; if Form1.PierwszeRadBtn.Checked then PokazPierwszy:=true; PokazWszystkie:=false; end else PokazWszystkie:=true; PokazPierwszy:=false; Form1.Memo.Clear; if PokazWszystkie then licznik:=ostatni else licznik:=1; for i:=1 to licznik do if PokazImie then linia:=mojedane[i].imie +' '; if PokazNazwisko then linia:=linia + MojeDane[i].nazwisko; Form1.Memo.Lines.Add(linia); linia:=''; Form1.Memo.Show; Jezeli wybralismy Pokaz pierwszy to nie wybralismy na odwrót, a jezeli nie bylby wybrany zaden, to nie moglibysmy uruchomic tej procedury, bo przycisk bylby zablokowany, stad konstrukcja if Pierwszy then... else.... Nalezy pamietac o tym, ze mozemy wielokrotnie dokonywac wyboru opcji wyswietlania. Jezeli raz wybierzemy tak, a potem inaczej, to musimy pamietac o wpisywaniu wartosci false do naszych zmiennych sterujacych wyswietlaniem, a nie tylko ustawiac je na wartosci true. Oczywiscie mozna nie poslugiwac sie zmiennymi pomocniczymi, tylko korzystac bezposrednio z wartosci odpowiednich pól komponentów sluzacych do wybierania opcji wyswitlania. 12. Wykorzystanie standardowego okna do zapisu do pliku. Na samym poczatku zostal umieszczony komponent SaveDialog. Kiedy go wywolamy, dopóki nie wprowadzimy nazwy pliku i nie zatwierdzimy przyciskiem OK nie mamy dostepu do naszej aplikacji jest to okno modalne. Potwierdzenie wykonania operacji zwraca pole Execute. W zwiazku z tym po kliknieciu w przycisk Zapisz do pliku (ZapiszBtn) powinnismy dopisac: procedure TForm1.ZapiszBtnClick(Sender: TObject); if Form1.SaveDialog.Execute then
8 Form1.Memo.Lines.SaveToFile(Form1.SaveDialog.FileName); Jak widac okno Memo ma mozliwosc zapisania calej swej zawartosci do pliku tekstowego. Podobna procedure nalezy powtórzyc dla menu Plik>Zapisz: procedure TForm1.Zapisz1Click(Sender: TObject); if Form1.SaveDialog.Execute then Form1.Memo.Lines.SaveToFile(Form1.SaveDialog.FileName); 13. Informacja o programie w menu O programie W Menu Designer dodajemu dodatkowo pozycje O programie. Otwieramy nowe okno (podobnie jak projektowanie okna dialogowego na poprzednich zajeciach) menu kompilatora: File>New>Other... zakladka Forms i wybieramy About box. Automatycznie zostaje dolaczony modul do tego okna. Zapisujemy go i dolaczamy w naszym module glównym, gdzie zawarlismy wszystkie nasze procedury dotyczace formularza Form1. W obsludze wywolania menu O Programie (klikamy w nasze menu O porgramie) wpisujemy (oczywiscie mozemy ustalic wiecej parametrów, wlacznie ze zmiana ikonki): procedure TForm1.Oprogramie1Click(Sender: TObject); AboutBox.ProductName.Caption:='PROGRAM TESTOWY'; AboutBox.ShowModal; nasze okno po uruchomieniu programu i wybraniu opcji z menu wyglada nastepujaco: