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óźniej, 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.
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
Rysunek 9.1.
Model procesu
wynajmu (lease)
programu
RENTMAN,
zawierający
przypisy
o obiektach.
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
transakcji
formularz SDI
Główna menu
systemu
fmRCALEDT0
wprowadzanie
danych
formularz szybkiego
wprowadzania danych
(quick-entry)
formularz
wprowadzania
i edycji danych ze
zbioru CALL
fmRCALGRD0
przetwarzanie
transakcji
sterowalny formularz
tabelaryczny (control
grid form)
formularz
tabelaryczny do
przeglądania listy
zbioru CALL
fmRWORMDE0
przetwarzanie
transakcji
formularz (master-
detail)
kombinowany
formularz do
analizy listy prac
fmRWORGRD0
przetwarzanie
transakcji
formularz tabelaryczny
(grid form)
formularz listy prac
fmREMPENT0
wprowadzanie
danych
formularz szybkiego
wprowadzania danych
(quick-entry)
formularz do
szybkiego
wprowadzania
danych
o pracownikach
fmREMPGRD0
przetwarzanie
d
h
formularz tabelaryczny
( id f
)
formularz
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
danych
formularz tabelaryczny
(grid form)
formularz
tabelaryczny do
przeglądania
i edycji rodzajów
pracy
fmRWKTENT0
wprowadzanie
danych
formularz szybkiego
wprowadzania danych
(quick-entry)
formularz do
szybkiego
wprowadzania
danych o rodzaju
pracy
fmPROCGD0
przetwarzanie
danych
sterowalny formularz
tabelaryczny (control
grid form)
Sterowalny
formularz
tabelaryczny tabeli
WŁAŚCIWOŚCI
(PROPERTY)
fmRTENCGD0
przetwarzanie
danych
sterowalny formularz
tabelaryczny (control
grid form)
Sterowalny
formularz
tabelaryczny tabeli
NAJEMCY
(TENANT)
fmRLEAGRD0
przetwarzanie
danych
formularz tabelaryczny
(grid form)
formularz
tabelaryczny tabeli
DZIERŻAWA
(LEASE)
rpRLEAPRT0
raport
formularz raportu (form
report)
oficjalny raport
dotyczący
wynajmu
rpRWORD0
raport
formularz raportu (form
report)
formularz listy prac
przydzielonych
pracownikom
rpRTSKLST0
raport szczegółowy raport
(detail report)
raport o bieżących
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
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
Rysunek 9.2.
Hierarchia
formularzy
aplikacji
RENTMAN.
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
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-
Rysunek 9.3.
Database
Explorer: wygląd
ekranu po
zdefiniowaniu
nowego aliasu.
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
(źró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 wskaźnikiem 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
i
Tablename
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 źró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
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.4
Ukończony moduł
danych systemu
RENTMAN.
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 źró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
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ędź 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.
Rysunek 9.7.
Dodawanie klasy
formularzy
AnyForm do
składnicy obiektów
(Object
Repository).
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
źródłowym katalogu RENTMAN. Rysunek 9.8. Ilustruje
zaprojektowany formularz.
Pierwsze
kroki
295
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
.
Rysunek 9.8.
Skompletowana
klasa
DatabaseForm
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óźniej 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 źró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
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;
Rysunek 9.9.
Skompletowana
klasa EditForm.
298
Część II
Ta procedura powoduje, że jeśli nie zdefiniujemy źródła danych dla
skonstruowanego właśnie komponentu, to będzie korzystał ze źró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 źró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
.
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ę
Rysunek 9.10.
Skompletowana
klasa GridForm.
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 źródła danych dla
skonstruowanego właśnie komponentu, to będzie korzystał ze źró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 źró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 źró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
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óźniej ł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.
Rysunek 9.12.
Skompletowana
klasa
MasterDetailForm.
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.
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.
Rysunek 9.13.
Gotowe główne
menu programu.
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
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.
Rysunek 9.14.
Pasek szybkiego
dostępu programu
RENTMAN
Pierwsze
kroki
307
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.
Rysunek 9.15.
Główne okno
programu
RENTMAN.
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.