background image

 

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 

background image

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 

background image

 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. 

background image

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

background image

 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 

background image

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. 

background image

 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. 

background image

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. 

background image

 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. 

background image

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. 

background image

 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). 

background image

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 

background image

 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). 

background image

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) 

background image

 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

background image

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. 

background image

 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). 

background image

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. 

background image

 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 

background image

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). 

background image

 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. 

background image

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 

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. 

background image

 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. 

background image

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 ). 

background image

 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. 

background image

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. 

background image

 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.  

background image

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. 

background image

 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. 

background image

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

 

Version

 na 150. Zatwierdzić przyciskiem 

OK

Gotowe okno główne przedstawia rysunek 9.15. 

 

Rysunek 9.14. 
Pasek szybkiego 
dostępu programu 
RENTMAN 

background image

 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. 

background image

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.