04.Rozdział 03.pdf

(248 KB) Pobierz
33670584 UNPDF
Rozdział 3
Elementy składowe aplikacji
Książka niniejsza nie jest przeznaczona dla początkujących, autor uznał jednak za
stosowne zamieścić tutaj zwięzłe omówienie elementów, z których składa się
każda aplikacja Delphi. Czytelnicy mogą dysponować doświadczeniami
wyniesionymi z kontaktów z innymi narzędziami programistycznymi, znacząco
różniącymi się od Delphi. W takim przypadku zbiór podstawowych informacji
o języku i środowisku Delphi pozwoli im lepiej przyswoić dalsze części książki.
Czytelnicy, którzy znają już Delphi i samodzielnie tworzyli aplikacje w tym
środowisku, mogą pominąć niniejszy rozdział i od razu przejść do rozdziału 4,
„Konwencje”.
Bieżący rozdział prezentuje koncepcję projektów i bibliotek Delphi. Zaznajamia
ponadto z elementami języka Object Pascal: modułami (ang. unit ), formularzami,
modułami danych i dołączanymi plikami źródłowymi (ang. include files ). Ponadto
zawarto w nim omówienie komponentów Delphi, stanowiących kluczowy element
każdej aplikacji Delphi.
Czym są projekty?
Termin „projekt” może mieć różne znaczenia, w zależności od używanego
narzędzia programistycznego. Zazwyczaj projektem nazywa się nadrzędną
strukturę, grupującą wszystkie obiekty tworzące aplikację. Główną funkcją takiej
struktury jest ustanawianie wzajemnych relacji między tymi obiektami.
Pojedynczy projekt służy z reguły za „magazyn” obiektów, należących do jednej
aplikacji. Oczywiście występują wyjątki od tej reguły. Czasami na aplikację składa
się kilka projektów. Może się również zdarzyć, że jeden projekt obejmuje kilka
aplikacji. Jednak w przypadku większości narzędzi programistycznych z pojedyn-
czego projektu generowany jest jeden wynikowy plik wykonywalny.
Projekty Delphi
W przypadku Delphi projekt zawiera listę wszystkich plików, które składają się na
jedną aplikację. Projekty Delphi wyróżniają się tym, że poza wyszczególnieniem
w nich plików źródłowych aplikacji, same także mają postać tekstu źródłowego
programu. Oznacza to, iż projekt Delphi jest programem napisanym w języku
Object Pascal, dającym się w razie potrzeby przeglądać i modyfikować.
33670584.003.png
74
Część I
UWAGA:
Możliwe jest wprawdzie ręczne modyfikowanie projektów Delphi, należy jednak
zdecydowanie unikać samodzielnego wprowadzania zmian. Delphi w trakcie pracy
nad aplikacją modyfikuje części pliku, dlatego użytkownik nie powinien zmieniać
go niezależnie, na własną rękę. Wprowadzona zmiana może zmylić Delphi; z kolei
Delphi może zamazać zmiany wpisane przez użytkownika.
Projekty Delphi mają postać tekstu programu i przechowywane są przez system
operacyjny jako pliki. Dlatego też ograniczenia co do nazw projektów, pokrywają
się z ograniczeniami nazw wszelkich identyfikatorów w języku Object Pascal.
Nazwy projektów i modułów muszą rozpoczynać się literą i mogą zawierać litery,
cyfry i znaki podkreślenia. Nie są dozwolone spacje i kropki. Listing 3.1
przedstawia niewielki plik projektu Delphi.
UWAGA:
Oczywiście maksymalna długość nazwy pliku projektu ograniczona jest z drugiej
strony przez system operacyjny. Niektóre sieciowe systemy operacyjne,
w szczególności NetWare 3.x, nie dopuszczają stosowania długich nazw plików.
To samo ograniczenie obowiązuje w niektórych systemach kontroli wersji. Przy
nadawaniu nazw plikom należy zatem brać pod uwagę również takie zewnętrzne
ograniczenia.
Listing 3.1. Plik projektu RENTMAN.
Program RENTMAN
uses
Forms
RETDATA in ‘RENTDATA.pas’ {dmRENTMAN: TDataModule},
ANYFORM in ‘..\..\CH09\CODE\ANYFORM.pas’{fmAnyForm},
DBFORM in ‘..\..\CH09\CODE\DBFORM.pas’ {fmDatabaseForm},
EDITFORM in ‘..\..\CH09\CODE\EDITFORM.pas’ {fmEditForm},
REMPENT0 in ‘REMPENT0.pas’ {fmREMPENT0},
RSYSMAN0 in ‘RSYSMAN0.pas’ {fmRSYSMAN0},
RWKTENT0 in ‘RWKTENT0.pas’ {fmRWKTENT0},
CGRDFORM in ‘..\..\CH09\CODE\CGRDFORM.pas’
{fmControlGridForm},
RTENCGD0 in ‘RTENCGD0.pas’ {fmRTENCGD0},
RPROCGD0 in ‘RPROCGD0.pas’ {fmRPROCGD0},
RLEACGD0 in ‘RLEACGD0.pas’ {fmRLEACGD0},
MSTRFORM in ‘MSTRFORM.pas’ {fmMasterDetailForm}
GRIDFORM in ‘GRIDFORM.pas’ {fmGridForm},
RWORGRD0 in ‘RWORGRD0.pas’ {fmRWORGRD0},
RWORMDE0 in ‘RWORMDE0.pas’ {fmRWORMDE0},
RCALGRD0 in ‘RCALGRD0.pas’ {fmRCALGRD0},
RCALEDT0 in ‘RCALEDT0.pas’ {fmRCALEDT0},
RPROLST0 in ‘RPROLST0.pas’ {fmRPROLST0},
33670584.004.png 33670584.005.png
Błąd! Nie zdefiniowano stylu. Elementy składowe aplikacji 75
{$ *.RES}
begin
Application.Initialize;
Application.HelpFile := ‘C:\Data\Word\CSD\CH13
\code\Rentman.hlp’;
Application.CreateForm(TfRSYSMAN0, fmRSYSMAN0);
Application.CreateForm(TdmRENTMAN, dmRENTMAN);
Application.CreateForm(TfmREMPENT0, fmREMPENT0);
Application.CreateForm(TfmRWKTENT0, fmRWKTENT0);
Application.CreateForm(TfmRTENCGD0, fmRTENCGD0);
Application.CreateForm(TfmRPROCGD0, fmRPROCGD0);
Application.CreateForm(TfmRLEACGD0, fmRLEACGD0);
Application.CreateForm(TfmRWORGRD0, fmRWORGRD0);
Application.CreateForm(TfmRWORMDE0, fmRWORMDE0);
Application.CreateForm(TfmRCALGRD0, fmRCALGRD0);
Application.CreateForm(TfmRCALEDT0, fmRCALEDT0);
Application.CreateForm(TfmRPROLST0, fmRPROLST0);
Application.Run;
end.
Słowo kluczowe program
Słowo kluczowe program , rozpoczynające listing 3.1, informuje kompilator, że
na podstawie tego pliku źródłowego ma być wygenerowany osobny plik
wykonywalny. Wprzypadku biblioteki dołączanej dynamicznie (DLL) albo
modułu, słowo program zastępowane jest odpowiednio przez słowo library
albo unit .
Polecenie uses
W ramach polecenia uses wymienione są wszystkie moduły, napisane w języku
Object Pascal, które Delphi skonsoliduje (połączy), tworząc plik wykonywalny.
Moduły (ang. units ) są elementami, składającymi się na aplikację Delphi. Gdy
użytkownik zleca skompilowanie lub uruchomienie pliku projektu, Delphi
automatycznie rekompiluje każdy moduł, którego kod wynikowy jest starszy niż
aktualny tekst źródłowy. W niektórych środowiskach programowania za proces ten
odpowiada program (lub funkcja) make.
Moduł Forms , wymieniony na listingu 3.1, stanowi część biblioteki Visual
Component Library, wchodzącej w skład pakietu Delphi. Pozostałe moduły,
wymienione na listingu, odpowiadają formularzom, dodanym do projektu przez
autora aplikacji. W każdym wierszu wymienione są kolejno: nazwa modułu,
ścieżka dostępu do pliku, w którym ten moduł jest przechowywany oraz nazwa
formularza, zawartego w module. Nazwy formularzy odpowiadają identyfikatorom
wpisywanym wpolu atrybutu Name , woknie Object Inspector. Wraz
z wprowadzeniem w Delphi obsługi długich nazw plików, możliwe stało się
33670584.006.png
76
Część I
nadawanie plikom nazw identycznych z nazwami modułów. Oczywiście nazwa
modułu nie zawiera rozszerzenia. Jeśli podczas kompilacji Delphi nie jest w stanie
zlokalizować modułu, korzystając zjego długiej nazwy, podejmuje próbę
odszukania go na podstawie nazwy skróconej.
Dyrektywa $R
Dyrektywa kompilatora $R interpretowana jest jako polecenie dołączenia do
projektu wskazanego pliku zasobów Windows. Gwiazdka oznacza, że główna
część nazwy pliku zasobów jest identyczna znazwą projektu. Wtrakcie
budowania projektu Delphi tworzy plik zasobów dla samego projektu oraz dla
każdego z zawartych w nim formularzy. Jeśli któryś z plików zasobów nie jest
dostępny podczas konsolidacji programu, Delphi generuje komunikat „ File not
found: xxx.RES ”.
Application.CreateForm
Polecenia Application.CreateForm wczytują formularze, należące do
projektu, do pamięci operacyjnej. Na ogół wymienione są w ten sposób wszystkie
formularze, zawarte w projekcie. Korzystając z opcji menu Options\Project , można
zdecydować, które formularze mają być tworzone automatycznie. Każdy
utworzony formularz przechowywany jest w zmiennej. Zmienna taka - na przykład
fmRSYSMAN0 - zdefiniowana jest w sekcji interface modułu formularza.
Ponieważ projekt wykorzystuje moduły a one z kolei definiują powyższe zmienne,
na poziomie projektu „widać” te zmienne i można przekazać je jako argument
wywołania procedury Application.CreateForm . Procedura ta tworzy
wskazany formularz w pamięci i zwraca w zmiennej do niego wskaźnik.
Kolejność, w jakiej formularze wymienione są w ciągu wywołań
Application. CreateForm , określa kolejność tworzenia formularzy.
Pierwszy formularz, utworzony przez Application. CreateForm , staje się
głównym formularzem aplikacji. Chcąc zmienić kolejność tworzenia formularzy,
należy skorzystać z opcji menu Options\Application ; nie należy natomiast zmieniać
tekstu źródłowego projektu.
Application.Run
Wywołanie Application.Run powoduje wejście do głównej pętli aplikacji,
czyli faktyczne uruchomienie programu.
33670584.001.png
Błąd! Nie zdefiniowano stylu. Elementy składowe aplikacji 77
Biblioteki Delphi
Delphi oferuje wygodny mechanizm tworzenia bibliotek dołączanych dynamicznie
(ang. dynamic link libraries , DLL). W przeciwieństwie do większości innych
języków programowania w Windows, Delphi dysponuje specjalnymi elementami
składni, wspomagającymi generowanie bibliotek DLL. Należą do nich dwa słowa
kluczowe: library i export . Słowo kluczowe library zastępuje słowo
program , obecne wpoprzednim przykładzie. Informuje kompilator, że
generowana ma być biblioteka DLL, a nie plik EXE. Użycie słowa kluczowego
export powoduje wyeksportowanie wskazanych funkcji z biblioteki DLL;
eksportowane funkcje biblioteczne mogą być wywoływane z innych modułów
wykonywalnych. Na Listingu 3.2 przedstawiono tekst źródłowy niewielkiej
biblioteki.
Listing 3.2. Biblioteka StrUtil.
library StrUtil;
Uses
SysUtils;
function Pad(InString: String; Len: Integer): String;
begin
Result:=Format(‘%-*s’,[Len, InString]);
end;
function LPad(InString: String; Len: Integer): String;
begin
Result:=Format(‘%*s’,[Len, InString]);
end;
exports
Pad index 1,
LPad index 2;
begin
end.
Biblioteki mają formę bardzo zbliżoną do programów. Należy jedynie zwrócić
uwagę na słowo library , zastępujące słowo Program (zob. początek Listingu
3.2). Polecenie exports nakazuje wyeksportowanie funkcji Pad i LPad
z biblioteki DLL. Funkcje te będzie można wywoływać z innych modułów
wykonywalnych.
Moduły (ang. units) w Delphi
Moduły stanowią - obok formularzy - elementarne bloki, składające się na
aplikację Delphi. Wmodułach przechowywane są definicje formularzy,
decydujących ograficznej postaci aplikacji. Moduły zawierają ponadto
dodatkowe, dopisywane przez autora programu, fragmenty kodu, wspomagające
funkcje aplikacji.
33670584.002.png
Zgłoś jeśli naruszono regulamin