background image

 

Rozdział 7 

Projektowanie aplikacji w modelu 
klient/serwer 

Narzędzia Silverrun, wykorzystywane w przykładowych projektach z rozdziału 6, 
7 i 8, są jednym z wielu produktów tego rodzaju, z których korzystać mogą 
programiści używający Delphi. Wybór narzędzi Silverrun podyktowany był 
wyłącznie preferencjami autora i nie oznacza rekomendacji firmy Borland dla tego 
produktu. 

W rozdziale 6 „Projektowanie baz danych w modelu klient-serwer” wymieniono 
pięć procesów (albo etapów) tworzenia aplikacji do obsługi bazy danych. Poniżej 
przypominamy listę tych procesów: 

„Zdefiniowanie przeznaczenia i funkcji aplikacji. 

„Zaprojektowanie bazy danych i 

procesów aplikacji, niezbędnych do 

zaimplementowania żądanych funkcji. 

„Przekształcenie projektu w 

aplikację poprzez stworzenie bazy danych 

i obiektów programu. 

„Testowanie aplikacji pod kątem zgodności z predefiniowanym przeznaczeniem 

i zakresem realizowanych funkcji. 

„Instalacja aplikacji w docelowym środowisku pracy. 

Rozdział 6 dotyczył przede wszystkim tych elementów powyższych procesów, 
które związane były z projektowaniem baz danych. W niniejszym rozdziale 
skupimy się na ich związkach z projektowaniem aplikacji. Projektowanie baz 
danych i projektowanie aplikacji są ściśle ze sobą powiązane, dlatego trudno jest 
jednoznacznie rozgraniczyć oba procesy. Ogół procesów projektowania aplikacji 
do obsługi bazy danych można przedstawić w postaci tabeli o dwóch kolumnach 
i pięciu wierszach. Jedna kolumna odpowiada projektowaniu bazy danych, druga - 
projektowaniu aplikacji. Poszczególne wiersze reprezentują pięć formalnie 
zdefiniowanych procesów, wymienionych powyżej. Można oczywiście posłużyć 
się inną, odpowiednią analogią; należy jednak mieć na względzie fakt ścisłego 
powiązania projektowania bazy danych i projektowania aplikacji. 

Podejmiemy teraz dyskusję w punkcie, w którym przerwaliśmy ją w rozdziale 6. 
W dalszej  części niniejszego rozdziału znajdzie się omówienie pięciu formalnie 
zdefiniowanych procesów projektowania aplikacji do obsługi baz danych. 

background image

216 

Część I 

UWAGA: 

Istnieje wiele popularnych metodologii tworzenia aplikacji w modelu klient-
serwer. Metodologie te obejmują nie tylko modelowanie baz danych i programów, 
lecz także cały proces definiowania i tworzenia wydajnych aplikacji do obsługi baz 
danych klient-serwer. Wśród przykładów takich metod wymienić można metodę 
Rational-Booch oraz metodę SAFE firmy Sybase. Mimo że omówienie tego 
rodzaju metodologii wykracza poza zakres niniejszej książki, nie należy 
rezygnować z zapoznania się z nimi. Problemy, związane z projektowaniem 
aplikacji typu klient-serwer, nie kończą się na zagadnieniach dotyczących 
interfejsu komunikacji z użytkownikiem. Wykraczają nawet poza zagadnienia 
tworzenia baz danych lub ustalania relacji między obiektami. Najlepsi projektanci 
systemów typu klient-serwer pracują w oparciu o ściśle zdefiniowaną metodologię, 
obejmującą tworzenie, testowanie i przygotowanie aplikacji do użytku. 
Niniejsza książka poświęcona jest, z 

konieczności, przede wszystkim 

modelowaniu baz danych i aplikacji. Zasady modelowania, zawarte w książce, 
stanowią wybór najlepszych składników popularnych technik modelowania baz 
danych i aplikacji, uzupełniony wnioskami z praktycznych doświadczeń autora. 
Książka ma charakter bardziej praktyczny niż teoretyczny. Czytelnicy powinni 
świadomie wybierać te metody, które im najbardziej odpowiadają. Jeśli okaże się, 
że stosowanie określonej metodologii modelowania prowadzi do szybszego 
tworzenia lepszych aplikacji, należy oczywiście taką metodologię wdrożyć i jej 
przestrzegać. 

Projektowanie bazy danych i procesów aplikacji 

Po zdefiniowaniu podstawy systemu bazy danych przychodzi czas na stworzenie 
procesów, koniecznych do zaimplementowania kluczowych funkcji aplikacji. Baza 
danych pełni rolę fundamentu, na którym budowane są pozostałe elementy 
aplikacji. Przed rozpoczęciem fazy tworzenia aplikacji, należy zatem - w miarę 
możliwości - doprowadzić projekt bazy danych do ostatecznej postaci. Wszelkie 
zmiany w bazie danych, dokonane już po stworzeniu aplikacji, mogą doprowadzić 
do konieczności przeprojektowania lub przepisania obszernych fragmentów 
programu. 

Kilka uwag na temat tworzenia oprogramowania 

Przed przystąpieniem do właściwego omówienia procesu projektowania aplikacji, 
proponujemy zapoznanie się z kilkoma ogólnymi uwagami, dotyczącymi tworzenia 
oprogramowania. Mają one charakter komentarza, pomogą jednak uzyskać 
bardziej kompletny obraz całego procesu i ulokować w 

nim poszczególne 

czynności. 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

217

 

Nie istnieje „jedynie słuszna” droga tworzenia wszelkich aplikacji. Nie istnieje też 
jeden system, odpowiedni do tworzenia wszelkiego rodzaju oprogramowania. 
Podobnie jak dobry kucharz, który czasem dodaje ingrediencje „na wyczucie”, 
a czasami  według przepisu, autor aplikacji sam musi zadecydować, kiedy 
postępować zgodnie z wiedzą książkową, a kiedy złamać niektóre reguły. Należy 
zatem wypracować indywidualny sposób postępowania, dostosowany do potrzeb 
i umiejętności twórcy oprogramowania oraz do charakteru tworzonych przezeń 
aplikacji. 

Tworzenie oprogramowania uważane jest dość powszechnie za dyscyplinę 
naukową. Zgodnie z opinią niektórych jest to dyscyplina z pogranicza nauki 
i sztuki,  o dominującym pierwiastku naukowym. W 

istocie, absolwenci 

informatyki uzyskują tytuł magistra albo magistra inżyniera, a nie magistra sztuki
Mimo to wiele przemawia za tym, by w tworzeniu oprogramowania dopatrywać 
się nie dyscypliny naukowej, a raczej sztuki lub rzemiosła. Różnica między sztuką 
a rzemiosłem sprowadza się do użyteczności uzyskanego produktu - efekty pracy 
rzemieślniczej służą celom praktycznym, ich wartość nie kończy się na walorach 
artystycznych. 

Aby uzyskać pożądany rezultat twórca oprogramowania musi - podobnie jak 
stolarz albo garncarz - przestrzegać pewnych reguł. Garncarz wie, że aby efekt 
jego pracy nie rozpadł się, musi zastosować odpowiedni rodzaj gliny. Stolarz musi 
sprawdzać, czy poszczególne elementy są proste i czy zachowane zostały 
odpowiednie kąty. Reguły postępowania związane są jednak tylko z prawami 
fizyki. Garncarz może stworzyć niemal dowolną formę naczynia nie łamiąc przy 
tym  żadnych zasad swego rzemiosła. Stolarz także może zbudować dowolny 
przedmiot i 

nadal pozostać dobrym stolarzem. Proces, realizowany przez 

rzemieślnika, niezależnie od tego, czy wymaga użycia własnych rąk, młotka, igły, 
czy narzędzi samodzielnie wytworzonych, nie ma sam w sobie większego 
znaczenia. Istotą rzemiosła jest produkt, przedmiot, a nie środki użyte do jego 
wytworzenia. Nie ma zatem „jedynie słusznej” drogi lepienia garnków. Nie 
istnieje szczegółowa lista czynności, które rzemieślnik zawsze wykonuje, tworząc 
przedmioty. Jakość produktu świadczy o umiejętnościach rzemieślnika; to samo 
można powiedzieć o tworzeniu oprogramowania. 

Dzisiejszy przemysł oprogramowania przypomina w pewnym stopniu przemysł 
meblarski z 

połowy dziewiętnastego stulecia. Meble wytwarzano wówczas 

pojedynczo, w 

warsztatach, w 

których pracowali wysoko wykwalifikowani 

rzemieślnicy. Każdy rzemieślnik budował swój mebel od początku do końca. 
Meble były wytwarzane przy pomocy ręcznych narzędzi, z precyzją, która 
stanowiła dla rzemieślnika powód do dumy - tak że umieszczał on swoje nazwisko 
na każdym meblu. Inskrypcja ta była swego rodzaju osobistą gwarancją jakości. 

Wraz z nadejściem rewolucji przemysłowej okazało się,  że klej i nity wypierają 
rzemiosło. Niska cena wyparła wysoką jakość. Wytwarzanie mebli odbywało się 

background image

218 

Część I 

teraz w oparciu o ciągły, zmechanizowany proces. Nie mogło być już mowy 
o „tworzeniu” mebli - były one po prostu produkowane. Rzemieślników zastąpili 
robotnicy na taśmie montażowej. 

Niemal we wszystkich gałęziach przemysłu dominuje obecnie tendencja do 
wytwarzania w oparciu o linie montażowe. Ma ona zarówno pozytywne, jak 
i negatywne  następstwa. To prawda, że większość produktów można obecnie 
wytworzyć taniej niż kiedyś. Jaka jest jednak rzeczywista cena, którą przychodzi 
nam płacić? Czy rzeczywiście otrzymujemy te same produkty taniej, czy może 
uzyskujemy taniej tańsze produkty? I czy zanik prawdziwego rzemiosła podniósł 
czy obniżył cenę produktów o najwyższej jakości? 

Jaki związek mają powyższe rozważania z tworzeniem oprogramowania do obsługi 
baz danych? Wystarczy przypomnieć, że rewolucja przemysłowa rozpoczęła się od 
zredukowania rzemiosła do zwykłej, ręcznej pracy, którą wykonać mógł  każdy
niezależnie od kwalifikacji. Właściwą pracę pozostawiono maszynom. 
Doprowadziło to do obniżenia jakości produktów i niemal całkowitej eliminacji 
nowatorstwa. Przemysł oprogramowania może spotkać ten sam los. Opinie 
mówiące,  że istnieją „właściwe” i „niewłaściwe” sposoby tworzenia aplikacji, 
w istocie  odbierają rzemieślnikowi prawo do sygnowania swoich produktów 
własnym nazwiskiem. Zabijają kreatywność i ograniczają pole dla innowacji. 
A przecież tworzenie oprogramowania powinno być przyjemnością. Powinno być 
rzeczywiście procesem twórczym. Dlatego - zadaniem autora - nie ma „jedynie 
słusznego” sposobu tworzenia oprogramowania, podobnie jak nie ma „jedynie 
słusznego” sposobu lepienia naczyń albo obróbki drewna. Nie da się stworzyć 
stałej listy kroków, których zrealizowanie doprowadzi każdorazowo do powstania 
dobrej aplikacji. Rzemiosło tworzenia oprogramowania nie sprowadza się do 
pisania programów „dobrze”, lecz do pisania dobrych programów. 

Tworząc programy do obsługi baz danych, dobrze jest mieć na względzie 
powyższe uwagi. Niniejszy i poprzedni rozdział celowo nie mają postaci opisu 
kolejnych etapów, które należy szczegółowo realizować przy tworzeniu aplikacji. 
Zasady tworzenia aplikacji, prezentowane w tej książce, są wyłącznie sugestiami. 
Należy stosować te z nich, które okażą się przydatne dla Czytelnika, a pominąć te, 
których przydatność stanie pod znakiem zapytania. 

Wybór typu aplikacji 

Pierwszym krokiem w projektowaniu procesów, tworzących aplikację, powinien 
być wybór typu tworzonego programu. Aplikacje można podzielić na dwie 
zasadnicze grupy: systemy przetwarzania transakcji i systemy wspomagania 
decyzji. Najogólniej mówiąc, systemy wspomagania decyzji wykorzystywane są 
przez kadrę kierowniczą i pozwalają uzyskać szersze spojrzenie na część danych 
firmy. Systemy przetwarzania transakcji odpowiadają za wprowadzanie 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

219

 

i przetwarzanie tych danych. Aplikacje wspomagające decyzje muszą z reguły 
tylko odczytywać dane. Systemy przetwarzania transakcji muszą zarówno 
odczytywać, jak i zapisywać dane. Z uwagi na tę fundamentalną różnicę między 
dwoma typami aplikacji, przed przystąpieniem do dalszych czynności konieczne 
jest dokonanie wyboru jednego z nich. 

Prezentacja procesów operacyjnych w formie graficznej 

Przebieg każdego procesu aplikacji należy przedstawić w formie graficznej, jako 
punkt wyjścia wykorzystując modele stworzone w fazie projektowania bazy 
danych. Co najmniej kilka narzędzi CASE oferuje mechanizmy wspomagające 
modelowania procesów aplikacji. W istocie wiele z tych narzędzi umożliwia 
zbudowanie modeli aplikacji na modelach typu E-R i relacyjnych modelach 
danych, opracowanych podczas projektowania obiektów bazy danych. Niektóre 
narzędzia oferują możliwość bezpośredniej współpracy z Delphi. Należą do nich 
programy Silverrun RDM i PowerDesigner (poprzednia nazwa - S-Designor) 
AppModeler for Delphi. Należy pamiętać, że do modelowania elementów aplikacji 
nie trzeba koniecznie używać narzędzi typu CASE. Niezależnie od przyjętej drogi 
tworzenia modeli, należy dążyć do zrealizowania za ich pośrednictwem kilku 
podstawowych zadań: 

„Zdefiniowania wszystkich formularzy, potrzebnych w aplikacji. 

„Zdefiniowania wszystkich raportów i 

innych dokumentów wyjściowych, 

generowanych przez aplikację. 

„Skojarzenia tych elementów z elementami danych, obecnymi w poprzednio 

stworzonych modelach. 

„Zdefiniowania przejść między formularzami i 

raportami oraz między 

procesami. 

„Zdefiniowania wszelkich oddzielnych (nie należących do żadnego formularza 

ani raportu), pomocniczych fragmentów programu, niezbędnych do 
funkcjonowania aplikacji.  

Rysunki 7.1 i 7.2 ilustrują kilka różnych modeli procesów aplikacji. 

 

background image

220 

Część I 

 

Wygenerowanie aplikacji 

Jeśli stosowane narzędzie CASE umożliwia generowanie tekstu programu, 
odpowiadającego stworzonym modelom, celowe jest skorzystanie z takiej funkcji. 
Narzędzie wygeneruje wówczas przynajmniej część aplikacji na podstawie 
opracowanych modeli. Oszczędność czasu, jaką można w ten sposób uzyskać, 

 

Rysunek 7.1. 
Przykładowy 
wstępny model 
aplikacji dla 
projektu 
RENTMAN. 

 

Rysunek 7.2. 
Inny przykładowy 
model aplikacji. 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

221

 

bywa różna w zależności od stosowanego narzędzia. Na przykład, program 
Silverrun RDM wygeneruje zbiory atrybutów Delphi, których można później użyć 
w aplikacji. Z kolei AppModeler for Delphi wygeneruje całą aplikację, w tym 
formularze, raporty i kod pomocniczy. Na tej podstawie można dalej uzupełniać 
aplikację.  

Projektowanie hierarchii formularzy i raportów 

Jeżeli zostało określone jakie formularze i raporty są wymagane prze aplikację, 
pierwszym krokiem w budowie aplikacji będzie zaprojektowanie oddzielnych 
hierarchii formularzy i raportów. Pozwoli to na wykorzystanie wsparcia jakie daje 
Delphi dla dziedziczenia formularzy. To znaczy, że można utworzyć formularze 
jako ogólne klasy - wywodząc jedne z drugich. Na przykład można zdefiniować 
główny formularz w aplikacji, a następnie na jego podstawie (poprzez mechanizm 
dziedziczenia) tworzyć pozostałe. Jeżeli następnie okaże się konieczna zmiana 
jakiejś własności we wszystkich formularzach aplikacji, będzie można to wykonać 
dokonując zmiany tylko w jednym miejscu. Powyższe uwagi odnoszą się również 
do hierarchii raportów. 

Wyszukanie przydatnych, niezależnie opracowanych elementów programu 

Po ewentualnym wygenerowaniu szkieletu aplikacji należy podjąć próbę 
wyszukania wszelkich bibliotek pomocniczych i 

niezależnie opracowanych 

elementów programu, które mogłyby okazać się przydatne. Jedną z popularnych 
bibliotek, z której autor korzysta często w swoich aplikacjach, napisanych 
w Delphi, jest Orpheus Visual Component Library firmy Turbo Power Software. 
Wśród innych bibliotek wymienić należy Asynch Professional tej samej firmy. 
Autorzy aplikacji, pracujący w większych zespołach, powinni skontaktować się 
z kierownikami innych projektów lub menedżerami zasobów firmy i uzyskać 
informacje o bibliotekach pomocniczych, które być może opracowano już 
wcześniej, przy okazji poprzednich projektów. Decyzję o potrzebie zastosowania 
określonych bibliotek pomocniczych dobrze jest podejmować na etapie wyboru 
procesów, z którymi będą skojarzone formularze oraz tych, z którymi będą 
skojarzone fragmenty programu nie komunikujące się z użytkownikiem. Zbytnie 
odwlekanie decyzji o zastosowaniu biblioteki pomocniczej może w pewnym 
momencie wstrzymać cały projekt w oczekiwaniu na zakup lub dostarczenie 
odpowiednich narzędzi. 

Ustalenie kolejności prac 

Kolejnym etapem powinno być ustalenie kolejności prac nad poszczególnymi 
formularzami i pomocniczymi fragmentami programu. Na planowaną kolejność 
może mieć wpływ kilka czynników. Klient może na przykład wymagać 

background image

222 

Część I 

dostarczenia pewnych części aplikacji przed pozostałymi. Umowa może nakładać 
na autora obowiązek tworzenia aplikacji w postaci niezależnych modułów, 
instalowanych i wdrażanych oddzielnie. Klient może również zażyczyć sobie 
wstępnych prezentacji określonych modułów. Ponadto obecność niektórych części 
aplikacji może być warunkiem koniecznym dla funkcjonowania pozostałych jej 
fragmentów. Przed przystąpieniem do tworzenia modułu kontrolującego wpływy 
należności, konieczne będzie uruchomienie modułu księgi przychodów 
i rozchodów. Wreszcie może się okazać,  że przyjęcie określonej kolejności 
tworzenia elementów programu usprawni dalszą pracę nad aplikacją, i tak na 
przykład rozpoczęcie pracy od przygotowania głównego formularza aplikacji 
umożliwi uruchamianie kolejno testowanych fragmentów za pośrednictwem 
głównego menu. 

Opracowanie kalendarza prac 

Opracowywanie kalendarza prac nad projektem graniczy z czarną magią. Jest to 
złożony proces, podlegający niezliczonym czynnikom. Komplikują go dodatkowo 
wszelkie ograniczenia, narzucane przez kierownictwo i uwarunkowania pracy 
zespołowej. Tematowi ustalania kalendarza prac nad projektem poświęcono wiele 
osobnych książek. Z 

uwagi na niemal nieograniczoną liczbę czynników 

wpływających na opracowywanie kalendarza prac, pominiemy to zagadnienie 
w niniejszej książce. 

Tworzenie aplikacji 

Następnym etapem jest już  właściwe tworzenie aplikacji, zgodnie z ustaloną 
kolejnością i kalendarzem prac. Sztuka pisania dobrze ustrukturalizowanego tekstu 
programu wykracza poza zakres niniejszej książki. Należy podkreślić, że ostatnio 
znacznie zmniejszyło się znaczenie tekstu programu, a to za sprawą narzędzi 
programowania wizualnego, takich jak Delphi. Obecnie duże znaczenie 
przywiązuje się do projektowania formularzy, któremu poświęcona będzie kolejna 
sekcja. 

Projektowanie formularzy 

Sposób projektowania formularzy zależy w dużej mierze od typu tworzonej 
aplikacji i typu formularzy w ramach tej aplikacji. W aplikacjach do obsługi bazy 
danych w 

modelu klient-serwer występują z 

reguły trzy podstawowe typy 

formularzy: formularze wspomagające decyzje, formularze przetwarzania 
transakcji i formularze wprowadzania danych. Między wymienionymi typami 
występują istotne różnice. Tym bardziej należy podkreślić konieczność 
zdefiniowania typu formularza jeszcze przed przystąpieniem do projektowania go. 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

223

 

Zebrane poniżej uwagi można potraktować jako ogólne wskazówki projektowania 
formularzy. Wiele z 

nich ma charakter subiektywny i 

Czytelnicy powinni 

świadomie wybrać te spośród nich, które uznają za pomocne. Wskazówki 
podzielono na cztery grupy. Pierwsza grupa dotyczy wszystkich formularzy, druga 
- formularzy wspomagających decyzje, trzecia - formularzy przetwarzania 
transakcji, wreszcie ostatnia - formularzy wprowadzania danych. 

„Należy zdecydować się na określony  motyw graficzny aplikacji. Decyzja 

o wyborze motywu powinna zapaść możliwie wcześnie. Wybrany motyw 
będzie decydował o postaci graficznej wszystkich formularzy, wchodzących 
w skład aplikacji. W świecie oprogramowania dla środowiska Windows 
rozpowszechnione są co najmniej trzy popularne motywy, obowiązujące 
odpowiednio w programach Corel PerfectOffice, Lotus SmartSuite i Microsoft 
Office. Decydując się na motyw Corel PerfectOffice, autor aplikacji nadaje jej 
wygląd zbliżony do programów Quattro Pro i WordPerfect. Motyw SmartSuite 
zapewnia podobieństwo do programów Lotus 1-2-3 i WordPro. Z kolei wybór 
motywu Microsoft Office oznacza naśladownictwo programów Word i Excel. 
Na rysunkach 7.3, 7.4 i 7.5 przedstawiono wymienione tutaj przykłady 
interfejsów użytkownika. 

 

 

Rysunek 7.3. 
Interfejs Corel 
PerfectOffice. 

background image

224 

Część I 

 

Oczywistym powodem, dla którego zaleca się zachowanie zgodności 
z obowiązującymi standardami interfejsów, jest powszechna ich znajomość wśród 
użytkowników. Dzięki niej skróci się czas potrzebny na opanowanie nowej 
aplikacji. Ponadto, zachowując podobieństwo do programów największych 
producentów, aplikacja sprawia wrażenie „bardziej profesjonalnej”. 

„Nie należy wprowadzać zbędnych funkcji. Zalew bezużytecznych informacji 

powoduje, że użytkownik niepotrzebnie traci czas. Wprowadzanie w programie 

 

Rysunek 7.4. 
Interfejs Microsoft 
Office. 

 

Rysunek 7.5. 
Interfejs Lotus 
SmartSuite. 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

225

 

niepotrzebnych funkcji to oczywista strata czasu autora aplikacji. Autor 
programu powinien zawsze postawić się na miejscu użytkownika i spróbować 
określić, jakie funkcje byłyby dla niego przydatne, a jakie - nie. Zbyt często 
o zakresie funkcji aplikacji decydują specyficzne cechy języka programowania 
lub dostępność atrakcyjnych elementów interfejsu. Funkcje aplikacji powinny 
wynikać z potrzeb użytkownika.  

„Stworzenie oddzielnej hierarchii formularzy i 

raportów umożliwi 

wykorzystanie mechanizmu dziedziczenia formularzy, dostępnego w Delphi. 
Należy zdefiniować formularz najwyższy w hierarchii, którego cechy będą 
dziedziczone przez wszystkie formularze potomne. Jeśli w przyszłości zajdzie 
potrzeba zmiany jakiegoś elementu wszystkich formularzy aplikacji, to być 
może uda się ograniczyć zmiany wyłącznie do formularza nadrzędnego. Ta 
sama zasada dotyczy hierarchii raportów. Większość raportów będzie zapewne 
powstawać w 

oparciu o 

komponenty typu 

QuickReport

, dostępne 

standardowo w Delphi, dlatego wskazane jest utworzenie również hierarchii dla 
formularzy raportów. 

„Bardzo istotne jest zachowanie wewnętrznej i 

zewnętrznej spójności 

w aplikacji.  Spójność wewnętrzna obowiązuje w odniesieniu do różnych 
formularzy tej samej aplikacji. Wewnętrzną spójność wspiera zastosowanie 
przedefiniowanej hierarchii formularzy, wspomnianej w poprzednim punkcie. 
Spójność zewnętrzna obowiązuje w odniesieniu do innych aplikacji. Właśnie 
dlatego decyzja o 

wyborze motywu interfejsu powinna zapadać jak 

najwcześniej. Czcionki, kolory tła, wielkości elementów, lokalizacja pasków 
narzędzi, itp. powinny odpowiadać nieformalnym standardom, przyjętym 
w innych aplikacjach Windows, przeznaczonych do powszechnego użytku. 

„Należy budować formularze typu SDI, a nie MDI. Swego czasu preferowane 

były formularze typu MDI (ang. multiple-document interface). Obecnie jednak 
polityka firmy Microsoft uległa zmianie i zaleca się zachowanie zgodności 
z konwencją SDI (ang. single-document interface).  Jest  to  oczywiście bardzo 
ogólne zalecenie i 

bez wątpienia można wymienić wiele argumentów, 

przemawiających za aplikacjami MDI. Jednak światowe trendy skłaniają - 
przynajmniej na razie - do stosowania interfejsu SDI. 

„Informacje, należące do różnych klas, nie powinny pojawiać się na jednym 

formularzu. Na przykład faktury i polecenia przelewu nie powinny być 
wyświetlane w tym samym oknie. Formularz powinien być jak najprostszy. 
Zazwyczaj należy unikać umieszczania na formularzu danych z więcej niż 
jednego dokumentu źródłowego. 

„Należy korzystać ze standardowych pól dialogowych systemu Windows. Nie 

ma sensu tworzenie własnych pól dialogowych do otwierania i zachowywania 
plików, skoro system Windows oferuje gotowe pola. W środowisku Delphi 

background image

226 

Część I 

standardowe pola dialogowe Windows zostały „opakowane” w łatwe do 
zastosowania komponenty, które wystarczy po prostu umieścić na formularzu. 
W miarę możliwości należy zatem stosować te gotowe komponenty, co skróci 
czas tworzenia programu i 

ograniczy zużycie zasobów systemowych. 

Komponenty, reprezentujące pola dialogowe, znaleźć można na stronie 

Dialogs

 

palety komponentów Delphi. 

„Kolor tła formularzy powinien być neutralny (taki jak np. clBtnFace, który 

standardowo odpowiada szarości). Należy natomiast unikać jaskrawych barw. 
Zapewnia to formularzom profesjonalny wygląd, mniej męczy wzrok 
i gwarantuje poprawną prezentację na większości kart graficznych i monitorów. 

„Jeśli aplikacja może pracować w różnych trybach, to do przekazania informacji 

o aktualnie aktywnym trybie pracy należy wykorzystać paski narzędzi i grupy 
przycisków typu 

SpeedButton

. Przykładowo kliknięcie na przycisku 

Dodaj

 

może spowodować przejście aplikacji w tryb dodawania, z kolei kliknięcie 
przycisku 

Raport

 - przejście w tryb generowania raportu. Grupę przycisków 

typu 

SpeedButton

  tworzy się, nadając niezerową wartość atrybutowi 

GroupIndex

 szeregu przycisków. W takim przypadku wskazane jest również 

nadanie wartości 

False

 atrybutowi 

AllowAllUp

. Tak zdefiniowany 

przycisk po kliknięciu pozostanie wciśnięty, dopóki użytkownik nie kliknie 
innego przycisku w tej samej grupie. W ten sposób zachowywały się przyciski 
w starszych  urządzeniach elektronicznych, np. radiach samochodowych. Jeśli 
aplikacja może znajdować się  w jednym  z kilku  wykluczających się trybów 
pracy, to pogrupowane przyciski służą zarówno do zmiany trybu, jak i do 
przekazania informacji o aktualnym trybie pracy. Możliwe jest programowe 
„naciśnięcie” przycisku - należy nadać wartość 

True

 atrybutowi Down 

odpowiedniego komponentu 

SpeedButton

„Miejsca na ekranie, w które użytkownik musi trafić wskaźnikiem myszy, 

powinny być odpowiednio duże. Duże przyciski i pola wyboru sprawiają,  że 
użytkownikowi  łatwiej jest poruszać się po aplikacji. Obsługa formularzy 
pełnych mikroskopijnych kontrolek jest bardzo uciążliwa. 

„Każdy przycisk na formularzu powinien mieć swój odpowiednik w postaci 

opcji menu. Należy również utworzyć pozycje menu, odpowiadające 
poleceniom, które nie są dostępne wprost z formularzy. Dla osób, które ponad 
korzystanie z myszy przedkładają obsługę programu z klawiatury, będzie to 
istotnym ułatwieniem i przyczyni się do przyspieszenia pracy. Skojarzenie 
klawiszy skrótów z opcjami menu aplikacji pozwoli na stosowanie jej razem 
z programami do sterowania komputera za pomocą  głosu; programy takie 
zamieniają bowiem mówione polecenia na zdefiniowane uprzednio sekwencje 
i kombinacje klawiszy. 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

227

 

„Z najczęściej stosowanymi poleceniami w menu powinny być skojarzone 

klawisze skrótów. Można również zdefiniować klawisz skrótu, który nie będzie 
związany z żadną widoczną pozycją menu. Należy w tym celu utworzyć 
tymczasową pozycję w menu, skojarzyć  ją z żądanym klawiszem skrótu, po 
czym w procedurze obsługi zdarzenia 

OnClick

 wpisać fragment programu, 

wywoływany tym klawiszem. Następnie w oknie 

Object Inspector

 należy 

przypisać atrybutowi 

Visible

 nowej pozycji wartość 

False

. Spowoduje to, 

że podczas wykonywania programu pozycja menu będzie niewidoczna. Mimo 
to zdefiniowany klawisz skrótu pozostanie aktywny. 

„Najważniejsze pola formularza powinny być opatrzone etykietami ze 

zdefiniowanym klawiszem skrótu. Klawisz skrótu dla etykiety definiuje się 
w ramach atrybutu 

Caption

 komponentu 

TLabel

 - przed jednym ze znaków 

w tekście etykiety należy wpisać dodatkowo znak 

&.

 Wskazuje on, że następny 

znak ma pojawić się jako podkreślony, a odpowiedni klawisz - pełnić rolę 
skrótu do etykiety. Atrybut 

FocusControl

 etykiety powinien wskazywać na 

komponent, który ma zostać uaktywniony po naciśnięciu klawisza skrótu. 

„Wszelkie kontrolki nawigacyjne powinny na wszystkich formularzach aplikacji 

znajdować się w tym samym miejscu. Jeśli na jednym formularzu komponent 

DBNavigator

 umieszczony będzie u dołu, a na innym - u góry, to 

użytkownik poczuje się zdezorientowany, a 

aplikacja będzie sprawiała 

wrażenie niekonsekwentnie zaprojektowanej. Kontrolki pełniące te same lub 
podobne funkcje powinny na wszystkich formularzach znajdować się w tym 
samym miejscu. 

„Do opisywania wszystkich przycisków należy stosować jednolitą czcionkę. 

Interfejs użytkownika nie może być krzykliwy. Ewentualne trudności 

odczytaniem etykiet i 

opisów świadczą o 

źle zaprojektowanej formie 

graficznej aplikacji. Użytkownicy o wiele łatwiej zaakceptują zbyt duże 
przyciski niż natłok kontrolek, zajmujących każdy wolny centymetr 
kwadratowy ekranu. 

„Wiele osób uważa,  że czcionki bezszeryfowe (takie jak Arial) są bardziej 

czytelne niż szeryfowe (np. Times New Roman). 

„Należy jak najszerzej korzystać z mechanizmu podpowiedzi (ang. hints). 

Podpowiedzi są niewielkimi (najczęściej  żółtymi) etykietami, które pojawiają 
się na ekranie, gdy użytkownik zatrzyma na chwilę wskaźnik myszy nad jakimś 
istotnym elementem na ekranie. Podpowiedzi informują użytkownika o funkcji 
danej kontrolki (w szczególności - przycisku paska narzędzi), nie zmuszając go 
do jej uaktywniania. 

„Aplikacja powinna być wyposażona w system pomocy. Profesjonalne aplikacje 

Windows zawierają kompletną bazę dokumentów pomocy, połączonych 
odnośnikami do pokrewnych tematów. Formularze powinny być ponadto 

background image

228 

Część I 

wyposażone w system pomocy kontekstowej. Realizuje się go, nadając 
odpowiednie wartości atrybutom 

HelpContext

 formularza i jego kontrolek. 

Gdy użytkownik zażąda pomocy w chwili, gdy dana kontrolka jest aktywna, 
system Windows automatycznie odnajdzie odpowiedni temat w 

bazie 

dokumentów pomocy. Więcej informacji na temat tworzenia plików pomocy 
Windows znaleźć można w rozdziale 13 "Ostateczne poprawki". 

„Aplikacja powinna również zawierać formularz z informacjami o programie 

(typu 

AboutBox

), obejmujący nazwę programu, numer wersji i ewentualnie 

nazwę firmy (producenta). Można także umieścić na nim numer telefonu 
pomocy technicznej, informację o 

prawach autorskich i 

aktualne dane 

wykorzystaniu zasobów Windows. Nazwę produktu, numer wersji 

i informację o prawach autorskich należy dołączyć do aplikacji, korzystając 
z zasobu VERSIONINFO. Zagadnienie dołączania takich danych do aplikacji 
Delphi omówiono dokładniej w rozdziale 13. 

„Aplikację należy wyposażyć w pasek narzędzi. Stanowi on istotny element 

wszystkich, wymienionych wcześniej, standardowych motywów interfejsu 
użytkownika i 

stosowany jest w 

większości nowoczesnych aplikacji dla 

Windows. Delphi oferuje dwa standardowe komponenty, służące do tworzenia 
pasków narzędzi: 

TToolBar

 i 

TCoolBar

. Paski narzędzi można również 

tworzyć  ręcznie, umieszczając przyciski 

TSpeedButton

 na komponencie 

TPanel

„Należy uwzględnić w 

aplikacji pasek stanu. Można z 

powodzeniem 

wykorzystać komponent 

StatusBar

, który reprezentuje standardowy pasek 

stanu w systemie Windows 95. 

StatusBar

 dostępny jest na stronie Win32 

palety komponentów Delphi. 

„Na formularzach, zawierających pola do wprowadzania danych, należy 

zdefiniować pole domyślne (nadając jego atrybutowi 

TabOrder

 wartość 

0

). 

„Aby zgromadzić dużą liczbę kontrolek na stosunkowo niewielkiej powierzchni 

ekranu, należy zastosować komponenty typu 

TabControl

 i 

PageControl

Jest to rozwiązanie zalecane obecnie dla aplikacji działających w środowisku 
Windows 95. W programach firmy Borland korzystano z niego już od kilku lat. 

„Z aplikacją należy skojarzyć charakterystyczną ikonę. Ikona ta pojawiać się 

będzie w oknie Eksploratora Windows i na liście aplikacji, wyświetlanej po 
naciśnięciu klawiszy ALT+TAB. Dlatego powinna być rozpoznawalna 
i ułatwiać odnalezienie aplikacji pośród innych programów. Aby skojarzyć 
ikonę z aplikacją Delphi, należy skorzystać z opcji menu 

Project\Options\

 

Application

„Formularze powinny być projektowane z 

myślą o 

najniższej spośród 

stosowanych przez użytkowników rozdzielczości ekranu. Jest to na ogół 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

229

 

rozdzielczość VGA, a zatem można bezpiecznie założyć,  że formularz musi 
funkcjonować przy rozdzielczości 640x480. Najlepszym rozwiązaniem jest 
przełączenie własnego systemu na rozdzielczość 640x480 na czas 
projektowania formularzy. Formularze o 

zbyt dużych rozmiarach, 

zaprojektowane dla większych rozdzielczości, na ekranie VGA zostaną po 
prostu obcięte. 

„Na wszystkich formularzach należy używać jednolitej wielkości czcionki. 

Wszystkie formularze powinny być zaprojektowane na takim samym systemie - 
albo z wybraną małą czcionką o rozmiarze 96 dpi, albo z dużą czcionką 
120 

dpi. W 

ramach jednej aplikacji nie należy stosować formularzy 

zaprojektowanych przy różnych wielkościach czcionki systemowej. Należy 
także zwrócić uwagę,  że automatyczne dostosowanie formularza do większej 
czcionki daje na ogół lepszy efekt niż jego automatyczne pomniejszenie, 
mające na celu dostosowanie do mniejszej czcionki. Dlatego formularze 
zaprojektowane czcionką 96 dpi będą zwykle wyglądały poprawnie po 
zainstalowaniu w 

systemie z 

czcionką  120 dpi, natomiast formularze 

zaprojektowane w czcionce systemowej 120 dpi nie prezentują się dobrze po 
zainstalowaniu aplikacji w systemie z małymi czcionkami. Aby wyłączyć 
automatyczne skalowanie formularzy należy nadać atrybutowi 

Scaled

 

wartość 

False

 (domyślnie przyjmowana jest wartość 

True

). Z kolei jeśli 

formularz ma być automatycznie skalowany - co jest zalecanym rozwiązaniem - 
należy nadać wartość 

False

 atrybutowi 

AutoScroll

. Również temu 

atrybutowi nadawana jest domyślnie wartość 

True

, mimo że powoduje to 

konflikt z mechanizmem automatycznego skalowania. 

„Aplikacja powinna być tak zaprojektowana, aby w większości przypadków 

sposób jej obsługi był oczywisty. Użytkownik nie powinien być zmuszany do 
zbyt częstego sięgania po podręcznik lub pomoc dostępną w programie.  

„Projektowane formularze powinny być jak najwcześniej prezentowane 

klientom, którzy zweryfikują koncepcję komunikacji z 

użytkownikiem, 

zaproponowaną przez autora programu. Do takich prezentacji można 
z powodzeniem  wykorzystać  środowisko Delphi. Praktyka dowodzi, że 
możliwe jest nawet projektowanie formularzy przy aktywnym współudziale 
przyszłych użytkowników. 

Formularze wspomagające podejmowanie decyzji 

Z formularzy wspomagających podejmowanie decyzji korzystają na ogół osoby 
dysponujące stosunkowo szerokim zakresem władzy w ramach danej instytucji. 
Z drugiej strony umiejętności tych użytkowników w zakresie obsługi komputera 
plasują się zwykle poniżej poziomu umiejętności pozostałych użytkowników. 
Omawiana grupa pełni określoną rolę w procesie decyzyjnym, dlatego potrzebuje 
programów wspomagających właśnie podejmowanie decyzji. Zgodnie z zasadą 

background image

230 

Część I 

prezentowaną w 

książce Scotta Adamsa The Dilbert Principle, poziom 

umiejętności obsługi komputera jest odwrotnie proporcjonalny do pozycji 
w strukturze kierowniczej. Dlatego formularze wspomagające decyzje powinny 
być proste, a 

jednocześnie przekazywać jak najwięcej dobrze dobranych 

informacji. Zaprojektowanie takiego formularza nie jest banalnym zadaniem. 
Poniżej zebrano kilka sugestii: 

„Formularz powinien zajmować prawie cały ekran. Typowy menedżer ceni sobie 

uproszczoną i bardzo przejrzystą prezentację danych. Użytkownicy, należący 
do tej grupy, stosunkowo rzadko uruchamiają jednocześnie więcej niż jedną 
aplikację Windows. Dlatego zaleca się wykorzystanie całej dostępnej 
powierzchni ekranu. 

„Należy unikać umieszczania na formularzu dużej ilości danych szczegółowych 

i zestawień tabelarycznych. Formularz powinien być prosty. Menedżer chce 
znać wyłącznie fakty - podane w sposób prosty i estetyczny, jednak bez 
zbędnych ozdobników. Nie ma sensu prezentowanie dużych ilości danych 
transakcyjnych, gdyż zazwyczaj nie interesują one użytkowników omawianego 
typu formularzy. 

„Do prezentacji wzajemnych zależności danych należy jak najszerzej stosować 

wykresy. Niektórzy użytkownicy uważają wykresy za najefektywniejszy środek 
do zbiorczej prezentacji dużych ilości danych. Jeśli użytkownik gotów jest 
zrezygnować z surowych wartości liczbowych na rzecz prezentacji graficznej, 
należy bez wahania stosować wykresy, które nadają aplikacji bardzo 
profesjonalne oblicze, a jednocześnie nie wymagają dużego nakładu pracy ze 
strony autora programu. Użycie wykresów nie powinno jednak zamykać 
dostępu do właściwych, surowych danych, tak aby nie było konieczne 
odczytywanie wartości liczbowych z wykresu. Dostęp do właściwych danych 
wykresu można zrealizować korzystając z 

komponentów typu 

DecisionCube

, dostępnych w Delphi. 

„Jeśli aplikacja ma tylko odczytywać dane, a nie zezwala na zapis, to 

formularza powinny zniknąć wszelkie listy i 

elementy, wspomagające 

wprowadzanie danych. W 

aplikacjach, przeznaczonych wyłącznie do 

przeglądania danych, nie należy stosować narzędzi do ich wprowadzania 
(takich jak kontrolki 

DBListBox

 lub 

DBLookupComboBox

). Można je 

zastąpić komponentami typu 

DBText

 lub nawet 

TLabel

, które zużywają 

mniej zasobów systemowych, a równie dobrze nadają się do prezentacji 
danych.  

„Dostęp do danych powinien być kontrolowany z poziomu serwera bazy danych 

lub serwera sieciowego - należy unikać mechanizmów kontrolnych, 
wbudowanych w samą aplikację. Użytkownicy, szczególnie wywodzący się 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

231

 

z kadry kierowniczej, nie najlepiej reagują na komunikaty informujące o braku 
uprawnień i dostępu do określonej funkcji programu. 

„Z aplikacji należy usunąć (lub skutecznie w niej ukryć) wszelkie funkcje, do 

których użytkownicy nie mają dostępu. Oznacza to, że należy zrezygnować 
z nieaktywnych  (wyświetlanych w 

kolorze szarym) opcji menu oraz 

przycisków. Ich obecność może zdezorientować niedoświadczonych 
użytkowników. Jeśli w aplikacji, wspomagającej podejmowanie decyzji, któraś 
z opcji jest niedostępna dla użytkownika, to należy ją całkowicie usunąć albo 
nadać jej atrybutowi 

Visible

 wartość 

False

. Spowoduje to ukrycie opcji. 

Formularze interaktywne 

Formularze interaktywne spotyka się niemal tak często, jak formularze do 
wspomagania decyzji. Formularze interaktywne są standardowym narzędziem 
wprowadzania, edycji i usuwania danych. Ich typowy użytkownik dysponuje 
szerszymi umiejętnościami w 

zakresie obsługi komputera niż  użytkownicy 

wywodzący się z kadry kierowniczej. Z formularzy interaktywnych korzystają 
pracownicy administracyjni, operatorzy komputerów i - ogólnie - urzędnicy. 

Oto wybrane wskazówki, dotyczące konstruowania formularzy interaktywnych: 

„Należy rozważyć możliwość uzupełnienia bądź zastąpienia przycisków 

komponentu 

DBNavigator

 standardowymi przyciskami. Komponent ten 

oferuje dużo możliwości i jest prosty w użyciu, brakuje mu jednak kilku 
podstawowych funkcji, takich jak mechanizm wyszukiwania danych 
i możliwość przypisywania wbudowanym przyciskom etykiet i 

klawiszy 

skrótów. W rozdziale 27, pokazano, w jaki sposób stworzyć można wzorzec 
komponentu, zastępującego kontrolkę 

DBNavigator

„Kontrolki należy pogrupować, tak aby ułatwić obsługę formularza. Położenie 

kontrolek powinno sprzyjać logicznemu i zgodnemu z intuicją wyborowi. 
Elementy logicznie ze sobą powiązane należy umieszczać w bezpośrednim 
sąsiedztwie. Skojarzone pola wyboru i przyciski powinny znajdować się obok 
siebie. Takie rozmieszczenie kontrolek sprzyja szybkiemu poznaniu formularza 
i pozwala uniknąć wielu błędów obsługi. 

background image

232 

Część I 

WSKAZÓWKA: 

W charakterze lektury uzupełniającej, poświęconej ujednoliconemu interfejsowi 
Windows, polecić można książkę It's Time To Clean Your Windows: Designing 
Guis that Work, autorstwa Wilberta O. Galitza (John Wiley & Sons, ISBN 0-471-
60668-5). Zawiera ona szereg szczegółowych zaleceń, dotyczących czytelnego 

funkcjonalnego rozmieszczania kontrolek. Wśród poruszanych zagadnień 

znalazło się także zastosowanie fiszek (obiektów typu 

TabControl

), 

konfiguracja czcionek i 

wiele innych problemów, dotyczących graficznego 

interfejsu użytkownika. 

„Z przyciskami poleceń i polami do wprowadzania danych należy skojarzyć 

klawisze skrótów. Dla osób, które chętnie korzystają z klawiatury, klawisze 
skrótów są nieodzownym elementem interfejsu użytkownika. O wyborze 
klawiszy powinny decydować funkcje skojarzonych kontrolek, a nie ich 
położenie na formularzu. Przyciski mają pierwszeństwo przed etykietami. Jeśli 
na przykład w górnej części formularza znajduje się pole, którego etykieta 
rozpoczyna się literą D, a u dołu znajduje się przycisk 

Dodaj

, to klawisz skrótu 

ALT+D należy skojarzyć z 

przyciskiem, a 

nie z 

etykietą. Jest bardziej 

prawdopodobne,  że użytkownik zechce użyć klawisza do uaktywnienia 
przycisku niż  że będzie chciał w ten sposób przejść do pola na początku 
formularza. 

„Kolejność przechodzenia między kontrolkami klawiszem TAB powinna być 

przemyślana i logiczna. Formularz należy zaprojektować w ten sposób, aby 
klawisz TAB przenosił  użytkownika między kolejnymi kontrolkami, 
w logicznym porządku, od lewej do prawej strony i z góry na dół. 

„W razie potrzeby należy wykorzystać atrybut 

Kind

 komponentów 

TBitBtn

 

i zdefiniować przyciski 

OK

 i 

Cancel

 (Anuluj). Przycisk 

OK

 staje się 

automatycznie domyślnym przyciskiem formularza - jego atrybut 

Default

 

przyjmuje wartość 

True

. Oznacza to, że po zakończeniu edycji bieżącego 

rekordu użytkownik będzie mógł nacisnąć ENTER; a do anulowania edycji 
będzie można użyć klawisza ESC. 

„Przyciski poleceń można zastąpić lub uzupełnić dodatkowym menu, 

pojawiającym się na ekranie po naciśnięciu prawego klawisza myszy. 
Niektórzy użytkownicy bardzo chętnie korzystają z tego rodzaju menu. 
Wprowadzenie omawianego udogodnienia w aplikacjach Delphi jest niezwykle 
proste. 

Formularze do wprowadzania danych 

Formularze tego rodzaju używane są zazwyczaj do żmudnej czynności, jaką jest 
wprowadzanie danych do bazy. W tym przypadku kluczową rolę odgrywa 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

233

 

szybkość obsługi, mniej ważna jest natomiast estetyka formularza, dostępność 
podpowiedzi i tym podobne udogodnienia. Omawiane formularze są zwykle dość 
oszczędnie zaprojektowane i 

zawierają tylko najistotniejsze elementy. Ich 

użytkownikiem jest na ogół operator, skupiający swą uwagę przede wszystkim na 
dokumentach  źródłowych, a 

nie na ekranie. W 

obsłudze formularzy do 

wprowadzania danych szczególną rolę odgrywa klawiatura, korzystanie z myszy 
wymaga bowiem spoglądania na monitor.  

Poniższa lista zawiera wskazówki, które być może okażą się pomocne przy 
projektowaniu formularzy do wprowadzania danych: 

„W polach tekstowych należy używać czcionki pogrubionej, o stałej szerokości 

znaków. Czcionki o stałej szerokości znaków są bardziej czytelne, choć 
z drugiej strony zajmują więcej miejsca na ekranie. Jeśli kluczowym kryterium 
przy projektowaniu formularza jest szybkość, należy używać czcionki 
nieproporcjonalnej. Czytelność napisów zwiększa także pogrubienie czcionki. 

„Z formularza należy usunąć zbędne przyciski i pola. Na formularzu nie ma 

miejsca na kontrolki, które nie będą wykorzystywane przy szybkim 
wprowadzaniu danych. Na przykład, jeśli wiadomo, że użytkownik nigdy nie 
będzie zmuszony do wyszukiwania numeru konta, to należy usunąć 
z formularza przycisk, wywołujący tę funkcję. Te same elementy, które 
w zwykłych formularzach stanowią cenne udogodnienia, przy wprowadzaniu 
dużej ilości danych będą tylko przeszkadzać.  

„Komponenty 

DataSet

, powiązane z kontrolkami na formularzu, powinny być 

kojarzone ze sobą przy wykorzystaniu mechanizmu typu nadrzędny/podrzędny 
(master/detail), dostępnego w Delphi. Nie należy wymagać od użytkownika 
uaktywniania przycisku lub wykonywania jakiejkolwiek innej czynności celem 
przejrzenia danych podrzędnych, skojarzonych z pozycją nadrzędną. Tabele 
powinny być skojarzone za pośrednictwem odpowiednich atrybutów, tak aby na 
ekranie następowała ich automatyczna synchronizacja. 

„Klawisze skrótów powinny być tak dobrane, aby ich naciśnięcie nie wymagało 

akrobatycznych wyczynów. Klawisze należy dobierać na podstawie częstości 
użycia, a nie położenia skojarzonych z nimi elementów. Jeśli dwóm kontrolkom 
odpowiada ten sam, łatwy do skojarzenia klawisz, to należy go przypisać 
kontrolce częściej używanej, a nie koniecznie tej, która występuje na 
formularzu jako pierwsza. Rzadko używanej kontrolce należy przypisać inny 
klawisz skrótu. 

„Standardowym przyciskiem powinien być przycisk 

Dodaj

, a 

nie 

OK

W przeciwieństwie zwykłych formularzy do przetwarzania danych 
transakcyjnych, omawiane formularze przeznaczone są w zasadzie wyłącznie 
do dodawania rekordów. Dodanie kilku kolejnych rekordów odbędzie się 

background image

234 

Część I 

znacznie szybciej, jeśli domyślnym przyciskiem na formularzu będzie właśnie 
Dodaj, powodujący dopisanie danych do bazy. 

„Formularze do wprowadzania danych powinny być jak najmniejsze. Umożliwia 

to okresowe zmiany ich położenia na ekranie, a to z kolei odciąża wzrok 
operatora. Operatorzy, wprowadzający dane, będą spoglądać przede wszystkim 
na dokumenty źródłowe, dlatego okno formularza na ekranie powinno po 
otwarciu przyjąć standardowy rozmiar (a nie otwierać się jako maksymalnie 
powiększone). 

Projektowanie raportów 

Temat projektowania raportów omawia szczegółowo Rozdział 19. Poniżej zebrano 
szereg ogólnych wskazówek, dotyczących tego zagadnienia: 

„Gdy tylko jest to możliwe, raporty należy projektować przy wykorzystaniu 

komponentów 

QuickReport

, dostępnych w 

Delphi. W 

porównaniu 

z wszelkimi  zewnętrznymi narzędziami do tworzenia raportów, komponenty 

QuickReport

  są prostsze w konfiguracji i użyciu, gdyż stanowią integralną 

część aplikacji. Aby wygenerować raport w 

oparciu o 

komponent 

QuickReport

 nie trzeba opuszczać  głównego programu i uruchamiać 

zewnętrznego narzędzia. 

„Raporty o dużym stopniu komplikacji, których nie da się zrealizować przy 

użyciu komponentów 

QuickReport

, należy w miarę możliwości tworzyć 

graficznym edytorze raportów. Popularne programy tego rodzaju to 

ReportSmith, R&R SQL Report Writer for Windows i Crystal Reports. 
Narzędzia graficzne umożliwiają  użytkownikom wykorzystanie raportów, 
dostarczanych z aplikacją, jako podstawy do tworzenia własnych - nie wymaga 
to modyfikowania programu źródłowego aplikacji. 

„Jeśli wykorzystywana platforma systemowa dopuszcza stosowanie procedur 

pamiętanych, to właśnie w nich (a więc na serwerze) powinna być realizowana 
większość czynności, związanych z generowaniem raportu. W prawidłowo 
zaprojektowanej aplikacji typu klient-serwer większość działań wykonuje 
serwer bazy danych. Użycie procedur pamiętanych ułatwia ponadto testowanie 
mechanizmów raportu, odpowiedzialnych za pobieranie danych z bazy. Testy 
takie można wykonać poza środowiskiem do graficznego projektowania 
raportu. Wreszcie wykorzystanie procedur pamiętanych zapewnia oddzielenie 
funkcji pobierania danych od funkcji ich prezentacji, a to z kolei ułatwia 
ewentualną zmianę narzędzia do projektowania raportów albo pobieranie 
danych raportu bezpośrednio przez aplikację. 

„Jeśli raporty generowane są przez procedury pamiętane, to wywołania tych 

procedur należy rejestrować na serwerze bazy danych. Można to zrealizować 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

235

 

przy użyciu usług  śledzenia danych i operacji serwera (o ile dany serwer 
oferuje takie usługi) albo samodzielnie stworzyć podprogramy, rejestrujące 
wywołania. Aktualizacja rejestru operacji serwera odbywa się w takim 
wypadku zarówno przed, jak i po wykonaniu procedury. Rejestrowanie 
wywołań pozwala uzyskać cenne informacje o wydajności generowania 
raportów, a 

także o 

częstotliwości i 

czasie sporządzania poszczególnych 

raportów przez użytkowników. Poniżej przedstawiono polecenie utworzenia 
przykładowej procedury rejestrującej. Polecenie zapisane jest w dialekcie 
Transact-SQL (używanym w systemach Sybase i Microsoft SQL Server): 

CREATE PROCEDURE reportlog @StartEnd char(6),@ReportName  

 

char(30) as 

insert into REPORTLOG 
select @StartEnd, getdate(), suser_name(), @ReportName 

Przygotowaną procedurę można wywoływać w następujący sposób: 

/*  
Zarejestruj pocz

ątek procedury raportu

 

*/ 
exec reportlog 'STARTED','MAINTENANCE REPORT BY WORK TYPE' 
/* 

Wykonaj właściwą procedurę

 

*/ 
... 
/* 

Zarejestruj zakończenie procedury raportu

 

*/ 
exec reportlog 'ENDED', 'MAINTENANCE REPORT BY WORK TYPE' 

WSKAZÓWKA: 

Niektóre systemy zarządzania bazami danych oferują gotowe mechanizmy 
monitorowania procedur pamiętanych. Mechanizm dostępny np. w systemie 
Sybase SQL Server pozwala uzyskać w zasadzie te same informacje, jakich 
dostarcza prezentowana powyżej procedura. 

„W nagłówku strony raportu należy umieścić wewnętrzną nazwę raportu, 

aktualną datę i godzinę oraz identyfikator użytkownika, sporządzającego raport. 
Informacja o dacie i godzinie pozwala odróżnić poszczególne wersje raportu 
i określić jego wiek, jeśli między sporządzeniem raportu a jego analizą upłynął 
dłuższy czas. Wewnętrzna nazwa raportu umożliwia z kolei zlokalizowanie 
jego "tekstu źródłowego", jeśli zajdzie konieczność wprowadzenia modyfikacji. 
Identyfikator użytkownika informuje, do kogo należy się zwrócić celem 
przedyskutowania ewentualnych problemów. Na rysunku 7.6 przedstawiono 
prawidłowo zaprojektowany nagłówek raportu. 

background image

236 

Część I 

„W nagłówku strony należy także wyszczególnić wszystkie kryteria, jakie 

zastosowano przy umieszczaniu danych w 

raporcie. Jeśli użytkownik 

wprowadził graniczne daty albo inne kryteria wpływające na zawartość raportu, 
to powinny one znaleźć się w nagłówku. Kryteria zadane przez użytkownika 
mogą spowodować pominięcie części danych w raporcie. Jeśli nagłówek nie 
będzie zawierał wystarczających informacji, to odbiorca raportu może 
dopatrywać się pomyłki lub wyciągnąć błędne wnioski z analizy. Problem ten 
jest odczuwalny zwłaszcza w sytuacji, gdy między sporządzeniem raportu 
a jego  analizą upływa dłuższy czas. Nagłówek, widoczny na Rysunku 7.6, 
zawiera kryteria doboru danych do raportu. 

„Nagłówki powinny być zapisywane czcionką proporcjonalną, a dane - czcionką 

o stałej szerokości. Czcionki proporcjonalne poprawiają estetykę raportu 
i pozwalają w pełni wykorzystać możliwości nowoczesnych drukarek, którymi 
dysponuje obecnie większość  użytkowników. Odróżniają ponadto raporty 
sporządzone przy użyciu współczesnych systemów, działających w oparciu 
o komputery PC, od odpowiednich dokumentów wygenerowanych przez starsze 
systemy komputerowe poprzedniej generacji. Niestety, czcionki proporcjonalne 
nie nadają się do zapisywania danych tabelarycznych, gdyż nie pozwalają na 
wyrównywanie kolumn. Cyfra 1 może w druku okazać się węższa niż np. 5. Do 
zapisu danych liczbowych w kolumnach należy zatem stosować czcionki 
o stałej szerokości. Jako przykłady czcionek proporcjonalnych, odpowiednich 
do użycia w nagłówku, wymienić można Arial i Times New Roman. Z kolei 
typową czcionką o stałej szerokości, używaną w głównej części raportu, jest 
Courier New. 

 

Rysunek 7.6. 
Prawidłowo 
zaprojektowany 
raport. 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

237

 

„Jeśli w raporcie mają znaleźć się napisy podkreślone, to należy zastosować 

odpowiedni atrybut czcionki, a nie jakiekolwiek inne środki zastępcze. Wiele 
edytorów raportów umożliwia uzupełnianie tekstu elementami graficznymi, 
takimi jak linie i prostokąty. Wykorzystanie tych możliwości do uzyskania 
podkreślenia niepotrzebnie zwiększa zapotrzebowanie na pamięć drukarki 
i czas generowania raportu. Linie traktowane są bowiem jako elementy 
graficzne. 

Inną powszechną praktyką, wywodzącą się z czasów drukarek wierszowych, jest 

uzyskiwanie efektu podkreślenia przy pomocy znaku _. Rozwiązanie to 
pochłania dodatkowe wiersze, gdyż podkreślenie drukowane jest 
w rzeczywistości w oddzielnej linijce, poniżej właściwego napisu. Ponadto 
w przypadku zastosowania czcionki proporcjonalnej trudno jest uzyskać żądaną 
długość linii, dokładnie odpowiadającą szerokości kolumny. 

„Liczby o charakterze wartości (kwoty, ilości, itp.) należy wyrównywać do 

prawej strony. Liczby, które pełnią rolę identyfikatorów (numery faktur, itp.), 
powinny być wyrównane do lewej. 

„Do wyróżnienia niektórych elementów raportu wykorzystać można 

zaawansowane funkcje formatowania wydruku, takie jak cieniowanie 
i pogrubienie czcionki. Nie ma powodu, aby rezygnować z możliwości 
oferowanych przez współczesne drukarki. Ich pełne wykorzystanie poprawi 
estetykę raportu. Drukarki stosowane powszechnie jeszcze kilka lat temu nie 
dysponowały wieloma funkcjami, które w dzisiejszych urządzeniach tego typu 
uznawane są za standardowe. Należy jednak zwrócić uwagę na dostosowanie 
postaci graficznej raportu do rzeczywistych możliwości drukarki używanej 
przez klienta. 

„Projektowane raporty należy jak najwcześniej prezentować klientom, którzy 

zweryfikują koncepcję merytoryczną i graficzną, zaproponowaną przez autora 
aplikacji. Raporty mogą być - podobnie jak formularze Delphi - projektowane 
przy aktywnym współudziale przyszłych użytkowników. Pozwala to zmniejszyć 
ryzyko nieporozumień i uniknąć ewentualnych przeróbek. 

Testowanie aplikacji pod kątem zgodności z zakładanym 
przeznaczeniem i zakresem funkcji 

Tematowi testowania aplikacji i kontroli jakości oprogramowania można by 
poświęcić oddzielne opracowanie. Poniżej zaprezentowano jedynie niewielki zbiór 
sugestii, dotyczących testowania tworzonych aplikacji: 

„Zgłaszanie wszelkich anomalii, wykrytych podczas testowania i użytkowania 

aplikacji, powinno odbywać się zgodnie z formalną, zdefiniowaną uprzednio 
procedurą. Powszechnie stosuje się w tym celu specjalne formularze, a nawet 

background image

238 

Część I 

niewielkie aplikacje. Każde zgłoszenie powinno być opatrzone numerem 
i zawierać opis czynności, które należy wykonać, aby wywołać anomalię. 
Należy też każdorazowo zaznaczać rodzaj zgłoszenia (informacja o błędzie, 
sugestia lub zapytanie) oraz zapisywać odpowiedź autora (autorów) programu 
na zgłoszenie. 

„Należy przygotować mechanizm prostego i sprawnego rozsyłania uaktualnień 

i poprawionych wersji programu. Jedna ze sprawdzonych metod opiera się na 
zastosowaniu niewielkiej aplikacji, która uruchamiana jest automatycznie 
z folderu Autostart systemu Windows na komputerze użytkownika. Aplikacja 
taka porównuje datę i godzinę utworzenia pliku wykonywalnego na lokalnym 
dysku z datą i godziną pliku na serwerze sieciowym lub serwerze dostępnym 
przez linie komutowane. Jeśli lokalna wersja okaże się nieaktualna, to program 
automatycznie zastąpi ją nową wersją. 

„Wszystkie wersje aplikacji powinny być numerowane. Aplikacja powinna na 

żądanie wyświetlać numer wersji. Poboczny numer wersji należy zwiększać 
wraz z każdym rozesłanym uaktualnieniem, nawet jeśli ma ono jedynie 
charakter poprawki, niwelującej wykryty błąd. Jak już wcześniej wspomniano, 
numer wersji należy dołączać do aplikacji, korzystając z 

zasobu 

VERSIONINFO (zob. rozdział 13). 

„Należy zawsze postawić pytanie, czy aplikacja realizuje funkcje zgodne 

z pierwotnie  zakładanym przeznaczeniem. Oto przykład poprawnie 
postawionego pytania: "Czy aplikacja efektywnie wspomaga zarządzanie 
wynajmowanymi nieruchomościami?". 

„Cechy stworzonej aplikacji należy porównać z pierwotnie zdefiniowanymi 

wymaganiami operacyjnymi, funkcjonalnymi i technicznymi. Należy upewnić 
się, czy funkcje, które ostatecznie zostały uwzględnione w 

aplikacji, 

odpowiadają kluczowym funkcjom, określonym w oryginalnej specyfikacji. 

„W miarę możliwości należy przygotować oddzielny komputer w konfiguracji 

identycznej z tą, w której aplikacja ma działać. Aplikacja powinna zostać 
wstępnie zainstalowana i przetestowana w takim systemie. Szczególną uwagę 
należy zwrócić na zastosowanie w testowym komputerze procesora, pamięci 
operacyjnej i dyskowej oraz karty graficznej, odpowiadających stosowanym na 
komputerach klientów. Podobnie wskazane jest użycie tych samych systemów 
operacyjnych. Jeśli użytkownik korzysta z Windows NT, to aplikację należy 
testować w systemie Windows NT; jeśli użytkownik pracuje w Windows 95, 
aplikacja powinna być testowana właśnie w tym systemie. Celowe jest również 
uruchamianie wraz z testowana aplikacją wszelkich programów, stosowanych 
intensywnie przez przyszłych użytkowników. Pozwoli to wykryć ewentualne 
niezgodności. 

background image

 

Projektowanie aplikacji w modelu klient/serwer 

239

 

„Należy starannie przetestować działanie więzów bazy danych. Testowanie 

powinno obejmować próbę wprowadzenia niepoprawnych danych do bazy. 
Jeśli testowane więzy narzucają maksymalne i 

minimalne wartości 

dopuszczalnych danych, to konieczne jest przetestowanie zarówno górnego, jak 
i dolnego ograniczenia. Innym istotnym testem jest próba usunięcia wierszy, 
zawierających klucze zależne. Należy także sprawdzić, czy baza danych nie 
zezwoli na wprowadzenie dwóch identycznych wartości do kolumn, które 
powinny zawierać wartości unikalne. Inny test polega na niewypełnieniu pól 
formularza, które wymagają wpisania wartości. 

„Testowaniu powinny zostać poddane mechanizmy pracy współbieżnej. Jeśli 

aplikacja ma obsługiwać 20 użytkowników, pracujących jednocześnie, to 
należy ją przetestować w sytuacji, gdy równolegle pracuje 30 lub 40 
użytkowników. Osoby testujące powinny próbować jednocześnie aktualizować 
zawartość tego samego wiersza; testy powinny też obejmować próbę usunięcia 
wiersza, który w danej chwili jest poddawany edycji przez innego użytkownika. 
Konieczne jest przetestowanie mechanizmów blokowania bazy danych, 
gwarantujących,  że zmiany wprowadzane równolegle przez wielu 
użytkowników nie zostaną utracone i 

będą pojawiać się w 

bazie 

w odpowiednim czasie. 

„Jeśli aplikacja funkcjonuje w oparciu o serwer bazy danych albo sieciowy 

system operacyjny, konieczne jest przetestowanie mechanizmów kontroli 
dostępu. Prawidłowo powinien działać mechanizm blokujący dostęp po 
kilkakrotnym błędnym podaniu hasła. Poszczególni użytkownicy muszą 
dysponować prawami dostępu, umożliwiającymi im korzystanie 
z przewidzianych dla nich funkcji aplikacji. W ramach testu należy podjąć 
próbę  złamania praw dostępu na każdym ze zdefiniowanych poziomów 
uprawnień. Testy powinny też obejmować próbę usunięcia i zmiany wierszy 
przez osobę, zalogowaną jako użytkownik bez właściwych uprawnień.  

„Przed udostępnieniem aplikacji klientom powinny ją przetestować osoby nie 

związane z projektem oraz współpracownicy autorów programu. 

„Jeśli aplikacja będzie szerzej rozpowszechniana, to jej wersje "beta" powinny 

być testowane przez specjalnie wyznaczoną grupę  użytkowników. Testy takie 
należy przeprowadzać zanim aplikacja zostanie publicznie udostępniona. 

„Należy przeprowadzić testy praktycznej przydatności aplikacji dla 

użytkowników o różnym stopniu zaawansowania. Może się okazać, że aplikacja 
działa poprawnie, ale jest zbyt trudna w obsłudze. Tego rodzaju problemy 
można wykryć, udostępniając aplikację do testów użytkownikom 
o zróżnicowanych umiejętnościach i doświadczeniu. 

„Ostatnie słowo przy ocenie przydatności aplikacji należy zawsze do 

użytkownika. 

background image

240 

Część I 

Instalowanie aplikacji 

Przygotowanie aplikacji do zainstalowania omawia szczegółowo Rozdział 
29.Poniższe sugestie mogą pomóc w opracowaniu ogólnego planu instalacji: 

„Jak już wspomniano, przed pierwszą  właściwą instalacją należy przygotować 

oddzielny komputer, możliwie wiernie oddający  środowisko końcowego 
użytkownika, i dokonać na nim próbnej instalacji.  

„Należy unikać ingerencji w 

system użytkownika,  a w szczególności 

nieuzasadnionych zmian jakichkolwiek parametrów konfiguracyjnych. 

„Przed zainstalowaniem aplikacji należy zapoznać się z 

docelowym 

środowiskiem systemowym i zdecydować, czy konieczne jest uzupełnienie go 
o dodatkowy  sprzęt lub oprogramowanie. Na przykład, jeśli aplikacja 
komunikuje się z systemem zarządzania bazą danych za pośrednictwem 
protokołu TCP/IP, to na komputerach klientów musi być zainstalowana obsługa 
tego protokołu. Czasami ocenę i 

uzupełnienie docelowego środowiska 

przeprowadzać trzeba we współpracy z administratorem sieci. 

„Instalację aplikacji i wszelkich plików pomocniczych powinien realizować 

oddzielny program instalacyjny. Do tworzenia takich programów wykorzystać 
można narzędzie InstallShield Express, dostarczane w pakiecie Delphi i opisane 
szerzej w rozdziale 29.