You are on page 1of 38

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

ABC Delphi 6

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

Autor: Andrzej Daniluk


ISBN: 83-7197-504-X
Format: B5, stron: 136
Przykady na ftp: 1002 kB

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Delphi 6 to kolejna wersja popularnego rodowiska programistycznego firmy Borland,


sucego do szybkiego tworzenia aplikacji za pomoc jzyka ObjectPascal. W Delphi
napisano ju wiele profesjonalnych aplikacji, co nie oznacza, i jest ono rodowiskiem
wycznie dla zawodowcw. Wrcz przeciwnie, dziki prostocie obsugi i zaletom
wzorowanego na Pascalu jzyka ObjectPascal, jest ono doskonaym narzdziem dla
pocztkujcych programistw, take dla tych, ktrzy nie mieli wczeniej wiele
wsplnego z programowaniem obiektowym.
Dla nich wanie przeznaczona jest ta ksika omawiajca:

Podstawy programowania w jzyku ObjectPascal


Projektowanie zorientowane obiektowo (OOD)
Zintegrowane rodowisko programistyczne
ObjectPascal w wydaniu Delphi 6
Biblioteki VCL i CLX
Tworzenie wasnych komponentw
Biblioteki DLL

Pomoc w zgbianiu tajnikw Delphi 6 jest 19 kompletnych przykadowych projektw,


ilustrujcych najwaniejsze wiczenia. Po przeczytaniu ABC Delphi 6, bdziesz mg
samodzielnie pisa aplikacje dziaajce w rodowisku Windows. Ksika stanowi take
doskonay wstp do innych, bardziej zaawansowanych pozycji, omawiajcych Delphi.

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

Rozdzia 2. Projektowanie obiektowe OOD ......................................................... 35


Klasa ...........................................................................................................................35
Obiekt..........................................................................................................................35
Metody ........................................................................................................................36
Widoczno obiektw.................................................................................................36
Wspdziaanie obiektw............................................................................................36
Implementacja obiektu................................................................................................36
Dziedziczenie..............................................................................................................36
Podsumowanie ..................................................................................................................36

Rozdzia 3. rodowisko programisty IDE ........................................................ 37


Biblioteka VCL .................................................................................................................39
Karta Standard ............................................................................................................40
Karta Additional..........................................................................................................41
Karta Win32................................................................................................................43
Karta System...............................................................................................................45
Karta Dialogs ..............................................................................................................46
Biblioteka CLX .................................................................................................................47
Karta Additional..........................................................................................................48
Karta Dialogs ..............................................................................................................48
Podsumowanie ..................................................................................................................48

Rozdzia 4. Object Pascal w wydaniu Delphi ....................................................... 49


Formularz ..........................................................................................................................49
Zdarzenia...........................................................................................................................51
Wykorzystujemy wasne funkcje i procedury...................................................................56
Metody przeciane...........................................................................................................58
Wyjtki ..............................................................................................................................60
Operacje na plikach...........................................................................................................65
Strukturalna obsuga wyjtkw.........................................................................................71
Tablice otwarte..................................................................................................................72
Tablice dynamiczne...........................................................................................................73
Typ OleVariant..................................................................................................................74
Rekordy w Delphi .............................................................................................................76
Podsumowanie ..................................................................................................................83

Rozdzia 5. Biblioteka VCL................................................................................. 85


Komponenty TActionList, TImageList, TOpenDialog, TSaveDialog i TMainMenu ......85
Komponenty TActionManager i TActionMainMenuBar .................................................91
Komponenty TFrame, TSpinEdit i TStaticText................................................................96
Hierarchia wasnoci obiektw. Waciciele i rodzice....................................................100
Konstruktor i Destruktor ...........................................................................................102
Podsumowanie ................................................................................................................103

Rozdzia 6. Biblioteka CLX............................................................................... 105


Komponenty TTimer i TLCDNumber ............................................................................105
Podsumowanie ................................................................................................................109

Rozdzia 7. Tworzymy wasne komponenty ....................................................... 111


Podsumowanie ................................................................................................................117

Rozdzia 8. Biblioteki DLL ................................................................................ 119


Podsumowanie ................................................................................................................126

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:


  

   
   
 
   !

    !


Zdefiniowana klasa dziedziczy wasnoci bazowej klasy formularza TForm, natomiast


sam formularz, traktowany jako zmienna obiektowa, deklarowany jest jako:





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.

Rozdzia 4. Object Pascal w wydaniu Delphi

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.
   
"#  $  
%
& "



Kady standardowy program Delphi (oparty na formularzu) zawiera pewn zmienn


globaln o nazwie Application typu TApplication. W czasie tworzenia nowego projektu Delphi konstruuje obiekt aplikacji i przypisuje mu wanie zmienn Application.
Obiekty klasy TApplication przechowuj informacje odnonie zasad wsppracy aplikacji z systemem operacyjnym. Informacje te dotycz np. rozpoczynania i koczenia
dziaania aplikacji czy tworzenia okna gwnego programu. Istnieje wiele metod klasy TApplication. Jedn z nich jest  , umoliwiajca zamknicie aplikacji.
Zajmiemy si teraz zaprojektowaniem procedury obsugi zdarzenia przycisku Button2,
ktry nazwalimy Tekst. Po klikniciu tego przycisku, bezporednio na formularzu
zostanie wywietlony prosty tekst. Skorzystamy z tego, i formularz, bdcy w istocie
te komponentem, posiada swoje wasne ptno (ang. canvas), reprezentowane przez
klas TCanvas, posiadajc waciwo Canvas. Procedura obsugi naszego zdarzenia
bdzie wyglda nastpujco:
   
"#' $  
%
""  #
""(%) *+
",(%)-./)-.
0  12$ 13)40


Powyszy przykad ilustruje sposb odwoywania si do obszaru ptna poprzez waciwo Canvas klasy TCanvas z wykorzystaniem waciwoci czcionka (Font). Zastosowana metoda :
   ,5.67%  , %

Rozdzia 4. Object Pascal w wydaniu Delphi

53

pozwala na umieszczenie dowolnego tekstu identyfikowanego przez sta Text


w miejscu formularza o wsprzdnych X, Y (odlego liczona jest w pikselach, natomiast lewy grny rg formularza posiada wsprzdne 0, 0).
Moe rwnie zdarzy si i taka sytuacja, w ktrej zechcemy zamkn formularz, korzystajc bezporednio z jego pola zamknicia (por. rysunek 3.2). Zamykajc w ten
sposb dziaajc aplikacj, naley mie na uwadze fakt, i w Windows 9x bezporedni sposb zamknicia dziaajcego programu moe nie dziaa w peni poprawnie
(nie dotyczy to Win 2000, NT i XP). Aby mie pewno, e w momencie zamknicia
aplikacji wszystkie jej zasoby zostan prawidowo zwolnione, skorzystamy ze zdarzenia  . Klikajc (tylko raz) w obszar formularza w inspektorze obiektw,
przejdmy do zakadki Events (zdarzenia). Zdarzenie   okrelmy jako  
 (rysunek 4.3) i potwierdmy klawiszem Enter.
Rysunek 4.3.
Zdarzenie OnClose

W ten sposb Delphi automatycznie wygeneruje procedur obsugi zdarzenia



   & & 

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

zwolnieniem wszystkich zasobw pamici, z ktrych aktualnie korzysta;


    oznacza, e formularz zostanie zminimalizowany.

54

ABC Delphi 6

Procedur obsugi zdarzenia   wypenimy nastpujcym kodem:


   
"
  
 & & 
%
 9%#,+.0:
$; $ <0.0=1%0.
9#>6?8 9#>78@=?78A
73>6?
&    
73>8
&   8



Skorzystalimy tutaj z omawianej wczeniej instrukcji  oraz z funkcji 


 , wywietlajcej odpowiedni komunikat w okienku dialogowym.
Projekt aplikacji Projekt_08.dpr, wykorzystujcej omawiane zdarzenia, znajduje si
w katalogu Kody\08\, natomiast na wydruku 4.1 zamieszczono kod rdowy moduu
Unit_08.pas.
Wydruk 4.1. Modu Unit_08.pas projektu Projekt_08.dpr
=>+B
 A 

/1.9%.=..
C ) . .
.#.
 


  

# #
#'#
   #  $  
   #' $  
   
   & & 
 
   !

    !








DEF"39!
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"#' $  
%

Rozdzia 4. Object Pascal w wydaniu Delphi

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

wizualizacj logicznych relacji pomidzy widocznymi i niewidocznymi


komponentami, skadajcymi si na cao projektu. Relacje takie mona
uzyska, korzystajc z zakadki Diagram.
 .dfm plik zawierajcy opis formularza. Dyrektywa kompilatora !"#$
lub !"#%&'# %$ docza do projektu zewntrzny plik zasobw, zawierajcy

opis formularza. Plik zasobw jest wczany do kocowego pliku


wynikowego .exe w czasie czenia projektu.
 .res plik zasobw Windows.

adnego z nich nie powinnymy utraci.


Plik projektu Delphi .dpr rodowiska graficznego rni si nieco od swojego odpowiednika aplikacji konsolowych. Programy Delphi s bardzo krtkie. Wynika to z faktu, i
aplikacje z interfejsem graficznym zazwyczaj wywouj procedur inicjalizacyjn (
(   )   , nastpnie tworzony jest formularz (lub formularze) Application.CreateForm(TForm1,Form1), w ktrym uruchamiane s procedury obsugi zdarze
((   # . Aplikacja zamykana jest poprzez gwny formularz w odpowiedzi
na wywoanie procedury obsugi odpowiedniego zdarzenia ((    
(patrz wydruk 4.1). Typowy plik kodu rdowego projektu Delphi przedstawiony jest
na wydruku 4.2.

56

ABC Delphi 6

Wydruk 4.2. Typowy plik programu Delphi


 % 
 $>+B


.
=>+B0=>+B"0
!
DEF"E?!
%
& "72
& " 

.

& "E
"

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.

Wykorzystujemy wasne funkcje


i procedury
Wasne procedury i funkcje moemy umieszcza w programie Delphi na par sposobw.
Zapoznamy si teraz z dwoma sposobami najprostszymi i najczciej stosowanymi.
Definicj funkcji lub procedury umieszczamy bezporednio w kodzie programu w sekcji
implementacji moduu:







DEF"A
!
    1 '8 ,7% 7% 

.27% 
%
2 
A  
%
2 2F,

"9
 "I"&7 ,J0;%0J
7 J0 0J7 2



Wywietlanie kolejnych liczb cakowitych, bdcych kolejnymi potgami cakowitego


parametru x, dokonywane jest w komponencie edycyjnym Memo1, bdcym reprezentantem klasy TMemo z karty Standard. Poniewa nasza procedura nie zostaa zadeklaro-

Rozdzia 4. Object Pascal w wydaniu Delphi

57

wana w definicji klasy formularza, wic odwoanie si w jej wntrzu do odpowiedniego


komponentu edycyjnego wymaga, aby jawnie wskaza, i komponent ten naley do
formularza Form1. Wywietlanie kolejnych liczb cakowitych dokonywane jest za porednictwem funkcji ) & formatujcej warto liczbow (warto w postaci
liczby cakowitej) na odpowiedni acuch znakw.
Duo subtelniejszym (ale nie zawsze opacalnym sposobem) jest uczynienie funkcji
lub procedury jawnym obiektem klasy formularza TForm1. Naley wwczas definicj
nagwkow funkcji lub procedury uzupeni o nazw klasy, do ktrej ma przynalee. Musimy ponadto omawiane funkcje lub procedury zadeklarowa w definicji klasy
w jednej z sekcji, np.


  

# #
9
 9

#'#
#*#
   #  $  
   #' $  
   #* $  
 
   !
    1 '8,. 

    !








DEF"A
!
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
" 1 '8,. 

.2 
%
2 
A  
%
2 2F,
9
 "I"&7 ,J0;%0J
7 J0 0J7 2



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

W inspektorze obiektw wasnoci Caption komponentw Button1, Button2 i Button3


zmiemy odpowiednio na &Oblicz wywoanie przez zmienn, &Zamknij i O&blicz
wywoanie przez warto. Mona rwnie skorzysta z ich wasnoci Font, aby
dobra odpowiedni czcionk. Naley oczywicie pamita o uprzednim zaznaczeniu
wybranego komponentu, np. poprzez pojedyncze kliknicie go mysz.
Poniewa naley si spodziewa, i w komponencie edycyjnym Memo1 bd wywietlane kolejne liczby, musimy zadba o moliwo pionowego przewijania zawartoci
tego komponentu. W tym celu w inspektorze obiektw jego waciwo ScrollBars
ustalmy jako ssVertical. Jeeli zechcemy, aby zawarto komponentu moga by przewijana zarwno w pionie, jak i w poziomie, wystarczy wybra ssBoth.

Rozdzia 4. Object Pascal w wydaniu Delphi

59

W momencie wybrania reprezentanta klasy TMemo, w oknie edycji zobaczymy jego


nazw. Aby nie bya ona wywietlana, naley skorzysta z wasnoci Lines i poprzez
TStrings w oknie edytora skasowa napis Memo1. Kiedy wszystkie potrzebne komponenty zostan ju rozmieszczone na formularzu, moemy jego rozmiary odpowiednio do nich dopasowa. W tym celu w inspektorze obiektw jego wasnoci AutoSize
wystarczy przypisa warto True.
Po tych wstpnych czynnociach nie pozostaje nam nic innego jak zaimplementowa
w programie dwie procedury +,-. obliczajce kolejne cakowite potgi Y wybranej liczby cakowitej X. Musimy rwnie wypeni treci procedur odpowiednich
zdarze, podobnie jak zostao to pokazane na wydruku 4.3.
Wydruk 4.3. Kod gwnego moduu Unit_09.pas projektu Projekt_09.dpr, wykorzystujcego
przeciane procedury
=>+K
 A 

/1.9%.=.L .
.C ) . .
.
3%. 


  

# #
9
 9

#'#
#*#
   #  $  
   #' $  
   #* $  
 
   !
    1 56,.  
    1 56 ,.7%  

    !








DEF"A
!
   
" 1 56 ,.7% 

.27% 
%
2 
A  
%
2 2F,

60

ABC Delphi 6
9
 "I"&7 ,J0;%0J
7 J0 0J7 2


GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
" 1 56,. 

.2 
%
2 
A  
%
2 2F,
9
 "I"&7 ,J0;%0J
7 J0 0J7 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.

Rozdzia 4. Object Pascal w wydaniu Delphi

61

Wyjtki pozwalaj osobie piszcej kod na uwzgldnienie sytuacji, w ktrej program


w jakim momencie wykonywania moe ulec niekontrolowanemu zakoczeniu. Wyjtek moe by umiejscowiony w dowolnej metodzie. W Delphi podstawow klas,
zajmujc si obsug wyjtkw, jest Exception (ang. wyjtek). Klasa ta wywodzi si
bezporednio z klasy TObject. Z kolei z Exception (chod nie bezporednio) wywodzi
si klasa EMathError, bdca z kolei nadklas (klas bazow) dla zbioru niezwykle
uytecznych klas, obsugujcych wyjtki, powstae przy wykryciu przez kompilator
bdw operacji matematycznych na liczbach zmiennopozycyjnych (liczbach dziesitnych). Wyjtki dziedziczce z EMathError zostay przedstawione w tabeli 4.1.
Tabela 4.1. Klasy dziedziczce z EMathError
Klasa wyjtku

Znaczenie

?7& %


Przekroczenie zakresu zmiennoci zadeklarowanego typu danych

?7

Nieprawidowa operacja zmiennoprzecinkowa

? A1

Przekroczenie zakresu typu zmiennoprzecinkowego

?= A1

Warto typu zmiennoprzecinkowego jest zbyt maa

?: 3

Zmiennoprzecinkowe dzielenie przez zero

Delphi posuguje si dwoma wyraeniami przeznaczonymi do obsugi wyjtkw.


Z pierwszym, a zarazem podstawowym z nich, zapoznamy si obecnie. Wyraenie
/(  uaktywnia procedur obsugi wyjtku przejmujc kontrol nad
dalszym wykonywaniem programu, w przypadku gdy zostanie wykonana jaka niedozwolona operacja. Jako przykad niech nam posuy prosty algorytm wykonujcy
operacj zmiennopozycyjnego dzielenia dwch liczb, ktre wprowadzimy do odpowiednich komponentw edycyjnych. Bez trudu moemy przewidzie, i wyjtek powstanie przy prbie wykonania dzielenia na znakach nie bdcych liczbami lub przy
prbie dzielenia przez zero.
Zaprojektujmy bardzo prost aplikacj, wykonujc zmiennopozycyjne dzielenie dwch
liczb, wprowadzanych z klawiatury do dwch nowoczesnych komponentw edycyjnych LabeledEdit1 i LabeledEdit2. Wynik bdzie przechowywany w komponencie
LabeledEdit3.
Stwrzmy nowy formularz projektu Projekt_10.dpr, w skad ktrego wchodzi bd
dwa przyciski (reprezentujce klas TButton) oraz trzy komponenty edycyjne (reprezentujce klas TLabeledEdit z karty Additional). W inspektorze obiektw waciwociom Text komponentw LabeledEdit1 i LabeledEdit2 przypiszmy wartoci 0,0, aby
ich cechy Text nie posiaday wartoci nieokrelonej. Cech Text komponentu LabeledEdit3 wykasujmy. Komponenty reprezentujce klas TLabeledEdit posiadaj moliwo automatycznego ich opisu. S one jakby poczeniem komponentw z klas
TLabel i TEdit. Rozwijajc w inspektorze obiektw opcje waciwoci EditLabel
komponentu LabeledEdit1 (obok nazwy waciwoci w inspektorze obiektw pojawi
si znaczek ) opiszmy jego cech Caption jako Liczba 1. Podobnie opiszemy
wszystkie komponenty edycyjne, tak jak przedstawiono to na rysunku 4.5.

62

ABC Delphi 6

Rysunek 4.5.
Rozmieszczenie i opis
komponentw
reprezentujcych
klas TLabeledEdit

Bardzo czsto korzystanie z rnego rodzaju komponentw uatwiaj nam dymki


podpowiedzi (ang. hint). Jeeli zechcemy je zastosowa na potrzeby naszych okienek
edycji, musimy zamkn opcje waciwoci EditLabel (obok nazwy tej waciwoci
w inspektorze obiektw pojawi si znaczek +). Zaznaczmy myszk wybrany komponent i odszukajmy w inspektorze obiektw jego waciwo Hint, ktr opiszemy
jako Podaj pierwsz liczb. Aby dymek podpowiedzi by rzeczywicie widoczny w trakcie dziaania programu, waciwoci ShowHint naley nada warto . Analogicznie postpimy z nastpnym komponentem edycyjnym.
Przystpmy obecnie do wypeniania gwnego moduu Unit_10.pas naszego formularza odpowiednim kodem. W sekcji implementacji moduu zadeklarujmy wasn klas
EFloatingPointError (wyjtek dzielenia zmiennopozycyjnego) przechwytujc wyjtki, ktra bdzie dziedziczy po klasie EMathError. Dodatkowo zastosujmy dwie
deklaracje  , przechowujce odpowiednie komunikaty, informujce
o powstaniu wyjtku podczas zmiennopozycyjnego dzielenia dwch liczb:



DEF"A
!

?% ?    ?9)?  
  %
9%  0#MN  2
2  )Q0
9%' 0 R2 222 Q0

W tym wypadku znaki formatowania 0 pozwalaj na zduplikowanie komunikatw


w jzyku polskim i angielskim.
Procedur obsugi zdarzenia 
  , uruchamianego przyciskiem &Oblicz,
wypenimy nastpujcym kodem:
   
"#  $  
%
 
I?*",   I? ",G
 I?'",
, 
?,?7
 ?% ?  " 
9% .S?,"9%T
?,?: 3
 ?% ?  " 
9%'.S?,"9%T



Rozdzia 4. Object Pascal w wydaniu Delphi

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

 



Mamy nadziej, i przedstawione w poprzednim punkcie rozwaania nie s zbyt


skomplikowane dla mniej zaawansowanych Czytelnikw. Jeeli jednak kto czuje si
nieco zagubiony pord tych poj, zawsze mona przedstawion wyej konstrukcj
znacznie uproci poprzez wywietlanie komunikatu wyjtku poprzez okno dialogowe MessageBox():

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

 



Na wydruku 4.4 przedstawiono kompletny kod rdowy gwnego moduu aplikacji,


wykorzystujcej obiekty wyjtkw powstaych podczas operacji zmiennopozycyjnego
dzielenia dwch liczb.
Wydruk 4.4. Kod gwnego moduu Unit_10.pas projektu KODY\10\Projekt_10.dpr,
wykorzystujcego przykadowe klasy wyjtkw
=> +
 A 

/1.9%.=.L .
.C ) . .
.
3%. .?, 


  

# #
I? I?
I?'I?
I?*I?
#'#
   #  $  
   #' $  
 
   !

    !








DEF"A
!

?% ?    ?9)?  
  %
9%  0#MN  2
2  )Q0
9%' 0 R2 222 Q0

Rozdzia 4. Object Pascal w wydaniu Delphi

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
   
"#' $  
%
& "


"

Powyszy algorytm najlepiej jest testowa, uruchamiajc program wynikowy Projekt_10.exe.

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
 %

dokonujemy przypisania nazwy pliku do zmiennej plikowej. Procedura


   E SE 2/ T

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 aplikacj, ktrej zadaniem bdzie wczytanie pliku tekstowego z dysku


oraz jego ponowne zapisanie po ewentualnej modyfikacji.
Umiemy na formularzu po jednym reprezentancie klas TRichEdit i TCoolBar z karty
Win32. Dodatkowo uzupenimy go trzema komponentami reprezentujcymi klas
TSpeedButton z karty Additional oraz po jednym komponencie z klas TMainMenu
i TButton z karty Standard oraz TOpenDialog i TSaveDialog z karty Dialogs. Sposb
rozmieszczenia wymienionych komponentw na formularzu obrazuje rysunek 4.6.
Rysunek 4.6.
Sposb
rozmieszczenia
komponentw
na formularzu
projektu
Projekt_11.dpr

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 %

Rozdzia 4. Object Pascal w wydaniu Delphi

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

W omawianym programie menu Plik, Otwrz bdzie zdublowane jednym z przyciskw


TSpeedButton. Najpierw na formularzu umiemy komponent TCoolBar, natomiast
bezporednio na nim kolejno komponenty TSpeedButton. Ich cechy Name zmiemy,
posugujc si inspektorem obiektw, odpowiednio na FileOpen, CopyText, PasteText,
CutText. Korzystajc z waciwoci Glyph, rozwimy opcj TBitmap i umiemy na
kadym z przyciskw TSpeedButton odpowiedni map bitow, tak jak przedstawiono na rysunku 4.6. Rysunek taki moemy wykona samodzielnie, korzystajc z Edytora Graficznego Delphi (menu Tools, Image Editor), ktrego obsuga nie rni si
w istocie od zasad obsugi programu graficznego, jakim jest Paint.
Aby przycisk FileOpen obsugiwa znan nam ju procedur obsugi zdarzenia  
(   , wystarczy w karcie zdarze inspektora obiektw jego zdarzeniu OnClick przypisa FileOpenClick().
Na wydruku 4.5 zamieszczono kompletny kod aplikacji Projekt_11.dpr. W funkcji 
 wykorzystalimy waciwo InitialDir obiektw TOpenDialog i TSaveDialog.
Waciwo ta ju w momencie uruchomienia aplikacji pozwala ustali odpowiedni
ciek dostpu do aktualnego katalogu. Z kolei wykorzystujc waciwo Filter (rysunek 4.8) tych obiektw, zapewnimy moliwo odczytania plikw posiadajcych
wymagane przez nas rozszerzenia.

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%
# # 
,#
 ,#
,#
99 99
3% 3%
&97

97

8197


Rozdzia 4. Object Pascal w wydaniu Delphi


& 97

   #  $  
   
   
   , $  
    , $  
   , $  
    $  
   81 $  
   & $  
   
  
 & & 
   
@   
 #
 
   !
 %
   
 > %

    !








DEF"39!
  %
  0=1%V0
' 0:
$; $ 0
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"#  $  
%
 9%#,+. ) '. )  .
9#>6?8 9#>78@=?78A
73>6?
& "

73>8& 


GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"
   
%
3% "73  ?,   )  
 +
3% "73  3% "73 

GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
", $  
%
E )? " 

GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
" , $  
%
E )? "  
 


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
   
"
  
 & & 

Rozdzia 4. Object Pascal w wydaniu Delphi

71

%
&   

GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"
@   
 #
%
 9%#,+. ) '. )  .
9#>6?8 9#>78@=?78A

6?
 E=?

8
 &I?


GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"

Strukturalna obsuga wyjtkw


By moe temat niniejszego podrozdziau moe si wydawa mao adekwatny w ksice traktujcej o podstawach programowania w Delphi, jednak przekonamy si, i jest
on naturalnym rozwiniciem poruszanych uprzednio zagadnie i wcale nie takim trudnym pojciowo, jak kto mgby sdzi.
Oprcz wyraenia /( 6 Delphi moe posugiwa si rwnie konstrukcj / / . Rnica pomidzy nimi polega na tym, i wyraenie /
 / nie jest traktowane przez kompilator jako jawna konstrukcja obsugujca
wyjtki pozwala natomiast na wykonanie czci programu, wystpujcego po sowie
 /, nawet w przypadku wczeniejszego wykrycia jakiego wyjtku. W celu wyjanienia przedstawionego problemu posuymy si przykadem procedury obsugi
zdarzenia czytajcego okrelony plik, ktry powinien znajdowa si na dysku. Plik
przeczytamy metod znak po znaku za pomoc zmiennej 4 typu 4.
   
"#' $  

7,
8
 %
)   ) 
%
E )? "I" 
8
 0 $",0
&%7.8

 
E7
 
1)?7
%
E7.)   
E )? "I"&)   

A

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
E EJ3ST


Rozdzia 4. Object Pascal w wydaniu Delphi

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
3S7T L
E )? "I"& 3S7T
7 7J 


? ",  
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.

Przejdmy do karty Servers, zawierajcej kilkadziesit elastycznych klas, sucych


do wizualizacji aktualnie dostpnych w systemie serwerw COM.
Zaprojektujmy naprawd prost aplikacj, skadajc si z jednego komponentu reprezentujcego klas TPowerPointApplication, jednego reprezentujcego klas TRichEdit oraz trzech TButton, tak jak przedstawiono to na rysunku 4.9.
Rysunek 4.9.
Aplikacja
wykorzystujca
przykadowy
egzemplarz klasy
TPowerPointApplication
z karty Servers

W najprostszym przypadku w celu ustanowienia poczenia z wybranym serwerem


COM wykorzystamy metod  , w celu wizualizacji poczenia skorzystamy
z metody 8  5, natomiast aby rozczy si z wybranym uprzednio serwerem musimy skorzysta z metody 9  .

Rozdzia 4. Object Pascal w wydaniu Delphi

75

Aby utworzy klienta OLE, naley skorzysta z funkcji 52 z moduu


ComObj. Parametrem aktualnym tej funkcji jest nazwa odpowiedniej klasy, tak jak
zostao to pokazane na wydruku 4.6.
Wydruk 4.6. Kod gwnego moduu Unit_12.pas projektu Projekt_12.dpr
=> '
 A 

/1.9%.=.L ..C ) .
 .
.3%. .
 .

.  .9 B


  

# #
#'#
E )? E )?
#*#
 1 &   1 & 
   #  $  
   #' $  
   
   
   #* $  
 
   !

    !








DEF"39!
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"#' $  

 1 &L 
%
 
 1 &   0 1 "& 0
E )? "I"&0 1 1 0J 1 &"L 
, 
& "9%#,0 1 21"0.
0#MN1 $ 0.9#>U


GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"#  $  

76

ABC Delphi 6
%
 1 &  "3  
& "


GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"
   
%
 1 &  " 

GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"#* $  
%
 1 &  "L 

GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"

Widzimy, e sposb posugiwania si typami wariantowymi w kontekcie tworzenia


klienta OLE wybranego serwera COM jest bardzo prosty. Poczenie si z innymi dostpnymi serwerami pozostawimy Czytelnikom jako wiczenie do samodzielnego
wykonania.

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.

Rozdzia 4. Object Pascal w wydaniu Delphi

77

Rysunek 4.10.
Formularz projektu
Projekt_13.dpr

Po to, aby nasz program by naprawd funkcjonalny, przewidzimy moliwo zapisu


danych na dysku. W tym celu w sekcji implementacji moduu zadeklarujemy rekord
pod robocz nazw TStudent wraz ze zmienn S tego typu oraz zmienn plikow F
typu TStudentFile (typ file przeznaczony jest dla plikw binarnych):



DEF"A
!

    
7
 %S XT
821$ %S'+T
?%2
9%
?%2
2%
?%2
7A%
Z$ %S-+T

 AA



 E 7% 

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",
/ .


Zauwaymy, i dane czytamy za pomoc procedury #61&, natomiast zapisujemy


za pomoc procedury : 61&, gdzie  jest zmienn plikow, a & identyfikuje poszczeglne pola rekordu.
W tego typu prostszych programach, jeeli oczywicie nie mamy innych wymaga,
postpujemy z reguy w ten sposb, aby ju w momencie uruchomienia aplikacji
ostatnio zapisane rekordy pliku byy widoczne w poszczeglnych komponentach edycyjnych. Efekt taki uzyskamy, odpowiednio wypeniajc procedur tworzc formularz  :
   
"
   
%
 3
 E  +
&%.03"0
A?,03"0)
%
E
1)?

Rozdzia 4. Object Pascal w wydaniu Delphi

79

I3


%
 3
E1 



Najpierw czycimy pola edycji, wywoujc procedur 9. Nastpnie zmiennej


identyfikujcej aktualny rekord pliku przypisujemy warto zero (ustawiamy si na
zerowym rekordzie pliku), gdy pocztkiem kadego pliku jest rekord o numerze 0.
Z kolei za pomoc procedury    przypisujemy nazw pliku o okrelonym
typie do zmiennej plikowej. Dalej, sprawdzamy czy plik o podanej nazwie istnieje na
dysku w aktualnym katalogu. Jeeli plik takowy istnieje, otwieramy go procedur #
 z jednym parametrem w postaci zmiennej plikowej. Dane z pliku czytane s do
momentu napotkania znakw koca pliku EOF (End of File). Moe si zdarzy, e
plik o podanej nazwie nie bdzie istnie na dysku (np. pierwsze uruchomienie aplikacji). Wwczas naley go utworzy, wywoujc z jednym parametrem procedur #,
 .
Po wypenieniu odpowiednich rubryk zapisujemy je na dysku w sposb bardzo prosty, korzystajc z przycisku Zapisz dane, wyzwalajcego procedur obsugi zdarzenia:
   
"#* $  
%
3
)13


W celu rozpoczcia wypeniania nowego rekordu uruchamiamy procedur obsugi


zdarzenia:
   
"#  $  
%
 
7  E . 
$. E 
?
 3
3
$. E 


W instrukcji powtarzajcej (   za pomoc procedury )  zwikszamy


aktualny numer rekordu w pliku o jeden. Uywanie tej procedury w tzw. ciasnych ptlach daje duo lepsze rezultaty w porwnaniu z tradycyjnym przypisaniem:
 E   E J 

Procedur &  przesuwamy pozycj w pliku na miejsce wskazane przez numer


aktualnego istniejcego rekordu CurRec. Czynno t wykonujemy do momentu napotkania koca pliku. Nastpnie okna edycji s czyszczone i zapisywane, a numer pozycji w pliku przesuwany jest na aktualne miejsce CurRec.

80

ABC Delphi 6

W sposb bardzo podobny moemy np. poszuka nastpnego wypenionego rekordu.


Czynno t wykonujemy za pomoc procedury obsugi zdarzenia:
   
"#- $  
%
7  E . 
$. E 
A?)
%
E.
$. E 
)13


%
7  E .H GG
.  E   E H 
$. E 
)19%0N%;$ $2
0



Na wydruku 4.7 pokazano kompletny kod rdowy gwnego moduu Unit_13.pas


aplikacji projektu Kody\13\Projekt_13.dpr.
Wydruk 4.7. Kod rdowy moduu Unit_13.pas
=> *
 A 

/1.9%.=.L ..C ) . .
.
3%. .?, 


  

I? I?
I?'I?
I?*I?
I?-I?
I?XI?
I?4I?
# #
#'#
#*#
#-#
#X#
   #X $  
   #* $  
   
   
   #  $  
   #' $  
   #- $  
 
   !
   )13
    3

Rozdzia 4. Object Pascal w wydaniu Delphi


   3
   I3

    !








DEF"A
!

    
7
 %S XT
821$ %S'+T
?%2
9%
?%2
2%
?%2
7A%
Z$ %S-+T

 A



 E 7% 
GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
")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?'",

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



Rozdzia 4. Object Pascal w wydaniu Delphi

83

%
7  E .H 
$. E 
E.
$. E 
)13


GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
   
"#- $  
%
7  E . 
$. E 
A?)
%
E.
$. E 
)13


%
7  E .H GG
.  E   E H 
$. E 
)19%0N%;$ $2
0


GGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"

Testowanie przedstawionej aplikacji jest bardzo proste. Na pobranym z serwera FTP


Wydawnictwa Helion pliku, w aktualnym katalogu znajduje si przykadowy plik
SdudentsData.dat z informacjami o trzech wybranych studentach. Moemy samodzielnie go przeszukiwa i uzupenia. Naley jednak pamita, aby kady nowo wypeniony rekord od razu zapisa na dysku.
Warto pamita, i procedury &  nie mona stosowa do wykonywania operacji na plikach tekstowych (TextFile). Jeeli chcemy przesuwa pozycj w pliku tekstowym, naley skorzysta z funkcji bibliotecznej API & + .

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.

You might also like