10 rozdzial 09 WHOZPMRNMHSN32O4 Nieznany

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

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

i

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.


Wyszukiwarka

Podobne podstrony:
10 Rozdzial 09 D5PNIZIF53L56XMN Nieznany
10 rozdzial 09 zebky4722c64adug Nieznany (2)
10 Rozdział 09 Mnożenie szeregów Szeregi podwójne
09 rozdzial 09 DPF5CWQOY4VJC77Q Nieznany (2)
10 Rozdział 09 Mnożenie szeregów Szeregi podwójne
09 08 Rozdzielnice budowlane RB Nieznany (2)
10 rozdzial 10 T4V5BT7NMECVJO7Y Nieznany
311[10] Z1 09 Wykonywanie pomia Nieznany (2)
09 rozdzial 08 4sgpmlmyclqg6hyv Nieznany (2)
rozdzial 10 zadanie 09
09 Rozdziae 08id 7995 Nieznany
09 rozdzial 08 63dkeu7shlz4usq4 Nieznany
09 08 Rozdzielnice budowlane RB Nieznany (2)
1996 10 26 praid 18571 Nieznany
Ir 1 (R 1) 127 142 Rozdział 09
05 rozdzial 04 nzig3du5fdy5tkt5 Nieznany (2)
10 Poslugiwanie sie dokumentacj Nieznany
Cwiczenia nr 10 (z 14) id 98678 Nieznany

więcej podobnych podstron