Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
ABC Delphi 6
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Wstp ............................................................................................... 5
Rozdzia 1. Elementarz Object Pascala................................................................. 7
Moduy ................................................................................................................................7
Program gwny ..................................................................................................................8
Stae...................................................................................................................................10
Zmienne.............................................................................................................................11
Typy cakowite..................................................................................................................12
Typy rzeczywiste...............................................................................................................12
Typ Currency.....................................................................................................................13
Typy logiczne....................................................................................................................13
Typy znakowe ...................................................................................................................13
Typy acuchowe ..............................................................................................................14
Literay acuchowe ..........................................................................................................14
Tablice...............................................................................................................................15
Rekordy .............................................................................................................................16
Typ okrojony .....................................................................................................................18
Typ mnogociowy .............................................................................................................18
Typ wyliczeniowy .............................................................................................................19
Typ Variant .......................................................................................................................19
Operatory...........................................................................................................................20
Wskazania i adresy............................................................................................................21
Instrukcje sterujce przebiegiem programu ......................................................................22
Instrukcja warunkowa If...Then ..................................................................................22
Instrukcja warunkowa Case...Of.................................................................................23
Instrukcja iteracyjna Repeat...Until ............................................................................24
Instrukcja iteracyjna While...Do .................................................................................25
Instrukcja iteracyjna For...To...Do..............................................................................26
Procedura przerwania programu Break ......................................................................26
Procedura przerwania programu Exit .........................................................................27
Procedura wyjcia z programu Halt............................................................................27
Procedura zatrzymania programu RunError ...............................................................27
Procedura kontynuacji programu Continue ................................................................28
Procedury ..........................................................................................................................28
Parametry formalne.....................................................................................................29
Funkcje ..............................................................................................................................31
Moduy na powanie .........................................................................................................32
Podsumowanie ..................................................................................................................34
ABC Delphi 6
Skorowidz...................................................................................... 127
Rozdzia 4.
Object Pascal
w wydaniu Delphi
Rozdzia ten powicony jest omwieniu praktycznych sposobw wykorzystania poznanych wczeniej elementw jzyka Object Pascal w graficznym rodowisku Delphi 6.
Zapoznamy si tutaj m. in. z pojciem formularza, wyjtku czy procedury obsugi zdarzenia. Poznamy rwnie metody wykorzystania w aplikacji wasnych funkcji i procedur. Zastosowanie omwionych elementw Delphi zostanie zilustrowane odpowiednimi wiczeniami.
Formularz
Formularz jest pierwszym obiektem, z ktrym spotykamy si, rozpoczynajc pisanie
aplikacji. Po dwukrotnym klikniciu w obszarze formularza dostajemy si do okna
edycji kodu moduu Unit1.pas, ktry pokazany jest na rysunku 4.1.
Object Pascal oferuje nam sowo kluczowe , pozwalajce na tworzenie obiektw.
Przykadowa definicja klasy formularza wyglda nastpujco:
!
!
50
ABC Delphi 6
Rysunek 4.1.
Okno edycji kodu
gwnego moduu
aplikacji
Z zapisu tego odczytamy, i formularz jest zmienn obiektow, natomiast nazwa klasy staa si nowym specyfikatorem typu danych.
W definicji klasy moemy zauway procedur:
Delphi odpowiednio inicjuje formularz (tylko jeden raz), kiedy jest on tworzony po
raz pierwszy. Sender jest pewn zmienn typu TObject, woan przez warto. W rzeczywistoci Sender reprezentuje pewn waciwo, polegajc na tym, i kady
obiekt cznie z formularzem (oraz kady obiekt VCL i CLX) musi by w pewien
sposb poinformowany o przyszym przypisaniu mu pewnego zdarzenia (w przypadku formularza zdarzenie to polega na jego inicjalizacji).
TObject jest bezwzgldnym przodkiem wszystkich komponentw i obiektw VCL
oraz CLX i umieszczony jest na samym szczycie hierarchii obiektw.
Z rysunku 4.1 moemy odczyta, i standardowa definicja klasy skada si z kilku czci. Sekcja public suy do deklarowania funkcji i procedur (czyli metod) oraz zmiennych (zwanych polami), ktre w przyszoci mog by udostpniane innym. Zasadnicz rnic pomidzy metodami a zwykymi funkcjami czy procedurami jest to, e
kada metoda posiada niejawny parametr Self, wskazujcy na obiekt bdcy przedmiotem wywoania tej metody. Sekcj public czsto nazywamy interfejsem obiektu.
Sekcja private przeznaczona jest dla pl i metod widzianych jedynie wewntrz klasy.
51
Oprcz elementw wymienionych, definicja klasy moe posiada jeszcze sekcje protected oraz published. W czci protected mona definiowa pola i metody widoczne
dla macierzystej klasy i klas po niej dziedziczcych. Deklaracje zawarte w sekcji published (publikowanej) peni tak sam rol, jak deklaracje umieszczone w sekcji
public (publicznej). Rnica pomidzy nimi polega na tym, i te pierwsze nie tworz
tzw. informacji czasu wykonania.
Zdarzenia
Zdarzenie (ang. event) okrelane jest jako zmiana, ktra wystpuje w aktualnym stanie obiektu i jest rdem odpowiednich komunikatw, przekazywanych do aplikacji
lub bezporednio do systemu. Reakcja obiektu na wystpienie zdarzenia udostpniana
jest aplikacji poprzez procedur obsugi zdarze (ang. event procedure) bdc wydzielon czci kodu. Rol zdarze w aplikacji najlepiej jest przeledzi, wykonujc
praktyczne wiczenie.
Tradycyjnie ju zaoymy na dysku nowy katalog. Po uruchomieniu Delphi 6 znanymi nam ju poleceniami menu zapiszmy w nim gwny modu aplikacji, ktry nazwiemy Unit_08.pas. Zapiszmy rwnie projekt aplikacji pod nazw Projekt_08.dpr.
Rozmiary formularza ustalimy, korzystajc z cech Height (wysoko) i Width (szeroko), znajdujcych si w karcie waciwoci (Properties) Inspektora Obiektw. Jeeli
chcemy, aby po uruchomieniu formularz nie rozpywa si po ekranie w odpowiedzi na kliknicie pola maksymalizacji, w Inspektorze Obiektw rozwimy cech Constraints (ograniczenie) i we waciwe miejsca wpiszmy dane rozmiary formularza
(w pikselach), tak jak pokazano na rysunku 4.2.
Rysunek 4.2.
Ograniczenie
rozmiarw
formularza
Przejdmy nastpnie do cechy Position i wybierzmy poScreenCenter. Wybrane przypisanie spowoduje, e w momencie uruchomienia aplikacji formularz pozostanie
w centrum ekranu (ale nie pulpitu poDesktopCenter); jeeli oczywicie w Inspektorze
Obiektw cechy Align (zakotwiczenie) nie ustawilimy inaczej ni w pozycji alNone.
Na tak przygotowanym formularzu umiemy teraz dwa komponenty reprezentujce
klas TButton z karty Standard. Korzystajc z Inspektora Obiektw oraz z karty waciwoci, cechy Caption przyciskw Button1 oraz Button2 zmiemy odpowiednio na
&Zamknij i &Tekst. Znak &, ktry wystpuje w nazwach przyciskw, spowoduje, e
litera, wystpujca bezporednio za nim, stanowi bdzie klawisz szybkiego dostpu
do procedury obsugi wybranego zdarzenia. W podobny sposb moemy zmieni cechy Font wybranych przyciskw. Dla kadego z przyciskw stworzymy procedur
obsugi odpowiedniego zdarzenia. Klikajc dwukrotnie przycisk Zamknij lub w widoku drzewa obiektw (Object TreeView) odpowiednio oznaczony komponent, dostaniemy si do wntrza waciwej procedury obsugi zdarzenia:
52
ABC Delphi 6
"#
$
%
Ju w tym miejscu moemy zauway, i w definicji klasy program Delphi wygenerowa automatycznie deklaracj przycisku oraz deklaracj procedury obsugujcego
go zdarzenia. Korzystajc z notacji kropkowej, kompilator automatycznie zosta poinformowany, do ktrej klasy naley wywoywana procedura.
Uycie notacji kropkowej stanowi informacj dla kompilatora, e przykadowa procedura Button1Click() naley do przykadowej klasy TForm1 (jest metod zdefiniowan w klasie TForm1).
Naley zawsze pamita, i szkielety procedur obsugi odpowiednich zdarze, np. takich jak
, zostan automatycznie wygenerowane przez Delphi w odpowiedzi na dwukrotne kliknicie danego przycisku. W adnym wypadku procedur
tych nie naley wpisywa samodzielnie.
Omawian procedur obsugi zdarzenia wypenimy przedstawionym poniej kodem,
co spowoduje, e po naciniciu wybranego przycisku aplikacja zostanie zamknita.
"#
$
%
&
"
Powyszy przykad ilustruje sposb odwoywania si do obszaru ptna poprzez waciwo Canvas klasy TCanvas z wykorzystaniem waciwoci czcionka (Font). Zastosowana metoda :
,5.67%
, %
53
Zmiennej (akcja) mona tutaj przypisa jeden z elementw typu wyliczeniowego
&
8.
(.
.
9
2
gdzie:
oznacza, e formularz nie zostanie zamknity;
oznacza, e formularz nie zostanie zamknity, lecz ukryty;
oznacza, e formularz zostanie zamknity z jednoczesnym
54
ABC Delphi 6
55
""
#
""(%)*+
",(%)-./)-.
0 12$
13)40
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
&
&
%
9%#,+.0:
$;
$
<0.0=1%0.
9#>6?8 9#>78@=?78A
73>6?
&
73>8
&
8
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#
$
%
&
"
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
Zajrzyjmy teraz do katalogu, w ktrym zosta zapisany nasz projekt. Oprcz plikw,
wymienionych w rozdziale 1, pojawiy si tam 3 dodatkowe:
.dpp plik Diagram Delphi Page. Mona w nim zapisa diagramy bdce
56
ABC Delphi 6
Deklaracja tworzy list moduw wchodzcych w skad programu. Nazwa moduu
moe by poprzedzona dyrektyw , specyfikujc nazw pliku. Moduy bez dyrektywy s moduami bibliotecznymi i nie stanowi czci kodu rdowego projektu.
57
Korzystajc z tego sposobu definiowania wasnej funkcji lub procedury, moemy wewntrz nich bez problemw odwoywa si do innych obiektw formularza. Wszystkie
wasnoci, cechy, zdarzenia i metody waciwe tym obiektom bd widoczne w naszej funkcji lub procedurze.
58
ABC Delphi 6
Metody przeciane
Chocia mona przypuszcza, i pojcia procedur lub funkcji przecianych (przeadowywanych) naley wprowadza na bardziej zaawansowanym kursie programowania, to jednak wydaje si, i w sytuacji kiedy rodowiska programistyczne staj si
coraz bardziej rozbudowane, powinnimy posiada pewne wiadomoci na ten temat.
Jest to szczeglnie wane w momencie, kiedy zechcemy samodzielnie posugiwa si
plikami pomocy.
Piszc programy w Delphi, moemy zadeklarowa wiele funkcji czy procedur o tej
samej nazwie, ale o rnej postaci argumentw. W momencie wywoania danej procedury czy funkcji kompilator powinien je rozrnia. Do deklaracji procedur (funkcji)
przeadowywanych suy dyrektywa * (przeadowanie). Najlepszym (i jedynym) sposobem zapoznania si z ide funkcji (procedur) przeadowywanych jest samodzielne napisanie prostej aplikacji, w ktrej funkcje te zostan wykorzystane. Stworzymy program wykorzystujcy znane nam ju procedury obliczajce kolejne cakowite
potgi wybranej liczby, ale w ten sposb, by jednoczenie mona byo korzysta z procedur, ktrych parametry woane s przez zmienn i przez warto. Przy okazji zapoznamy si z podstawowymi wasnociami komponentu edycyjnego TMemo.
W skad formularza projektu Kody\09\Projekt_09.dpr bd wchodzi trzy przyciski
bdce reprezentantami klasy TButton oraz jeden reprezentant klasy TMemo. Umiemy je na formularzu w sposb pokazany na rysunku 4.4. W inspektorze obiektw
waciwo Caption formularza Form1 zmiemy na Projekt_09.
Rysunek 4.4.
Podstawowe
elementy formularza
projektu Projekt_
09.dpr
59
60
ABC Delphi 6
9
"I"&7 ,J0;%0J
7 J00J7 2
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
" 1 56,.
.2
%
2
A
%
22F,
9
"I"&7 ,J0;%0J
7 J00J7 2
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#
$
.7%
%
9
"
*+
1 56.GG11M 222
N
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#*
$
%
9
"
1 56'.+GG11M 221 OP
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#'
$
%
&
"
"
Program skompilujemy, korzystajc z klawisza F9 lub opcji menu Run, Run. ledzc
kod programu, moemy te zauway, i w celu skasowania zawartoci komponentu
Memo1 posugujemy si metod .
Wyjtki
Podobnie jak w przypadku metod przecianych, kto mgby powtpiewa w celowo
wprowadzania pojcia wyjtku w kursie programowania, przeznaczonym dla osb
mniej zaawansowanych. Naley jednak zdawa sobie spraw z faktu, i wyjtki jako
obiekty peni bardzo wan rol we wszystkich wspczesnych systemach operacyjnych oraz rodowiskach programowania i pewne wasnoci kompilatora, ktre jeszcze
do niedawna uwaano za bardzo zaawansowane, obecnie ju takimi by przestaj.
61
Znaczenie
?7& %
?7
? A1
?= A1
?: 3
62
ABC Delphi 6
Rysunek 4.5.
Rozmieszczenie i opis
komponentw
reprezentujcych
klas TLabeledEdit
63
W klauzuli /(, przeznaczonej do obsugi bdw, umiecilimy zapis waciwej operacji dzielenia dwch liczb. Funkcje & dokonuj konwersji cigu znakw, przechowywanych w cechach Text komponentw LabeledEdit1 oraz LabeledEdit2, na zmiennopozycyjn posta numeryczn, czyli po prostu na liczby z przecinkami.
Uywajc operatora dzielenia zmiennopozycyjnego /, te dwie liczby podzielimy
przez siebie, natomiast wynik dzielenia zostanie z kolei przypisany cesze Text komponentu edycyjnego reprezentowanego przez LabeledEdit3. Aby posta numeryczna
liczby moga by wywietlana w oknie edycyjnym, musi zosta zamieniona na acuch znakw (w tym wypadku typu string). Dokonujemy tego, stosujc funkcj
& konwertujc posta numeryczn liczby na odpowiedni acuch znakw.
Kade wyraenie /( moe posiada jedn lub wicej sekcji on: %
<
1 ,/23
> , z ktrych kada deklaruje odrbn klas wyjtku. Delphi przeszukuje sekcj w zapisanym porzdku (od gry do dou), poszukujc aktualnie pasujcej klasy wyjtku odpowiadajcego wystpujcemu bdowi.
Oglnie rzecz biorc, kady kod potencjalnie mogcy wygenerowa wyjtek (w naszym przypadku dzielenie zmiennopozycyjne) powinien mie moliwo przekazania
jego obiektu do wyraenia raise (zakacza, zbiera). W tym miejscu naley wykorzysta wasn klas wyjtku % + %1 z konstruktorem
konwertujcym komunikat egzemplarza wyjtku na acuch znakw
9% %
& % A
gdzie argument Args jest tzw. wariantow tablic otwart (array of const), pozwalajc na przekazywanie niejednorodnych komunikatw (Messages).
Moe zdarzy si i taka sytuacja, w ktrej kompilator w sekcji /1(
nie znajdzie pasujcego obiektu wyjtku. Wwczas naley uy konstrukcji /
( :
"#
$
%
I?*", I?",G
I?'",
,
?,?7
?% ? "
9%.S?,"9%T
?,?: 3
?% ? "
9%'.S?,"9%T
64
ABC Delphi 6
"#
$
%
I?*", I?",G
I?'",
,
?,?7
9%#,+.0#MN
2
2
)0.0=1%0.
9#>U
?,?: 3
9%#,+.0 R2 222 0.0=1%0.9#>U
65
"#
$
%
I?*", I?",G
I?'",
,
?,?7
?% ? "
9%.S?,"9%T
GG9%#,+.0#MN
2
2
)0.0=1%0.
9#>U
?,?: 3
?% ? "
9%'.S?,"9%T
GG9%#,+.0 R2 222 0.0=1%0.9#>U
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#'
$
%
&
"
"
Operacje na plikach
Zarwno w Windows, jak i Linux wszelkie operacje wejcia-wyjcia realizowane s
za pomoc czytania z plikw lub pisania do plikw. Wszystkie urzdzenia zewntrzne,
cznie z kocwk uytkownika, traktowane s jako pliki wchodzce w skad szerokiego systemu plikw. Niniejszy podrozdzia powicony jest pewnym aspektom realizacji przez Delphi rnego rodzaju operacji na plikach.
Wikszo operacji plikowych, pochodzcych ze standardowego Pascala, dziaa rwnie w graficznym rodowisku Delphi 6. Przypomnijmy, i standardowo nazwa pliku
moe by zmienn typu File lub TextFile. Wywoaniem procedury
&% 8
%
otwiera istniejcy plik. Tryb otwarcia pliku zaley od przypisania zmiennej FileMode
odpowiedniej wartoci. Domylnie przyjmowana jest warto 2 pozwalajca na odczyt i zapis do pliku. Przypisanie zmiennej FileMode wartoci 0 przed wywoaniem
procedury # spowoduje otwarcie pliku w trybie tylko do odczytu danych, natomiast wartoci 1 w trybie tylko do zapisu. Z kolei procedura
E1 SE
2/ T
66
ABC Delphi 6
tworzy nowy plik z jednoczesnym jego otwarciem. Plik zamykamy, wywoujc procedur:
Zaprojektujmy proste menu, dziki ktremu bdziemy mogli utworzy nowy plik,
wczyta istniejcy i ewentualnie powtrnie zapisa na dysku w wybranym katalogu.
Aby dosta si do okna sucego do tworzenia menu gwnego, naley zaznaczy
komponent MainMenu1, a nastpnie dwukrotnie klikn myszk pole Items karty zdarze inspektora obiektw (oczywicie, ten sam efekt otrzymamy, klikajc dwukrotnie
sam ikon na formularzu). Zmiemy cech Caption (nagwek) na &Plik, pojawi si
wwczas nowe pole obok naszej opcji. W ten sposb moemy tworzy nawet bardzo
rozbudowane menu, ale o tym wszystkim jeszcze sobie powiemy w dalszej czci ksiki.
Teraz jednak wskamy pole poniej i cesze Caption przypiszmy &Nowy, nastpnie
przejdmy do karty Events inspektora obiektw i zdarzeniu OnClick przypiszmy
NewFileClick. Klikajc teraz dwa razy pole &Nowy, od razu znajdziemy si wewntrz
procedury obsugi zdarzenia ,
. Powrmy do okna Form1.MainMenu1
i przejdmy niej. Nastpn opcj zatytuujmy &Otwrz. W karcie zdarze inspektora
obiektw jej cech Name zmiemy na OpenFile, natomiast w karcie zdarze zdarzeniu OnClick przypiszmy FileOpenClick. Dwukrotnie klikajc, dostaniemy si do
wntrza procedury obsugi zdarzenia (
. Procedur t wypenimy odpowiednim kodem:
"
$
7,
3 %
67
%
E
)?"I"
A3%"?,
)
%
&%7.3%"8
E7
1)?7
%
EI7.3
E
)?"I"&3
7
"0?
S0J3%"8
J0T0
W bardzo podobny sposb zaprojektujmy pozostae czci skadowe menu, tak jak
pokazano na rysunku 4.7.
Rysunek 4.7.
Elementy skadowe
gwnego menu
projektu
Projekt_11.dpr
68
ABC Delphi 6
Rysunek 4.8.
Waciwo Filter
klas TOpenDialog
i TSaveDialog
Dymki podpowiedzi do poszczeglnych przyciskw uzyskamy, korzystajc z waciwoci Hint oraz ShowHint. ledzc poniszy wydruk, zauwaymy te, e aby komponenty TOpenDialog i TSaveDialog, niewidoczne przecie w trakcie uruchomienia
programu, generoway zdarzenia, polegajce na wywietleniu odpowiednich okien
dialogowych, naley w funkcjach odpowiednich zdarze skorzysta z metody %
. Plik zapisujemy na dysku, korzystajc z procedury obsugi zdarzenia &*
.
Procedury zdarzeniowe
, +
, (/
, zaimplementowane w odpowiednich przyciskach, zgrupowanych w panelu CoolBar1, korzystaj z metody #4%
(5, #4%
1 +(5,
#4%
(/(5, zapewniajc moliwo usunicia fragmentu tekstu,
wstawienia fragmentu tekstu znajdujcego si w schowku (ang. clipboard) oraz skopiowania fragmentu tekstu do schowka. Moliwe jest rwnie zaznaczenie caoci tekstu
przy wykorzystaniu metody #4%
&. Aby powtrzy ostatnio wykonan (na tekcie) operacj, naley skorzysta z metody #4%
,
ktr moemy ju samodzielnie zastosowa.
Wydruk 4.5. Kod gwnego moduu Unit_11.pas projektu Projekt_11.dpr
=>
A
/1.9%.=..C )
.
.
.3%. .
.
./.#.9
##
E
)?E
)?
3%3%
# #
,#
,#
,#
9999
3%3%
&97
97
8197
69
70
ABC Delphi 6
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
",
$
%
E
)?"
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
> %
%
>
0QHQ0.S?,
8
>.
&
"T
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
$
7,
3 %
%
E
)?"I"
A3%"?,
)
%
&%7.3%"8
E7
1)?7
%
EI7.3
E
)?"I"&3
7
"0?
S0J3%"8
J0T0
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"81
$
%
0#2210
E
)?"I"
E
)?"9A&I?
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"&
$
,
%
A3%"?,
)
%
&%.3%"8
E1
/ I.E
)?",
"0:S0J3%"8
J0T0
E
)?"9A&I?
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
&
&
71
%
&
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
@
#
%
9%#,+. ) '. ) .
9#>6?8 9#>78@=?78A
6?
E=?
8
&I?
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
72
ABC Delphi 6
7
,
?,?7?
)19%0#MN1
$" 1W.0J
0
2$$"0
"0?
S0J8
J0T0
Podczas testowania, a nastpnie analizowania powyszego algorytmu bez trudu zauwaymy, i w pierwszej kolejnoci zostan wykonane instrukcje pomidzy klauzulami
/ oraz /. W nastpnej kolejnoci wykonywane bd instrukcje zawarte pomidzy / i (polegajce na zamkniciu pliku bez wzgldu na to, czy zosta
on otwarty prawidowo, czy nie) niezalenie od rezultatu wykonania pierwszej grupy
instrukcji czytajcych znaki z pliku. Najbardziej zewntrzny blok /(
obrazuje znan nam ju ide obsugi wyjtkw. Pokazany sposb obsugi wyjtkw
nosi angielsk nazw Structural Exception Handling (w skrcie SEH). Dziki zastosowaniu SEH dokonujemy rozdziau miejsca, w ktrym moe wystpi wyjtek (np.
prba otwarcia nieistniejcego pliku) od miejsca, w ktrym bdzie on obsugiwany.
Zastosowany przez nas wyjtek EInOutError jest w rzeczywistoci klas wyjtkw
obsugujcych operacje wejcia-wyjcia.
Tablice otwarte
W stosunku do standardowego jzyka Pascal Delphi znacznie rozszerza pojcie tablicy. Jednym z takich rozszerze s tablice otwarte, ktre z reguy wystpuj w roli parametrw procedur lub funkcji i mog posiada dowolne rozmiary. W przypadku, gdy
procedura lub funkcja nie bdzie modyfikowa zawartoci tablicy otwartej, deklarujemy j za pomoc sowa kluczowego . Sowa kluczowego * uywamy w deklaracji funkcji lub procedury modyfikujcej zawarto takiej tablicy. Poniewa w trakcie dziaania program powinien w jaki sposb kontrolowa aktualny rozmiar takiej
tablicy, musimy wskaza jej doln i grn granic. Do tego celu su funkcje 7,
i 4.
Jako przykad rozpatrzmy prost funkcj &% , obliczajc sum elementw jednowymiarowej tablicy otwartej Data:
A
A?
3 A33
7%
%
E+
A I13(%)3
EEJ3ST
73
Widzimy, e deklaracja tablicy otwartej (z elementami np. typu Double) w charakterze argumentu funkcji przyjmuje bardzo prost posta:
3 A3
Wywoanie w programie funkcji z argumentem w postaci tablicy otwartej nie powinno sprawi adnego kopotu nawet pocztkujcemu programicie Delphi. Wywietlenie
wyniku (np. w komponencie edycyjnym TEdit z karty Standard), zwracanego przez
funkcj &% , moe nastpi w procedurze obsugi wybranego zdarzenia:
"#
$
%
?",
A?
SH.'.*.-.HXT
Widzimy, e w najprostszym wypadku wystarczy wywoa powysz funkcj z argumentem w postaci kolejnych elementw tablicy, zapisanych w nawiasach kwadratowych.
Tablice dynamiczne
Rnica pomidzy tablicami otwartymi i dynamicznymi jest dosy subtelna. Polega
na tym, i deklaracja tablicy uyta jako parametr bez typu indeksu jest tablic
otwart, natomiast tablica bez indeksu, deklarowana jako zmienna lokalna, globalna, pole klasy lub nowy typ danych jest tablic dynamiczn.
Do funkcji (lub procedury) deklarujcej swj argument jako tablic otwart mona
przekazywa tablice dynamiczne. Funkcja ma wtedy dostp do elementw tablicy dynamicznej, jednak nie ma moliwoci zmieni jej rozmiaru. Poniewa tablice otwarte
i dynamiczne s deklarowane identycznie, jedynym sposobem zadeklarowania parametru jako tablicy dynamicznej jest zadeklarowanie nowego typu identyfikatora dla
typu tablicy dynamicznej. Przykad takiego dziaania zosta pokazany poniej, gdzie
rwnie wykorzystano funkcj &% do obliczania sumy wszystkich elementw tablicy dynamicznej Data. Cig liczb w prosty sposb czytany jest z pliku:
"#'
$
3 A3GG
2 2
)1N
GG1 O
3
,
L3
77%
%
&%.0Y"0
E
7+
1)?
%
EI.L
I%)3.I%)3J
74
ABC Delphi 6
3S7TL
E
)?"I"& 3S7T
77J
?",
A?
3
Typ OleVariant
Jako przykad zastosowania w programie typu OleVariant pokaemy, w jaki sposb
bardzo szybko mona stworzy klienta OLE, wywietlajcego aktualn wersj zainstalowanego w systemie PowerPointa, i ewentualnie z poziomu kodu Delphi uruchomi go.
Technologia OLE (ang. Object Linking and Embedding) umoliwia osadzanie, czenie i wzajemn wymian rnych obiektw danych przy jednoczesnej pracy wielu aplikacji Windows (OLE 2).
Ole Automation jest czci standardu OLE 2. Umoliwia zapisywanie w aplikacji
sekwencji dziaa OLE w postaci cigu polece, ktre dany program ma zinterpretowa.
Component Object Model, w skrcie COM jest standardem, pozwalajcym wspdzieli obiekty pomidzy wiele aplikacji. Okrela te zasady komunikacji pomidzy
obiektami. Obiekty takie musz by rozrniane ju na poziomie systemu operacyjnego.
75
76
ABC Delphi 6
%
1 &
"3
&
"
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
%
1 &
"
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#*
$
%
1 &
"L
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
Rekordy w Delphi
Rekord w Delphi odgrywa bardzo podobne znaczenie jak w przypadku standardowego
jzyka Pascal. Jeeli zachodzi w programie konieczno przydzielenia wystarczajcej
iloci pamici dla wikszej liczby zmiennych (elementw), stosowanie w programie
rekordw daje duo lepsze wyniki w porwnaniu z posugiwaniem si klasami, pod
jednym wszake warunkiem, mianowicie zakadamy, e ilo operacji wykonywanych na elementach rekordu bdzie stosunkowo niewielka. Jako przykad wykorzystania w rodowisku graficznym Delphi prostego rekordu rozpatrzmy pewn modyfikacj omawianego wczeniej przykadu rekordu, sucego do przechowywania
informacji o studentach.
Zaprojektujmy formularz skadajcy si z szeciu komponentw TLabeledEdit oraz
piciu TButton. W inspektorze obiektw we wasnoci EditLabel cechy Caption egzemplarzy klasy TlabeledEdit zmiemy odpowiednio na Imi, Nazwisko, Egzamin
Matematyka, Egzamin Fizyka, Egzamin Informatyka oraz Opinia. Wasnoci Caption
komponentw Button1, Button2, Button3, Button4 i Button5 zmiemy odpowiednio na
&Nowy, &Poprzedni, &Zapisz dane, N&astpny i &Koniec. Rozmieszczenie i opis poszczeglnych komponentw, wchodzcych w skad formularza, zatytuowanego Projekt_13, pokazano na rysunku 4.10.
Bez trudu zauwaamy, i komponenty LabeledEdit3, LabeledEdit4 i LabeledEdit5
przechowywa bd liczby, dlatego aby w przyszoci unikn przykrych niespodzianek, w inspektorze obiektw ich cechom Text przypiszmy zerowe wartoci. Cechy
Text pozostaych egzemplarzy klasy TLabeledEdit wyczymy.
77
Rysunek 4.10.
Formularz projektu
Projekt_13.dpr
Jeeli programista nie poda innej deklaracji, plik w Delphi zawsze jest reprezentowany jako sekwencja rekordw o ustalonej dugoci. Dlatego aby uzyska moliwo
sekwencyjnego dostpu do rekordw pliku, musimy zadeklarowa zmienn CurRec
(Current Record).
W sekcji prywatnej klasy zadeklarujemy cztery procedury, ktrych celem bdzie wywietlenie w komponentach edycyjnych aktualnych danych (procedura ShowData),
wyczyszczenie zawartoci komponentw edycyjnych (ClearData), zapisanie w pliku
na dysku aktualnej zawartoci elementw rekordu (SaveData) oraz wczytanie danych
z dysku (LoadData). Ich zapis w sekcji implementacji moduu bdzie bardzo prosty:
78
ABC Delphi 6
")13
%
I?","7
I?'","821$
I?*", "?%2
9
I?-", "?%2
2
I?X", "?%2
7A
I?4","Z$
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"I3
%
E.
)13
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
" 3
%
I?",00
I?'",00
I?*",0+0
I?-",0+0
I?X",0+0
I?4",00
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"3
%
"7
I?",
"821$I?'",
"?%2
9 I?*",
"?%2
2 I?-",
"?%2
7A I?X",
"Z$I?4",
/ .
79
I3
%
3
E1
80
ABC Delphi 6
81
82
ABC Delphi 6
"?%2
9 I?*",
"?%2
2 I?-",
"?%2
7A I?X",
"Z$I?4",
/ .
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#X
$
%
3
&
"
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#*
$
%
3
)13
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
%
3
E
+
&%.03"0
A?,03"0)
%
E
1)?
I3
%
3
E1
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#
$
%
7
E
.
$. E
?
3
3
$. E
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#'
$
%
A E
H[+)
%
E
+
$. E
)19%0N%;
2N$$2
0
83
%
7
E
.H
$. E
E.
$. E
)13
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"#-
$
%
7
E
.
$. E
A?)
%
E.
$. E
)13
%
7
E
.HGG
.
E
E
H
$. E
)19%0N%;$
$2
0
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"
Podsumowanie
Celem niniejszego rozdziau byo zaprezentowanie Czytelnikom pewnych bardzo
wanych poj, z ktrymi nader czsto spotykamy si, tworzc aplikacje w nowoczesnym
rodowisku Delphi 6. Chocia moe si wydawa, i omawianie na kursie programowania dla osb mniej zaawansowanych takich terminw, jak metody przeadowywane,
wyjtki i klasy wyjtkw, tablice otwarte i dynamiczne, serwery COM czy przeszukiwanie rekordw moe by czynnoci na wyrost, to jednak naley zdawa sobie
spraw, e obecnie terminy te posiadaj ju zupenie fundamentalne znaczenie i ich
znajomo (chociaby pobiena) daje nam przepustk do samodzielnego studiowania
plikw pomocy, ktre s nieocenionym i bogatym rdem informacji o kompilatorze.