Rozdział 9
Pierwsze kroki
Mając już utworzone obiekty bazy danych, jesteśmy gotowi do projektowania
i tworzenia aplikacji RENTMAN. Rozdział siódmy: Projektowanie aplikacji
w modelu klient/serwer zawiera liczne pomysły, z którymi warto się zapoznać
przed dalszą pracą.
Rozpocznijmy od przypomnienia pięciu faz tworzenia aplikacji. Jak pisaliśmy
w rozdziale ósmym: tworzenie każdego programu składa się z następujących
etapów:
analiza;
projekt;
budowanie;
testowanie;
eksploatacja, konserwowanie.
W poprzednim rozdziale przebyliśmy etapy analizy, projektowania i budowy bazy
danych projektu RENTMAN. W niniejszej części będziemy analizować
i projektować aplikację, by w końcu rozpocząć fazę kodowania. Podstawą procesu
tworzenia programu będą obiekty bazy danych utworzonej w rozdziale ósmym.
Konstruowanie podstawy: baza danych RENTMAN
W tym miejscu baza danych powinna już być zaprojektowana i utworzona,
w przeciwnym razie musimy cofnąć się do poprzedniej części oraz utworzyć bazę
danych RENTMAN - podstawę, na której będziemy budować resztę programu.
Zakończenie tworzenia bazy danych przed przystąpieniem do dalszej pracy jest
ważne, albowiem zmiany w strukturze bazy po napisaniu aplikacji wymagają
przebudowy odpowiedniej części programu.
Określanie rodzaju budowanej aplikacji
Jak pamiętamy z rozdziału siódmego, pierwszym krokiem budowania programu
obsługi baz danych jest określenie rodzaju projektowanej aplikacji. Istnieją dwa
podstawowe wybory: systemy przetwarzania transakcji w czasie rzeczywistym
278 Część II
(OLTP- Online Transaction Processing Systems) i systemy wspierania decyzji
(DSS- Decision Support Systems). Ostatnie mają dać menedżerom ogląd z lotu
ptaka informacji o przedsiębiorstwie, natomiast pierwsze umożliwiają zmiany
i manipulowanie danymi. W programach DSS dane są dostępne jedynie w trybie
do odczytu , natomiast w systemach OLTP informacje można zarówno
odczytywać, jak i zapisywać do bazy danych. Ta różnica powoduje, że już
w momencie startu należy zdawać sobie sprawę z tego, jaki rodzaj programu
będziemy budować.
RENTMAN jest aplikacją przetwarzającą transakcje. Użytkownicy muszą mieć
możliwość dodawania, zmieniania i usuwania danych. System ten nie spełnia więc
kryteriów wyróżniających programy DSS. Z drugiej strony, pewne informacje
udostępniane za pośrednictwem aplikacji będą używane przez zarządzających
Allodium w procesie podejmowania decyzji. Dlatego, jak w większości systemów
klient/serwer, RENTMAN będzie hybrydą, zawierającą kluczowe elementy
zarówno OLTP, jak i DSS. Dla swoich celów będziemy budować aplikację
RENTMAN jako system OLTP, zawierający wiele elementów DSS.
Utworzyć obiekty programu na podstawie procesów aplikacji
Przy użyciu modeli reguł przetwarzania, opisywanych w rozdziale ósmym, należy
przeanalizować każdą regułę, w celu określenia wszystkich niezbędnych do
implementacji obiektów aplikacji (zazwyczaj są to formularze i raporty). Możemy,
na przykład, wydedukować, że będą nam potrzebne sposoby wprowadzania
informacji do każdego zbioru danych zdefiniowanego w modelu reguł
przetwarzania. Musimy pamiętać o korelacji między zbiorami danych w modelach
i odpowiednimi tabelami w naszym fizycznym projekcie. Podobnie istnieje prosty
związek pomiędzy tabelami w bazach danych i formularzami programu. Będziemy
prawdopodobnie potrzebować więcej niż jednego formularza do obsługi każdej
tabeli. Może to być na przykład prosty formularz do wprowadzania danych,
służący użytkownikom do dodawania nowych rekordów, czy rozbudowany
formularz do obsługi tabeli, umożliwiający wyszukiwanie, dodawanie, zmiany
i kasowanie wierszy tabeli.
Nie należy się przejmować pojawiającymi się w związku z brakiem
doświadczenia, wątpliwościami co do właściwego wyboru formularzy i raportów.
Decyzje na tym etapie są zaledwie punktem wyjścia. Głównym zadaniem na
przyszłość jest określenie możliwości rozwoju programu. Trzeba sobie w pełni
zdawać sprawę z zawiłości konstruowania aplikacji. Charakterystyczną cechą
każdej implementacji, którą stworzymy, jest potrzeba dokonania w niej zmian.
Po określeniu wszystkich formularzy, raportów oraz innych obiektów
skojarzonych z odpowiednimi elementami modelu, warto opatrzyć go
odpowiednimi komentarzami. Postępując w ten sposób, ułatwiamy sobie
Pierwsze kroki 279
wyobrażenie podstawowych obiektów aplikacji. Rysunek 9.1 ilustruje model
procesu wynajmu (lease), zawierający przypisy o obiektach niezbędnych do jego
implementacji.
Zauważmy, że obiekty aplikacji RENTMAN są nazywane zgodnie ze
wskazówkami dotyczącymi nazewnictwa zawartymi w rozdziale 4, Konwencje .
Stosowane nazwy wskazują na specyficzny typ każdego formularza. Wskazane jest
również odróżniać sterowalne formularze tabelaryczne (ang. control grid forms)
od regularnych formularzy tabelarycznych (ang. regular grid forms), a te z kolei
od podstawowych formularzy do wprowadzania/aktualizacji danych i tych, które
są przeznaczone do szybkiego wprowadzania informacji. Na pytanie, co to są
sterujące formularze siatkowe, odpowiemy szczegółowo nieco pózniej, natomiast
już teraz możemy powiedzieć, że komponentu Delphi DBCtrlGrid używa się do
wyświetlania wielu rekordów na jednym formularzu. Różnią się od formularzy
służących do wyświetlania wielu rekordów za pomocą komponentu DBGrid.
Umiejętność właściwego doboru detali, takich jak decyzja o wyborze właściwego
komponentu do budowy odpowiedniego formularza, zdobywa się poprzez
praktykę. Programiści, latami budujący aplikacje klient/serwer, potrafią łatwo
określać takie szczegóły implementacji na bardzo wczesnym etapie budowania
programu.
Rysunek 9.1.
Model procesu
wynajmu (lease)
programu
RENTMAN,
zawierający
przypisy
o obiektach.
Będziemy chcieli posiadać możliwość rozpoznawania niezbędnych obiektów
aplikacji w każdym z modeli reguł przetwarzania. W przypadku programu
RENTMAN mamy dwa główne procesy, które będziemy szczegółowo analizować:
proces wynajmu (lease) oraz proces konserwacji (maintenance). Wcześniej każdy
280 Część II
model procesu analizowany był pod kątem możliwości znalezienia równoważnika
w aplikacji, teraz klasyfikujemy wszystkie zidentyfikowane obiekty jako raporty,
formularze lub nieinteraktywne procedury wspierające (czyli bloki kodu niezbędne
do poprawnego działania programu, ale nie związane bezpośrednio z interfejsem
użytkownika). Każdy zidentyfikowany obiekt powinien należeć do jednego
z trzech typów (dla naszych celów traktujemy wykresy jako raporty). Spróbujmy
zatem możliwie najlepiej odgadnąć, jakie typy obiektów możemy zbudować ( na
przykład formularze do szybkiego wprowadzania danych, szczegółowy raport
w formie wykazu, itp.) oraz odpowiednio je nazwać.
Zapamiętajmy, że niektóre obiekty są z góry określone. Na przykład, każda
aplikacja potrzebuje pewnego rodzaju podstawowego formularza i głównego okna
interfejsu. Podobnie każda tablica w aplikacji wymaga formularza do dodawania,
modyfikacji i usuwania rekordów. Tablica 9.1 przedstawia podstawową listę
formularzy i raportów programu RENTMAN.
Tablica 9.1. Podstawowe formularze i raporty programu RENTMAN.
Nazwa Cel Rodzaj obiektu Opis
fmRSYSMAN0
przetwarzanie formularz SDI Główna menu
transakcji systemu
fmRCALEDT0
wprowadzanie formularz szybkiego formularz
danych wprowadzania danych wprowadzania
(quick-entry) i edycji danych ze
zbioru CALL
fmRCALGRD0
przetwarzanie sterowalny formularz formularz
transakcji tabelaryczny (control tabelaryczny do
grid form) przeglądania listy
zbioru CALL
fmRWORMDE0
przetwarzanie formularz (master- kombinowany
transakcji detail) formularz do
analizy listy prac
fmRWORGRD0
przetwarzanie formularz tabelaryczny formularz listy prac
transakcji (grid form)
fmREMPENT0
wprowadzanie formularz szybkiego formularz do
danych wprowadzania danych szybkiego
(quick-entry) wprowadzania
danych
o pracownikach
fmREMPGRD0
przetwarzanie formularz tabelaryczny formularz
d h ( id f ) t b l d
Pierwsze kroki 281
Nazwa Cel Rodzaj obiektu Opis
danych (grid form) tabelaryczny do
przeglądania
i edycji listy
pracowników
fmRWKTGRD0
przetwarzanie formularz tabelaryczny formularz
danych (grid form) tabelaryczny do
przeglądania
i edycji rodzajów
pracy
fmRWKTENT0
wprowadzanie formularz szybkiego formularz do
danych wprowadzania danych szybkiego
(quick-entry) wprowadzania
danych o rodzaju
pracy
fmPROCGD0
przetwarzanie sterowalny formularz Sterowalny
danych tabelaryczny (control formularz
grid form) tabelaryczny tabeli
WAAŚCIWOŚCI
(PROPERTY)
fmRTENCGD0
przetwarzanie sterowalny formularz Sterowalny
danych tabelaryczny (control formularz
grid form) tabelaryczny tabeli
NAJEMCY
(TENANT)
fmRLEAGRD0
przetwarzanie formularz tabelaryczny formularz
danych (grid form) tabelaryczny tabeli
DZIERŻAWA
(LEASE)
rpRLEAPRT0
raport formularz raportu (form oficjalny raport
report) dotyczący
wynajmu
rpRWORD0
raport formularz raportu (form formularz listy prac
report) przydzielonych
pracownikom
rpRTSKLST0
raport szczegółowy raport raport o bieżących
(detail report) zadaniach
pracowników
282 Część II
Bez wątpienia przyjdzie uzupełnić tę listę, ale mamy od czego zacząć. I tak czeka
nas wystarczająco dużo pracy przy konstruowaniu obiektów wymienionych
w tablicy.
Projektowanie hierarchii formularzy
Teraz, gdy określone zostały typy formularzy projektu RENTMAN, przyszła pora
na zaprojektowanie ich hierarchii. Ponieważ Delphi pomaga tworzyć strukturę
dziedziczenia formularzy, można zrobić użytek z hierarchii dla zaoszczędzenia
czasu. Wystarczy bowiem zaprojektować formularz rodzicielski, a podobne
formularze będą dziedziczyć jego własności. Chcąc zmienić konkretny typ
formularza (powiedzmy formularza szybkiego wprowadzania danych), możemy po
prostu zmienić formularz rodzicielski, a modyfikacja obejmie wszystkie
formularze potomne.
Klasyfikacja formularzy Delphi
Pierwszy krok projektowania hierarchii formularzy polega na sklasyfikowaniu ich
ze względu na funkcje. Ponieważ zdecydowaliśmy o typie każdego formularza, ten
krok mamy już za sobą. Formularze baz danych Delphi można podzielić
funkcjonalnie na cztery główne klasy:
wprowadzania/edycji (Entry/Edit) - proste formularze, które reprezentują
pojedynczy rekord z jednej tabeli;
tabelaryczne (Grid) - formularze przedstawiające różne wiersze pojedynczej
tabeli na wzór arkuszy kalkulacyjnych (każdy rekord zajmuje jeden wiersz
ekranu);
sterowalne, tabelaryczne (Control grid) - formularze przedstawiające różne
wiersze pojedynczej tabeli (każdy rekord może zajmować kilka wierszy
ekranu);
Master-detail) - formularze kombinowane przedstawiające rekord lub rekordy
(
dwóch lub więcej powiązanych tabel).
Jeśli przeanalizujemy formularze i obiekty wyliczone w tabeli 9.1, zauważymy, że
formularze projektu RENTMAN można sklasyfikować tak, jak w tabeli 9.2.
Pierwsze kroki 283
Tablica 9.2. Formularze systemu RENTMAN przedstawione według klas
formularzy.
Formularz Klasa
fmRCALEDT0
formularz wprowadzania i edycji danych (Edit-entry)
fmRCALGRD0
formularz tabelaryczny ( Grid )
fmRWORMDE0 formularz (Master-detail)
fmRWORGRD0 formularz tabelaryczny (Grid )
fmREMPENT0 formularz wprowadzania i edycji danych (Edit-entry)
fmREMPGRD0 formularz tabelaryczny (Grid )
fmRWKTGRD0 formularz tabelaryczny (Grid )
fmRWKTENT0 formularz wprowadzania i edycji danych (Edit-entry)
fmPROCGD0 sterujący formularz tabelaryczny (Control grid )
fmRLEAGRD0 formularz tabelaryczny (Grid )
fmRTENCGD0 sterujący formularz tabelaryczny (Control grid )
W świetle powyższego rozkładu oczywiste jest, że system RENTMAN zawiera
formularze reprezentujące wszystkie cztery grupy funkcjonalne. Dlatego sensowne
będzie umieszczenie na szczycie hierarchii formularza nadrzędnego dla wszystkich
czterech typów. Rysunek 9.2. ilustruje prostą hierarchię formularzy.
Możemy najpierw utworzyć wszystkie formularze nadrzędne i zachować je
w składnicy obiektów Delphi (Delphi s Object Repository). Nowo budowany
formularz może dziedziczyć własności odpowiedniego obiektu.
Każdy z elementów hierarchii klas formularzy projektu RENTMAN wyznacza typ
formularza, dla którego stanowi wzór. Wszystkie formularze, nawet te nie
związane z bazami danych, dziedziczą własności klasy AnyForm. Jest to
wierzchołek hierarchii. Wszystkie pozostałe obiekty RENTMAN dziedziczą
własności tej klasy. Pozwala to zapewnić konsekwencję w wyglądzie
i funkcjonalności formularzy. Klasa DatabaseForm gwarantuje z kolei, że
wszystkie związane z obsługą baz danych formularze będą zachowywać się
jednolicie. Jest to również prawdą dla innych klas formularzy; wszystkie służą za
pierwowzory formularzy, które dopełniają program RENTMAN.
284 Część II
Rysunek 9.2.
Hierarchia
formularzy
aplikacji
RENTMAN.
Początek tworzenia aplikacji
Po długim oczekiwaniu jesteśmy w końcu gotowi do rozpoczęcia budowy
aplikacji. Możemy wziąć pracowicie dotąd konstruowany projekt i wprowadzić go
w życie. Jak powiedzieliśmy wcześniej, nie ma jednej drogi prowadzącej do dobrej
aplikacji. Możemy próbować zmieniać niektóre rozwiązania projektu oraz decyzje
podjęte w tym i następnych rozdziałach. Nikt nie powinien czuć się nimi
ograniczony. Tylko nieliczne są kluczowe dla poprawnego działania programu,
większość wynika z przyjętych preferencji. Rozwiązania zawarte w tym
i następnych rozdziałach są próbą pokazania wielu różnorodnych narzędzi
możliwych do zastosowania w rzeczywistych systemach zarządzania bazami
danych typu klient/serwer. Każdy może szukać alternatywnych, lepszych dla niego
rozwiązań.
Tworzenie Aliasu BDE
Pierwszą rzeczą, konieczną do zrobienia przy tworzeniu aplikacji Delhi, jest
utworzenie aliasu BDE (Borland Database Engine), wskazującego na obsługiwaną
bazę danych. Oczywiście jeśli aplikacja wymaga dostępu do wielu baz danych, to
musimy utworzyć więcej aliasów.
Dla programu RENTMAN zdefiniujemy alias umożliwiający dostęp do bazy
danych InterBase utworzonej w rozdziale ósmym. Utworzony alias będzie
Pierwsze kroki 285
używany przez Delphi przy odwoływaniu się do fizycznej bazy danych naszej
aplikacji.
Delphi s Database Explorer (eksplorer baz danych Delphi) służy do wielu celów.
Tutaj użyjemy go do utworzenia aliasu BDE. Aby utworzyć alias BDE przy użyciu
eksplorera, należy wykonać następujące czynności:
1. Uruchomić Delphi i wybrać opcję Explore (eksploruj) z Database (baza
danych)
2. Wcisnąć przycisk Database w Database Explorer, jeśli nie jest już wybrany,
a potem wybrać hasło Databases na liście poniżej niego.
3. Prawym klawiszem myszy kliknąć polecenie Database, a następnie wybrać
opcję New (nowy) z kolejnego menu. W tym momencie rozpoczynamy
definicję nowego aliasu BDE.
4. Program zapyta o sterownik bazy danych dla nowego aliasu. Z listy należy
wybrać INTERBASE, a następnie wcisnąć klawisz OK.
5. Następnie program poprosi o określenie nazwy nowego aliasu. Wpisujemy
RENTMAN i wciskamy ENTER.
6. Kliknąć hasło SERVER NAME (nazwa serwera) w prawym okienku
i wprowadzić pełny adres utworzonej w rozdziale ósmym bazy danej
RENTMAN. Domyślną ścieżką jest C:\DATA\RENTMAN\RENTMAN.GDB.
Można kliknąć przycisk wielokropka (...) po prawej stronie polecenia, aby
wybrać ścieżkę dostępu przy pomocy myszy.
7. Wybrać polecenie USER NAME (nazwa użytkownika) i wprowadzić wiążącą
nazwę użytkownika InterBase (na przykład: sysdba).
8. Zmienić parametr ENABLE BCD na True (prawda).
9. Kliknąć przycisk Apply w pasku narzędziowym eksplorera (niebieska strzałka
skręcająca w prawo). W ten sposób trwale zachowujemy nową definicję aliasu.
Rysunek 9.3. ilustruje wygląd okna po utworzeniu aliasu w opisany wyżej sposób.
286 Część II
Rysunek 9.3.
Database
Explorer: wygląd
ekranu po
zdefiniowaniu
nowego aliasu.
OSTRZEŻENIE
Należy się upewnić, że parametr ENABLE BCD aliasu ma wartość True, co
umożliwia dostęp do tablic InterBase z polami numerycznymi (NUMERIC)
i dziesiętnymi (DECIMAL). Takie ustawienie wyłącza optymalizację, którą
normalnie BDE wykonuje na polach wymienionych typów, powodującą
traktowanie ich jako pól typu całkowitego (INTEGER). Optymalizacja polega na
tym, aby ze względu na szybkość traktować typy zmiennoprzecinkowe, które nie
mają cyfr po przecinku (z zerową częścią ułamkową), jako całkowite. Problem
wynika z faktu, że optymalizacja idzie zbyt daleko i dotyczy wszystkich pól
numerycznych (NUMERIC) oraz dziesiętnych (DECIMAL), nawet tych
z niezerową częścią ułamkową. W efekcie sterowniki udostępniania danych typu
DBEdit nie pozwalają wprowadzać liczb dziesiętnych do takich pól, gdyż traktują
je jako pola całkowite. Ustawienie parametru True umożliwia obejście problemu
poprzez wymuszenie traktowania typów zmiennoprzecinkowych jako liczb
dziesiętnych kodowanych dwójkowo, co likwiduje optymalizację całkowito-
liczbową.
Rozpoczęcie nowego projektu
Aby rozpocząć tworzenie nowego projektu należy zamknąć Eksplorer i powrócić
do Delphi, a następnie wybrać opcję File\New Application z głównego menu
programu. Delphi zaprezentuje nowy projekt i czysty formularz. Aby je zachować,
trzeba kliknąć opcję File\Save All. Akceptujemy zaproponowaną nazwę pliku-
Pierwsze kroki 287
Unit1, ale zmieniamy nazwę projektu na RENTMAN. Pliki zapisujemy w katalogu
założonym na potrzeby niniejszego przykładu (np. C:\DATA\DELPHI\
RENTMAN).
Konstruowanie modułu danych
Kolejny krok budowania programu RENTMAN polega na utworzeniu formularza
modułu danych. Moduł danych to specjalny typ formularza zaprojektowany do
przechowywania obiektów nie posiadających reprezentacji graficznej (na przykład
obiektów dostępu do baz danych). Moduły danych, prezentowane w tej książce, są
zorientowane na bazy danych, co oznacza, że przechowują wszystkie tabele.
W naszym przypadku moduł danych programu RENTMAN zawiera składniki
Table i DataSource dla wszystkich tabel systemu RENTMAN. Zaleca się, aby
utworzyć moduł danych dla wszystkich baz, do których chcemy mieć dostęp
z aplikacji Delphi. Mimo że nie ma potrzeby umieszczania w jednym module
wszystkich komponentów odwołujących się do danej bazy, to w miarę możliwości
należy tak robić, ponieważ można zachować moduł danych w składnicy obiektów
(Object Repository), gdzie jest dostępny dla innych aplikacji. Pomaga to zapewnić
zwartość całej aplikacji i umożliwia zmianę dostępu Delphi do konkretnej bazy
danych z najbardziej korzystnego punktu.
Pracę rozpoczynamy od wyboru opcji File\New Data Module (plik\nowy moduł
danych) z głównego menu Delphi. Pokaże się niewielki formularz, na którym
możemy umieścić komponenty. Następnie wybieramy własność Name (nazwa)
z inspektora obiektów (Object Inspektor) i zmieniamy ją na dmRentman.
W tym miejscu może zaistnieć potrzeba powiększenia okna, aby mieć miejsce na
łatwe operowanie kilkoma obiektami. Doprowadzenie do końca konfiguracji
modułu danych wymaga następujących czynności:
1. Wybrać stronę Data Access (dostęp do danych) z palety komponentów Delphi
i umieścić składnik Database we wnętrzu formularza.
2. Zmienić - przy pomocy inspektora obiektów - własność Aliasname (nazwa
aliasu) komponentu Database na odwołanie do aliasu utworzonego
wcześniej.
3. Zmienić własności obiektu DatabaseName i Name składnika Database na
dbRentman.
4. Umieścić we wnętrzu modułu po osiem komponentów Table (tabela) i osiem
DataSource (zródła danych).
288 Część II
WSKAZÓWKA
Możemy szybko wstawić różne kopie tego samego komponentu przez wciśnięcie
klawisza SHIFT przed wyborem składnika z palety. Za każdym razem, gdy
klikniemy wewnątrz formularza, otrzymamy kopię komponentu. Aby zakończyć
ten tryb powtarzalnego wklejania, należy wybrać ikonę ze wskaznikiem strzałki
położoną na lewo od palety komponentów.
5. Ustawić własność DataBaseName wszystkich ośmiu tabeli, aby wskazywała
na dbRentman- alias, który właśnie został zdefiniowany dla tej aplikacji.
WSKAZÓWKA
Można szybko zaznaczyć wiele komponentów jednocześnie. W tym celu należy
umieścić kursor myszy powyżej i na lewo skrajnego składnika. Następnie
wciskamy pierwszy przycisk myszy (lewy - domyślne ustawienie Windows)
i ciągniemy powstający prostokąt wyboru dotąd, aż otoczy zespół, który chcemy
wybrać. Po zwolnieniu przycisku właściwa grupa składników będzie zaznaczona.
6. Zmienić własności Name iTablename komponentów Table, zgodnie
z wykazem w tabeli 9.3.
Tabela 9.3. Komponenty i nazwy tabeli systemu RENTMAN
Name TableName
taTENANT
TENANT
taPROPERTY
PROPERTY
taLEASE
LEASE
taCALL
CALL
taWORDER
WORDER
taWODETAIL
WODETAIL
taEMPLOYEE
EMPLOYEE
taWORKTYPE
WORKTYPE
Pierwsze kroki 289
UWAGA
Może się pojawić okno dialogowe, które będzie zachęcało do wprowadzenia hasła
dostępu do bazy danych dbRENTMAN. Przy domyślnych ustawieniach nazwa
użytkownika brzmi SYSDBA, a hasło: masterkey. Wprowadzając hasło należy
pamiętać, aby było pisane małymi literami, po czym wcisnąć przycisk OK. Jeśli
popełnimy błąd przy próbie rejestracji, to serwer InterBase może się nie
uruchomić. W rozdziale ósmym opisana jest procedura włączania serwera.
Odnotujmy jeszcze, że umieszczając ikonę serwera InterBase w folderze
startowym (startup), spowodujemy automatyczne uruchomienie go w momencie
rozpoczęcia pracy Windows.
7. Ponownie zaznaczyć wszystkie osiem tabel i ustawić ich własność Active
(czynna) na True. Efektem tego jest otwarcie wszystkich tabel oraz ich
automatyczne otwieranie przez aplikacje używające modułu danych.
8. Po ustawieniu własności komponentów tabel, należy ustawić składniki
DataSource. Zmienić własności DataSet oraz Name komponentów
DataSource, zgodnie z poniższą listą:
DataSet Name
taTENANT dsTENANT
taPROPERTY dsPROPERTY
taLEASE dsLEASE
taCALL dsCALL
taWORDER dsWORDER
taWODETAIL dsWODETAIL
taEMPLOYEE dsEMPLOYEE
taWORKTYPE dsWORKTYPE
Rysunek 9.4. przedstawia skompletowany moduł danych.
Kolejnym etapem jest zachowanie powstałego modułu w składnicy obiektów
(Object Repository):
1. Z głównego menu Delphi wybieramy opcję File\Save i zachowujemy moduł
danych na dysku jako \DATA\DELPHI\RENTMAN\RENTDATA, zmieniając
nazwę katalogu zawierającego kod zródłowy aplikacji RENTMAN na
\DATA\DELPHI\RENTMAN.
2. Prawym przyciskiem myszy klikamy na module danych i wybieramy opcję Add
to Repository (dodaj do składnicy).
290 Część II
Rysunek 9.4
Ukończony moduł
danych systemu
RENTMAN.
3. Piszemy dmRENTMAN - w polu Title - oraz Data module form for the
RENTMAN database - w polu Description okna dialogowego Add to
Repository.
4. Z listy wyboru Page tego samego okna wybieramy: Data Modules, a następnie
wciskamy przycisk OK.
Rysunek 9.5. przedstawia okno dialogowe Add To Repository.
Rysunek 9.5.
Dodawanie
dmRENTMAN do
składnicy obiektów
(Object
Repository)
Pierwsze kroki 291
Od momentu dodania modułu danych dmRENTMAN do składnicy obiektów,
możemy go używać ilekroć potrzebujemy dostępu do bazy danych RENTMAN.
Tworzenie hierarchii formularzy
Jak wzmiankowano wcześniej, następnym etapem budowy aplikacji RENTMAN
jest utworzenie hierarchii formularzy. Będzie jej można używać przy tworzeniu
również innych systemów realizowanych przy pomocy Delphi. Przypomnijmy, że
tworzona przez nas hierarchia składa się z sześciu rodzajów formularzy:
formularza najwyższego poziomu, formularza bazy danych, formularza edycji,
formularza tabelarycznego, sterowalnego formularza tabelarycznego i formularza
kombinowanego (master-detail). Pracę rozpoczniemy od formularza najwyższego
poziomu.
Formularz najwyższego poziomu (AnyForm).
Wybieramy opcję menu File\Close, aby zamknąć wcześniej konstruowany moduł
danych, po czym klikamy na klawiszu New Form (lub wybieramy opcję New\Form
z menu File). Powinniśmy zobaczyć formularz o nazwie Form2. Ukształtujemy
ten formularz i zachowamy w składnicy obiektów jako klasę AnyForm.
Pierwszą część zadania wykonamy realizując następujący algorytm:
1. Zmienić własność Name formularza na fmAnyForm, a następnie własność
Position na poScreenCenter.
2. Ustawić własność AutoScroll na False.
3. Umieścić w formularzu trzy elementy sterujące (Panel) i rozmieścić je jeden
nad drugim, po czym nazwać je odpowiednio: paTop (panel górny),
paMiddle (środkowy) i paBottom (dolny).
4. Ustawić własność Align (wyrównanie) panela paTop na alTop oraz usunąć
wartość własności Caption (nagłówek).
5. Zmienić wielkość panela paTop, tak aby zajmował około 1/3 wysokości
formularza.
6. Ustawić własność Align (wyrównanie) panela paBottom na alBottom
oraz usunąć nagłówek.
7. Zmienić wielkość panela paBottom, tak by jego wysokość wynosiła około
40 pikseli.
8. Ustawić własność Align panela paMiddle na alClient, co spowoduje
wypełnienie pustej przestrzeni pomiędzy panelem górnym a panelem dolnym.
9. Usunąć wartość własności Caption elementu paMiddle.
292 Część II
Nie należy się dziwić takim wyglądem naszego pierwszego formularza - nie
wszystkie projektowane formularze będą się składały z trzech części, ale
większość tak. Również ustawienie własności Position zapewnia logiczny
kształt wszystkich formularzy. Jak wygląda nowy formularz, ilustruje rysunek 9.6.
Po zaprojektowaniu klasy AnyForm należy ją w następujący sposób zachować
w składnicy obiektów (Object Repository):
1. Wybrać opcję File\Save i zachować formularz pod nazwą ANYFORM.PAS
w zródłowym katalogu RENTMAN.
2. Dwukrotnie kliknąć na formularzu i wybrać opcję Add to Repository.
3. W odpowiednich polach okna dialogowego wprowadzić wartości fmAnyForm
jako tytuł formularza oraz Top-level generic form class (ogólna
klasa formularzy najwyższego poziomu) jako jego opis.
4. Z listy rozwijalnej własności Page wybrać wartość Form, następnie kliknąć
klawisz OK. Wypełnione okno dialogowe ilustruje rysunek 9.7.
Rysunek 9.6.
Całkowicie
skompletowana
klasa AnyForm.
Pierwsze kroki 293
Rysunek 9.7.
Dodawanie klasy
formularzy
AnyForm do
składnicy obiektów
(Object
Repository).
Formularz bazy danych (DatabaseForm)
Przy pomocy opisanej niżej procedury skonstruujemy klasę DatabaseForm:
1. Wybrać z menu opcję File\New, a następnie opcję Forms.
2. Kliknąć ikonę fmAnyForm na stronie Forms, po czym wybrać opcję Inherited
(odziedziczony) w polu wyboru na dole okna dialogowego.
3. Wybierając OK, utworzyć nowy formularz. Powinien ukazać się formularz
o nazwie fmAnyForm1. Odnotujmy, że dziedziczy on wszystkie widoczne
atrybuty klasy fmAnyForm.
4. Zmienić nazwę formularza (własność Name) na fmDataBaseForm.
5. Kliknąć na dolnym panelu, wstawić do niego po lewej stronie komponent
DBNavigator.
6. Ponownie zaznaczyć panel dolny i umieścić po jego prawej stronie czwarty
komponent typu Panel.
7. Odpowiednio ustawić własności nowego panela: Name na paRight, Align
na alRight oraz BevelOuter na bvNone.
8. Usunąć nagłówek elementu paRight i przeciągnąć jego lewą krawędz do
prawego brzegu elementu DBNavigator.
9. W obszarze paRight umieścić jeden obok drugiego dwa komponenty
BitBtn. Lewy klawisz należy ustawić jak najbliżej lewej krawędzi obiektu
paRight, a prawy bezpośrednio obok.
294 Część II
10. Zmienić wielkość elementu paRight, tak aby swobodnie mieściły się w nim
dwa nowe przyciski.
11. Ustawić własność Kind lewego przycisku na bkOK, a prawego na
bkCancel.
12. Nazwać przyciski OK oraz Cancel odpowiednio: bbOK i bbCancel.
13. Dwukrotnie kliknąć na komponencie bbOK i wpisać następujący kod do
procedury obsługi zdarzenia OnClick:
If (DBNavigator1.DataSource.State in [dsEdit, dsInsert])
Ą' then DBNavigator1.DataSource.DataSet.Post;
Close.
14. Dwukrotnie kliknąć na komponencie bbCancel i wpisać następujący kod do
procedury obsługi zdarzenia OnClick:
Close;
Powoduje to zamknięcie formularza po przyciśnięciu klawisza Cancel.
Ponieważ procedura nie ma wpływu na zmiany bazy danych, należy jeszcze
obsłużyć zdarzenie OnClose.
15. W inspektorze obiektów wybrać fmDatabaseForm, a następnie dwukrotnie
kliknąć zdarzenie OnClose na stronie Events. Wpisać następujący kod do
procedury obsługi zdarzenia OnClose formularza fmDatabaseForm:
If (DBNavigator1.DataSource.State in [dsEdit,
dsInsert]) then
DBNavigator1.DataSource.DataSet.Cancel;
Zapewni to zaniechanie wprowadzania jakichkolwiek zmian do bieżącego
rekordu, jeśli opuszczamy formularz inaczej niż poprzez wciśnięcie klawisza
OK. Oznacza to, że jeśli zamkniemy formularz klawiszem Cancel,
wyłącznikiem okna lub po prostu wyłączymy aplikację, to żadne zmiany
w aktualnie edytowanym rekordzie nie zostaną zachowane.
Po wykonaniu powyższych czynności klasa formularzy DatabaseForm jest
gotowa. Wybierając opcję File\Save zachowujemy zbiór pod nazwą
DBFORM.PAS w zródłowym katalogu RENTMAN. Rysunek 9.8. Ilustruje
zaprojektowany formularz.
Pierwsze kroki 295
Rysunek 9.8.
Skompletowana
klasa
DatabaseForm
Wprowadzenie czwartego panela do wnętrza obiektu paBottom służy temu, aby
klawisze OK i Cancel znajdowały się w prawym dolnym narożniku formularza,
niezależnie od jego położenia i wielkości. Ponieważ panel jest ściśle związany
z prawą stroną formularza, a przyciski są jego elementami, więc ich położenie
w oknie będzie stałe.
Pozostaje jedynie zachować nowy element w składnicy obiektów. Podwójnie
klikamy na formularzu i wybieramy opcję Add to Repository. W odpowiednich
polach okna dialogowego wprowadzamy wartości fmDatabaseForm - jako tytuł
formularza - oraz Generic database form class (ogólna klasa
formularzy bazy danych) - jako jego opis. Z listy rozwijalnej własności Page
wybieramy Forms, następnie wciskamy klawisz OK.
Formularz edycji (EditForm)
Kolejną klasą jest EditForm. Będzie podstawą formularzy do edycji danych
zawartych w jednym rekordzie pojedynczej tabeli. Dziedziczy ona elementy
zdefiniowanej wyżej klasy fmDatabaseForm. Poniższe kroki posłużą do jej
zdefiniowania:
1. Wybrać opcję menu File\New, a następnie Forms. Kliknąć ikonę
fmDatbaseForm.
2. Kliknąć przycisk opcji Inherit i zatwierdzić klawiszem OK. Powinien się ukazać
formularz o nazwie fmDatabaseForm1.
3. Zmienić nazwę formularza (własność Name) na fmEditForm.
296 Część II
4. Zmienić rozmiar panela górnego (paTop), tak by panel środkowy przybrał
rozmiary podobne do panela dolnego. W formularzach dziedziczących
własności dbEditForm, na panelu górnym będziemy umieszczać narzędzia
edycyjne danych, takie jak DBEdit czy DBComboBox.
5. Kliknąć na panelu środkowym i umieścić na nim trzy przyciski. Nadać im
kolejno nazwy: btAdd, btEdit i btDelete.
6. Ustawić własność Caption (nagłówek) poszczególnych przycisków
odpowiednio na: &Add, &Edit i &Delete. Zauważmy, że znak & jest
operatorem wyznaczającym literę szybkiego dostępu do funkcji.
7. Kliknąć dwukrotnie na przycisku btAdd i wpisać kod obsługi zdarzenia
OnClick: DBNawigator1.BtnClick(nbInsert);
8. Kliknąć dwukrotnie na przycisku btEdit i wpisać kod obsługi zdarzenia
OnClick: DBNawigator1.BtnClick(nbEdit);
9. Kliknąć dwukrotnie na przycisku btDelete i wpisać kod obsługi zdarzenia
OnClick: DBNawigator1.BtnClick(nbDelete);
Ustawienie tych klawiszy, tak aby symulowały zdarzenia polegającego na
wciśnięciu odpowiedniego przycisku elementu DBNavigator powoduje, że
kliknięcie któregokolwiek z nich jest równoważne wybraniu odpowiedniego
przycisku elementu DBNavigator - nawet jeżeli pózniej zmodyfikujemy
działanie tego klawisza w formularzu potomnym fmEditForm.
Wykonanie powyższych czynności kończy definiowanie klasy EditForm. Teraz
należy wybrać opcję menu File\Save i zachować fmEditForm pod nazwą
EDITFORM.PAS, w zródłowym katalogu RENTMAN. Rysunek 9.9. ilustruje
kompletny formularz.
Pozostaje jeszcze zachować wzór formularza w składnicy obiektów, nadając mu
tytuł fmEditForm i opis Generic database edit form class
(ogólna klasa formularzy edycji bazy danych). Należy zachować go na stronie
formularzy (Forms).
Pierwsze kroki 297
Rysunek 9.9.
Skompletowana
klasa EditForm.
Formularz tabelaryczny (GridForm)
Ten typ formularza, dziedziczący wygląd z klasy EditForm, umożliwia
jednoczesne wyświetlanie wielu linii, przy czym każdy rekord bazy danych będzie
zajmował jeden wiersz ekranu. Aby zdefiniować klasę fmGridForm, należy
wykonać następujące polecenia:
1. Z głównego menu wybrać opcję File\New, a następnie zaznaczyć formularz
fmEditForm na liście wyboru New Items strony formularzy (Forms).
2. Kliknąć opcję Inherit i zatwierdzić przyciskiem OK. . Powinien ukazać się
formularz o nazwie fmEditForm1.
3. Zmienić nazwę formularza na fmGridForm.
4. Zaznaczyć panel górny i umieścić na nim komponent DBGrid (znajduje się on
na stronie palety komponentów Delphi o nazwie Data Controls).
5. Ustawić własność Align na alClient, co spowoduje zajęcie przez element
całej wolnej przestrzeni panela.
6. W inspektorze obiektów wybrać fmGridForm i dwukrotnie kliknąć zdarzenie
OnShow na stronie Events (zdarzenia). Wpisać następujący kod do procedury
obsługi zdarzenia OnShow formularza fmGridForm:
If (DBGrid1.DataSource=nil) then
DBGrid1.DataSource:=DBNavigator1.DataSource;
298 Część II
Ta procedura powoduje, że jeśli nie zdefiniujemy zródła danych dla
skonstruowanego właśnie komponentu, to będzie korzystał ze zródła danych
przypisanego do elementu DBNavigator. Oznacza to, że w formularzach
potomnych klasy fmGridForm wystarczy ustawić parametr DataSource dla
komponentu DBNavigator.
W ten sposób kończy się definiowanie klasy fmGridForm. Zachowujemy ją
w katalogu zródłowym RENTMAN pod nazwą GRIDFORM.PAS. Rysunek 9.10.
ilustruje skonstruowany typ formularza. Należy zachować go w składnicy
obiektów nadając mu tytuł fmGridForm, opis Generic database grid
edit form class (ogólna klasa siatkowych formularzy edycji bazy danych)
oraz umieszczając na stronie Forms.
Rysunek 9.10.
Skompletowana
klasa GridForm.
Sterowalny formularz tabelaryczny (GridForm)
Następna klasa formularzy, którą zdefiniujemy, również dziedziczy własności
z EditForm. Ułatwi ona wyświetlanie wielu rekordów jednej tablicy,
umożliwiając pokazanie każdego z nich w kilku wierszach. Główna różnica
między definiowaną klasą a typem zdefiniowanym poprzednio polega na
zastosowaniu komponentu DBCtrlGrid zamiast DBGrid. Aby utworzyć nowy
rodzaj formularza, należy wykonać następujące czynności:
1. Z głównego menu wybrać opcję File\New, a następnie wybrać formularz
fmEditForm na stronie formularzy (Forms) okna dialogowego New Items.
Kliknąć opcję Inherit i zatwierdzić przyciskiem OK. Powinien ukazać się
Pierwsze kroki 299
formularz o nazwie fmEditForm1. Zmienić mu nazwę na
fmControlGridForm.
2. Zaznaczyć panel górny i umieścić na nim komponent DBCtrlGrid (znajduje
się na stronie Data Controls palety elementów sterujących Delphi).
3. Ustawić własność Align składnika DBCtrlGrid na alClient, co
spowoduje zajęcie przez element całej wolnej przestrzeni panela.
4. W inspektorze obiektów wybrać fmControlGridForm i dwukrotnie kliknąć
zdarzenie OnShow na stronie Events (zdarzenia). Wpisać następujący kod do
procedury obsługi zdarzenia OnShow formularza fmControlGridForm:
If (DBCtrlGrid1.DataSource=nil) then
DBCtrlGrid1.DataSource:=DBNavigator1.DataSource;
Ten fragment kodu powoduje, że jeśli nie zdefiniujemy zródła danych dla
skonstruowanego właśnie komponentu, to będzie korzystał ze zródła danych
przypisanego do elementu DBNavigator. Oznacza to, że w formularzach
potomnych klasy fmGridForm wystarczy ustawić parametr DataSource
dla elementu DBNavigator.
Definiowanie klasy fmControlGridForm jest zakończone. Zachowujemy ją
w katalogu zródłowym RENTMAN pod nazwą CGDFORM.PAS. Rysunek 9.11.
ilustruje skonstruowany typ formularza. Należy zachować go w składnicy
obiektów, nadając mu tytuł fmcontrolGridForm, opis Generic database
control grid edit form class (ogólna klasa siatkowych formularzy
edycji bazy danych) oraz umieszczając na stronie Forms.
Rysunek 9.11.
Skompletowana
klasa
ControlGridForm.
300 Część II
Formularz kombinowany (MasterDetailForm)
Ostatnią klasą formularzy w naszej hierarchii jest typ kombinowany
(MasterDetailForm). Jak poprzednie, dziedziczy własności klasy
Databaseform i umożliwia wyświetlanie oraz edycję dwóch tabel połączonych
ze sobą relacją. Różni się od formularzy typu DatabaseForm tym, że zawiera na
panelu środkowym element DBGrid, co umożliwia wyświetlanie rekordów tabeli
podrzędnej. W tym samym czasie na panelu górnym będą wyświetlane rekordy
tabeli nadrzędnej. Konstrukcja opisanego typu formularza przebiega następująco:
1. Z głównego menu wybrać opcję File\New, a następnie zaznaczyć formularz
fmDatabaseForm na stronie formularzy (Forms) okna New Items. Kliknąć
opcję Inherit i zatwierdzić przyciskiem OK. Powinien ukazać się formularz
o nazwie fmDatabaseForm1.
2. Zmienić nazwę formularza na fmMasterDetailForm.
3. Zmienić rozmiar panelu górnego, aby zajmował około połowy wysokości
przeznaczonej dotąd dla panelu środkowego.
4. Zaznaczyć panel środkowy i umieścić na nim komponent DBGrid (znajduje się
on na stronie Data Controls palety komponentów).
5. Ustawić własność Align składnika DBGrid na alClient, co spowoduje
zajęcie przez element całej wolnej przestrzeni panela środkowego.
Jak zwykle zapisujemy formularz w katalogu zródłowym RENTMAN pod nazwą
MSTRFORM.PAS. Rysunek 9.12. ilustruje skonstruowany typ formularza. Należy
zachować go na stronie Forms w składnicy obiektów, nadając mu tytuł
fmMasterDetailForm oraz opis Generic database master-detail
form class (ogólna klasa formularzy master-detail ).
Pierwsze kroki 301
Rysunek 9.12.
Skompletowana
klasa
MasterDetailForm.
Przyszłe formularze
Po skonstruowaniu klas bazowych i ich hierarchii jesteśmy gotowi do
konstruowania prawdziwych formularzy. Prawie wszystkie, które będziemy
tworzyć dla potrzeb aplikacji RENTMAN, będą dziedziczyć własności jednego ze
zdefiniowanych typów.
WSKAZÓWKA
Utworzony moduł danych i hierarchię formularzy można zachować jako odrębny
projekt, który pózniej łatwo wykorzystać i opracowywać jego elementy.
Atrakcyjność i poręczność takiego rozwiązania wynika z niemożności otwarcia
w Delphi pojedynczego formularza bez jego klas nadrzędnych. Dotyczy to
zarówno obiektów dodanych do bieżącego projektu jak i tych, które dopiero
zostaną zbudowane.
Aby zachować formularze jako samodzielny projekt, należy zapisać go pod
jakąkolwiek nazwą - np. FORMREPO (od form repository project).
Rekomendowanym sposobem jest zachowanie projektu w katalogu, w którym już
znajdują się formularze. Formalnie, aby uniknąć zachowania w swojej składnicy
domyślnie utworzonego obiektu Unit1, można usunąć go z projektu przed
zapisaniem na dysk.
302 Część II
Konstruowanie głównego okna programu
Kolejnym etapem budowy aplikacji jest skonstruowanie głównego okna aplikacji.
Ponieważ chcemy, aby wszystkie formularze zawarte w głównym oknie
dziedziczyły własności klasy fmAnyForm, to nie wolno nam korzystać
z domyślnego formularza projektu: Unit1. Należy go zamknąć i usunąć
z budowanej aplikacji.
Zanim rozpoczniemy właściwą pracę, musimy zachować projekt na dysku pod
nazwą RENTMAN.DPR. Poniższe czynności doprowadzą do skonstruowania
głównego okna programu:
1. Wybrać opcję File\New, a następnie Forms. Tworzymy formularz klikając
kolejno: klasę fmAnyForm, Inherit oraz OK. Powinien ukazać się
formularz o nazwie fmAnyForm1.
2. Nazwać projektowany obiekt fmRSYSMAN0 oraz wprowadzić nagłówek:
RENTMAN Rental Menagment System (system zarządzania wynajmem).
3. Wybrać opcję Project\Option\Forms i zmienić główny formularz aplikacji
RENTMAN na fmRSYSMAN. Zamknąć otwarte okno dialogowe klawiszem
OK.
4. Ustawić własność WindowState na wsMaximized, a Position na
poDesigned. Dzięki temu po uruchomieniu programu, okno zajmie cały
ekran.
5. Zmniejszyć panele górny i dolny, tak aby ich wysokości wynosiły około 30
pikseli. Z panela górnego zrobimy pasek narzędzi, a z dolnego linię statusu.
6. Umieścić komponent MainMenu gdziekolwiek na formularzu i nazwać go
mmRentMan; po zaprojektowaniu będzie pełnił rolę głównego menu programu.
Aby uruchomić narzędzia do projektowania menu, należy dwukrotnie kliknąć
na obiekcie MainMenu.
Konstruowanie głównego menu aplikacji wymaga zrealizowania następujących
działań:
1. Dodać do menu opcję File przez opisanie nagłówka (własność Caption)
domyślnej pozycji menu tekstem &File. Symbol & wyznacza literę
szybkiego dostępu.
2. Ustawić pierwszą opcję podmenu File, nadając jej nagłówek &Log a call
i przypisać jej F2 jako klawisz skrótu. W ten sam sposób definiujemy wszystkie
elementy menu File. Zawartość menu przedstawia tabela 9.4.
Pierwsze kroki 303
Tabela 9.4. Elementy menu File programu RENTMAN.
Nagłówek Klawisz skrótu
&Log a Call
F2
&Print Setup
brak
E&xit
brak
3. Do głównego menu (na głównym poziomie) dodać opcję Tables (tabele),
ustawiając jej nagłówek &Tables. Dodać elementy menu zgodnie z tabelą 9.5.
Tabela 9.5. Elementy menu File programu RENTMAN.
Nagłówek Klawisz skrótu
&Calls
F3
&Property
F4
&Tenants
F5
&Leases
F6
&Work Orders
F7
&Employes
F8
W&ork Types
F9
4. Na głównym poziomie menu dodać pozycję Reports (raporty) (nadając jej
nagłówek &Reports), a następnie zdefiniować jej elementy zgodnie z tabelą
9.6.
Tabela 9.6. Elementy menu Reports programu RENTMAN.
Nagłówek Klawisz skrótu
&Work Order
brak
&Lease
brak
&Task List
brak
5. Poprzez wpisanie nagłówka &Help do pustej pozycji na prawo od elementu
Reports umieścić opcję Help w głównym menu aplikacji.
6. W menu Help umieścić opcje Contents (spis treści) oraz About (o..), nadając im
odpowiednio nagłówki &Contents i &About.
7. Zamknąć narzędzie do tworzenia menu.
304 Część II
Rysunek 9.13. ilustruje skompletowane menu główne.
Rysunek 9.13.
Gotowe główne
menu programu.
Przyciski szybkiego dostępu
Utworzymy teraz przyciski szybkiego dostępu, aby umożliwić łatwy dostęp do
najczęściej używanych funkcji programu. W tym celu należy:
1. Zaznaczyć górny panel i umieścić na nim jeden obok drugiego sześć
komponentów SpeedButton.
2. Zaznaczyć całą szóstkę jednocześnie i wcisnąć prawy przycisk myszy, aby
wyświetlić menu.
3. Kliknąć opcję Align.. i wybrać Space equally na okienku Horizontal oraz
Tops na okienku Vertical, po czym zatwierdzić przyciskiem OK.
4. Klawisze szybkiego dostępu nazwać kolejno: sbLogCall, sbProperty,
sbTenants, sbLeases, sbWorkOrders i sbPrintsetup.
5. Przyciski można oznaczyć różnymi ideogramami. Delphi dostarcza wielu
symboli, które mogą okazać się użyteczne. Odpowiednie rysunki znajdują się
w katalogu ..images\buttons, zawartym w kartotece programu Delphi.
Można wykorzystać propozycje zawarte w tabeli 9.7.
Pierwsze kroki 305
Tabela 9.7. Proponowane symbole przycisków szybkiego dostępu.
Przycisk ideogram
sbLogCall Phonerng.bmp
sbProperty Doorshut.bmp
sbTenants Picture.bmp
sbLeases Report.bmp
sbWorkOrders Tools.bmp
sbPrintSetup Printer.bmp
Po dodaniu powyższych klawiszy trzeba jeszcze umieścić po prawej stronie paska
przycisk pomocy. W tym celu należy:
1. Zaznaczyć panel górny i umieścić na jego prawej części komponent Panel.
2. Usunąć nagłówek nowego obiektu i ustawić własność BevelOuter na
bvNone.
3. Ustawić własność Align na alRight oraz nazwać panel paRight.
4. Rozmiar panela powinien być trochę większy od domyślnej wielkości
przycisków.
5. Umieścić komponent SpeedButton na panelu paRight.
6. Nowy przycisk nazwać sbHelp, przyporządkować mu symbol Help.bmp (z
katalogu ..images\buttons). Ponieważ paRight jest związany z prawą
krawędzią formularza, to przycisk pomocy będzie zawsze znajdował się we
właściwym miejscu. Rysunek 9.14 pokazuje formularz wraz z przyciskami
w głównym oknie programu.
UWAGA
Zamiast samodzielnie składać pasek narzędziowy, można użyć jednego
z komponentów Coolbar lub Toolbar (znajdujących się na palecie Win32).
Nie wszystkie systemy mogą z nich korzystać, gdyż wymagają nowej biblioteki
CTL3D32.DLL. Poza tym nie można wykorzystać map bitowych opisanych
w tabeli 9.7, gdyż w inny sposób przyporządkowują przyciskom odpowiednie
symbole. Wydaje się godnym polecenia, aby używać sposobu działającego
niezależnie od platformy, na której uruchomiono system i pozwalającego
wykorzystać kolekcję map bitowych z galerii Delphi.
306 Część II
Rysunek 9.14.
Pasek szybkiego
dostępu programu
RENTMAN
Linia statusu
Ostatnim elementem głównego okna aplikacji, jaki pozostał do wykonania, jest
linia statusu. Aby ją skonstruować należy:
1. Zaznaczyć panel dolny i umieścić na nim komponent StatusBar (znajdujący
się na stronie z paletą komponentów Win32).
2. Nowy element nazwać stRentman i ustawić własność Align na
alClient.
3. Dwukrotnie kliknąć na własności Panels komponentu StatusBar i dodać
trzy panele do listy.
4. Ustawić własność Text pierwszego panela na Status, drugiego na User,
a trzeciego na Version.
5. Ustawić szerokość panela Status (własność Width) na 275, a paneli User
i Version na 150. Zatwierdzić przyciskiem OK.
Gotowe okno główne przedstawia rysunek 9.15.
Pierwsze kroki 307
Rysunek 9.15.
Główne okno
programu
RENTMAN.
Testowanie głównego okna aplikacji
Przyszła pora, aby zobaczyć jak zaprojektowane okno sprawdzi się w działaniu.
Zanim jednak cokolwiek zrobimy, musimy zachować projekt, by jeśli pojawią się
problemy, nie utracić wyników pracy. Program wraz z wszystkimi niezbędnymi
plikami zapisujemy na dysku albo poprzez kliknięcie przycisku Save Project, albo
wybierając opcję Save\All z głównego menu Delphi. Główny plik należy zachować
pod nazwą RSYSMAN0.PAS.
UWAGA
Może zaistnieć konieczność ręcznego dodania modułu DB w deklaracji Uses
modułów, które odwołują się do własności State. State jest typem
wyliczeniowym, zawierającym wartości takie, jak dsInsert, dsEdit itd.
Zdarzały się dziwaczne sytuacje, kiedy wbrew zasadom Delphi nie dodawał
automatycznie wymienionego modułu. Jeśli otrzymamy komunikat kompilatora, że
określone wartości stanu (State s enumerated values) są nieznane, to należy
ręcznie dołączyć moduł DB do deklaracji Uses.
Po zachowaniu projektu pozostaje wcisnąć przycisk Run lub klawisz F9 - celem
uruchomienia aplikacji i sprawdzenia działania jej głównego okna. Jeżeli
zostaniemy poproszeni o przedstawienie się, to należy użyć identyfikatora i hasła,
które zostały określone w czasie definiowania bazy danych RENTMAN
(domyślnie SYSDBA i masterkey). Rysunek 9.16. ilustruje wygląd interfejsu
fmRSYSMAN w czasie pracy programu.
308 Część II
UWAGA
Przed uruchomieniem aplikacji należy się upewnić, że działa server InterBase.
W przeciwnym razie nie będzie można uruchomić programu.
Rysunek 9.16.
Pierwsze
uruchomienie
programu
RENTMAN.
Wyszukiwarka
Podobne podstrony:
haasPl roz09roz09roz09 (3)roz09więcej podobnych podstron