You are on page 1of 44

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH

Delphi 6. Vademecum

profesjonalisty. Tom I
Autorzy: Xavier Pacheco, Steve Teixeira
Tumaczenie: Andrzej Grayski
ISBN: 83-7197-690-9
Tytu oryginau: Delphi 6 Developer's Guide
Format: B5, stron: okoo 620
Zawiera CD-ROM

Teixeira i Pacheco wci dziel si z czytelnikami sw wiedz i dowiadczeniem, uczc,


jak tworzy si aplikacje bazodanowe lokalne, wielowarstwowe i internetowe oraz
nowe komponenty, biblioteki DLL itd. Czytajc t ksik, masz niepowtarzaln okazj
podnie swoje kwalifikacje, gdy umoliwia ona zapoznanie si m.in. z zasadami
tworzenia aplikacji midzyplatformowych, metodologi tworzenia komponentw i ich
edytorw, filozofi programowania obiektowego i programowaniem wspbienym.
Niniejsza ksika, napisana przez dwukrotnych laureatw nagrody za najlepsz ksik
o Delphi, przyznanej przez czytelnikw Delphi Informant, stworzona przez programistw
dla programistw, to miarodajny przewodnik po nowociach Delphi 6.

ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Czytajc Delphi 6. Vademecum profesjonalisty, poznasz midzy innymi:


histori Delphi i techniczne oraz ekonomiczne uwarunkowania jego rozwoju,
bogactwo rodowiska IDE i wspdziaanie jego elementw w procesie tworzenia
aplikacji,
najwaniejsze elementy jzyka Object Pascal,
szczegy biblioteki CLX i zasady tworzenia aplikacji midzyplatformowych dla
Windows i Linuksa,
mechanizm komunikatw Windows i zasady ich obsugi w tworzonych
aplikacjach,
podstawy tworzenia i wykorzystywania bibliotek DLL,
realizacj programowania wspbienego za pomoc wtkw i wkien oraz
mechanizmw synchronizujcych,
zastosowanie nowych komponentw bazodanowych dbExpress i dbGo for ADO.

"
"
"
"
"
"
"
"



 
 




      

 

 
 !
Rodzina produktw Delphi ....................................................................................................21
Delphi co i dlaczego?........................................................................................................23
Komfort wizualnego projektowania aplikacji .................................................................24
Szybko kompilacji kontra efektywno generowanego kodu ......................................25
Moliwoci jzyka programowania w kontekcie jego zoonoci.................................26
Elastyczno i skalowalno architektury baz danych ....................................................27
Wzorce projektowania i uytkowania wymuszone przez struktur rodowiska .............27
Nieco historii..........................................................................................................................28
Delphi 1 ...........................................................................................................................28
Delphi 2 ...........................................................................................................................29
Delphi 3 ...........................................................................................................................30
Delphi 4 ...........................................................................................................................31
Delphi 5 ...........................................................................................................................31
Delphi 6 ...........................................................................................................................32
rodowisko zintegrowane Delphi 6 .......................................................................................32
Okno gwne....................................................................................................................32
Projektant formularzy ......................................................................................................34
Inspektor obiektw ..........................................................................................................35
Edytor kodu .....................................................................................................................36
Eksplorator kodu..............................................................................................................36
Hierarchia obiektw ........................................................................................................36
Kod rdowy projektu ..........................................................................................................36
Prosta aplikacja ......................................................................................................................38
Jeszcze o zdarzeniach... .........................................................................................................40
Niekontraktowy charakter obsugi zdarze .....................................................................40
Prototypowanie kodu .............................................................................................................41
Rozbudowa zestawu komponentw i konfigurowalne rodowisko.......................................42
Top 10 gorca dziesitka IDE...........................................................................................42
1. Uzupenianie klas ........................................................................................................42
2. Udostpnianie deklaracji symbolu...............................................................................43
3. Od deklaracji do definicji ............................................................................................43
4. Dokowanie...................................................................................................................43
5. Object Browser ............................................................................................................44
6. GUID ...........................................................................................................................44
7. Wyrnianie skadni plikw C++................................................................................44


  


8. Znaczniki To Do......................................................................................................45
9. Meneder projektw ....................................................................................................45
10. Code Insight...............................................................................................................45
Podsumowanie .......................................................................................................................46

! 

"#$%   &


Komentarze ............................................................................................................................47
Nowoci w zakresie procedur i funkcji..................................................................................48
Puste nagwki wywoa .................................................................................................48
Przecianie .....................................................................................................................49
Domylne parametry........................................................................................................50
Zmienne .................................................................................................................................51
Stae .......................................................................................................................................52
Operatory ...............................................................................................................................55
Operator przypisania........................................................................................................55
Operatory porwnania .....................................................................................................55
Operatory logiczne ..........................................................................................................55
Operatory arytmetyczne ..................................................................................................56
Operatory bitowe .............................................................................................................57
Operatory zwikszania i zmniejszania ............................................................................57
Operatory wykonaj i przypisz ......................................................................................58
Typy jzyka Object Pascal.....................................................................................................58
Porwnanie typw ...........................................................................................................59
Znaki................................................................................................................................59
Mnogo acuchw ....................................................................................................59
Typy wariantowe .............................................................................................................74
Typ Currency...................................................................................................................88
Typy definiowane przez uytkownika ...................................................................................89
Tablice .............................................................................................................................89
Rekordy ...........................................................................................................................93
Zbiory ..............................................................................................................................94
Obiekty ............................................................................................................................97
Wskaniki ........................................................................................................................98
Aliasy typw..................................................................................................................101
Rzutowanie i konwersja typw............................................................................................102
Zasoby acuchowe..............................................................................................................104
Instrukcje warunkowe..........................................................................................................104
Instrukcja If....................................................................................................................105
Instrukcja wyboru ..........................................................................................................106
Ptle .....................................................................................................................................106
Ptla For.........................................................................................................................106
Ptla While...Do.............................................................................................................107
Ptla Repeat...Until........................................................................................................108
Procedura Break()..........................................................................................................108
Procedura Continue ()....................................................................................................109
Procedury i funkcje ..............................................................................................................110
Przekazywanie parametrw do procedur i funkcji ........................................................111
Zasig deklaracji ..................................................................................................................118
Moduy.................................................................................................................................118
Dyrektywa uses..............................................................................................................119
Cykliczna zaleno midzy moduami ........................................................................120
Pakiety .................................................................................................................................122
Wykorzystywanie pakietw ..........................................................................................123
Skadnia pakietu ............................................................................................................123



Programowanie zorientowane obiektowo............................................................................123


rodowisko bazujce na obiektach kontra rodowisko zorientowane obiektowo.........125
Wykorzystanie obiektw w Delphi......................................................................................126
Deklarowanie obiektw i kreowanie zmiennych obiektowych.....................................126
Destrukcja obiektu.........................................................................................................127
Metody...........................................................................................................................127
Waciwoci...................................................................................................................131
Widoczno elementw obiektu....................................................................................133
Wewntrz obiektw.......................................................................................................134
TObject protoplasta wszystkich klas ........................................................................135
Interfejsy........................................................................................................................136
Strukturalna obsuga wyjtkw ...........................................................................................141
Wyjtki jako klasy .........................................................................................................144
Wyjtki a przepyw sterowania w programie ................................................................145
Ponowienie wyjtku ......................................................................................................147
RTTI.....................................................................................................................................148
Podsumowanie .....................................................................................................................149

 

$'( 
Natura komunikatw............................................................................................................151
Typy komunikatw ..............................................................................................................152
Jak funkcjonuje system komunikatw Windows?...............................................................152
Obsuga komunikatw w kategoriach Delphi......................................................................154
Struktury specyficzne dla rnych typw komunikatw ..............................................155
Przetwarzanie komunikatw................................................................................................155
Kontraktowy charakter obsugi komunikatw ..............................................................157
Zwrotne przekazywanie wyniku obsugi komunikatu...................................................158
Zdarzenie OnMessage klasy TApplication....................................................................159
Wysyanie wasnych komunikatw .....................................................................................159
Metoda Perform() ..........................................................................................................160
Funkcje SendMessage() i PostMessage() ......................................................................160
Komunikaty niestandardowe ...............................................................................................160
Komunikaty powiadamiajce ........................................................................................161
Wewntrzne komunikaty VCL......................................................................................161
Komunikaty definiowane przez uytkownika ...............................................................163
Anatomia systemu komunikatw VCL................................................................................165
Zwizek komunikatw ze zdarzeniami Delphi....................................................................174
Podsumowanie .....................................................................................................................174



     
    

& 

)* +
Zaoenia oglne..................................................................................................................179
Ktra wersja?.................................................................................................................179
Moduy, komponenty i pakiety......................................................................................181
Zmiany w rodowisku IDE............................................................................................181
Zgodno pomidzy Delphi i Kyliksem ..............................................................................182
Nie w Linuksie...............................................................................................................183
Rnice midzy kompilatorami.....................................................................................183
Indywidualne cechy platformy systemowej ..................................................................184
Nowoci Delphi 6 ................................................................................................................184
Definiowalne typy wariantowe......................................................................................185
Jawne wartociowanie elementw typu wyliczeniowego .............................................185
Dyrektywa $IF...............................................................................................................185
Moliwa niezgodno plikw *.DFM ...........................................................................185


  


Migracja z Delphi 5 .............................................................................................................185


Zmiana wartoci staych typowanych............................................................................185
Negacja wartoci typu Cardinal.....................................................................................186
Migracja z Delphi 4 .............................................................................................................186
Zmiany w zakresie biblioteki RTL................................................................................186
Zmiany w bibliotece RTL..............................................................................................187
Zmiany w zakresie obsugi Internetu.............................................................................188
Zmiany w obsudze baz danych.....................................................................................188
Migracja z Delphi 3 .............................................................................................................189
32-bitowe liczby cakowite bez znaku...........................................................................189
64-bitowe liczby cakowite............................................................................................190
Typ Real ........................................................................................................................190
Migracja z Delphi 2 .............................................................................................................190
Zmiany w zakresie typw boolowskich ........................................................................191
Dyrektywa resourcestring..............................................................................................191
Zmiany w bibliotece RTL..............................................................................................192
Klasa TCustomForm......................................................................................................192
Metoda GetChildren()....................................................................................................192
Serwery automatyzacji ..................................................................................................193
Migracja z Delphi 1 .............................................................................................................193
Znaki i acuchy ............................................................................................................193
Rozmiar i zakres zmiennych..........................................................................................201
Wyrwnywanie pl rekordw .......................................................................................201
32-bitowa arytmetyka ....................................................................................................202
Rnice dotyczce typu TDateTime..............................................................................203
Sekcja finalization .........................................................................................................203
Jzyk asemblera.............................................................................................................204
Biblioteki DLL ..............................................................................................................205
Zmiany zwizane z systemem operacyjnym .................................................................206
Podsumowanie .....................................................................................................................210

 

 %, !
Natura wtkw .....................................................................................................................211
Rodzaje wielozadaniowoci ..........................................................................................211
Do czego moe si przyda wielowtkowo?..............................................................212
Wielowtkowo a komponenty VCL...........................................................................212
Bdne wykorzystanie wielowtkowoci.......................................................................213
Klasa TThread......................................................................................................................213
Obiekty wtkw a zmienne ...........................................................................................216
Koczenie wtku ...........................................................................................................216
Synchroniczne wykorzystywanie komponentw VCL .................................................218
Przykadowa aplikacja wielowtkowa...........................................................................221
Priorytety i szeregowanie wtkw.................................................................................222
Zawieszanie i wznawianie wtkw ...............................................................................225
Pomiar czasu w ramach wtku ......................................................................................225
Wspdziaanie wtkw aplikacji ........................................................................................228
Pami lokalna wtku....................................................................................................228
Synchronizacja wtkw.................................................................................................232
Przykad zastosowania wielowtkowoci: zaawansowane wyszukiwanie tekstu ...............244
Interfejs uytkownika ....................................................................................................245
Proces przeszukiwania...................................................................................................251
Zmiana priorytetu wtku przeszukujcego....................................................................256
Wielowtkowy dostp do BDE............................................................................................257



Wielowtkowe operacje graficzne.......................................................................................263


Wkna.................................................................................................................................267
Podsumowanie .....................................................................................................................273

-

.$ // !
Czym w istocie jest biblioteka DLL ....................................................................................275
Bazowy adres adowania moduu ..................................................................................276
Nieco terminologii.....................................................................................................277
czenie statyczne kontra czenie dynamiczne..................................................................278
Korzyci pynce z uywania DLL......................................................................................279
Wspdzielenie kodu, zasobw i danych przez wiele aplikacji.....................................279
Ukrycie szczegw implementacyjnych ......................................................................280
Tworzenie i wykorzystywanie bibliotek DLL .....................................................................281
Prosty przykad poznaj si swych pienidzy ...........................................................281
Formularze modalne w bibliotekach DLL.....................................................................283
Formularze niemodalne w bibliotekach DLL................................................................285
Wykorzystywanie bibliotek DLL w aplikacjach Delphi .....................................................287
Automatyczne adowanie biblioteki DLL .....................................................................287
adowanie biblioteki DLL na danie ..........................................................................289
Procedura inicjujco-koczca biblioteki DLL ...................................................................291
Definiowanie procedury inicjujco-koczcej ..............................................................291
Obsuga wyjtkw w bibliotekach DLL ..............................................................................296
Wyjtki a klauzula Safecall ...........................................................................................297
Funkcje zwrotne...................................................................................................................297
Dziaanie funkcji zwrotnej.............................................................................................300
Specyficzne wywietlanie elementw listy ...................................................................301
Wywoywanie funkcji zwrotnych z bibliotek DLL .......................................................301
Wspdzielenie danych biblioteki DLL przez rne procesy ..............................................303
Tworzenie bibliotek DLL z pamici dzielon .............................................................304
Dzielenie globalnych danych biblioteki przez aplikacje ...............................................307
Eksportowanie obiektw z bibliotek DLL...........................................................................310
Podsumowanie .....................................................................................................................314

         


!" #$
 

.
 
 
Typy baz danych ..................................................................................................................317
Architektura bazy danych ....................................................................................................318
Poczenia z serwerami baz danych.....................................................................................318
Zbiory danych ......................................................................................................................319
Otwieranie i zamykanie zbioru danych .........................................................................320
Nawigowanie wrd rekordw zbioru danych ..............................................................323
Manipulowanie zawartoci zbioru danych ..................................................................326
Pola rekordu bazy danych....................................................................................................331
Wartoci pl...................................................................................................................331
Typy pl.........................................................................................................................332
Nazwy i numery pl ......................................................................................................332
Operowanie zawartoci pl..........................................................................................333
Edytor pl ......................................................................................................................334
Pola typu BLOB ............................................................................................................340
Filtrowanie danych...............................................................................................................345
Przeszukiwanie zbiorw danych..........................................................................................346
FindFirst() i FindNext() .................................................................................................347
Lokalizowanie rekordu za pomoc metody Locate() ....................................................347
Przeszukiwanie tabeli za pomoc indeksw..................................................................348


  


Moduy danych ....................................................................................................................352


Wyszukiwanie, zakresy, filtrowanie ....................................................................................352
Zakadki ...............................................................................................................................360
Podsumowanie .....................................................................................................................361

0 

) %$

 ,
$12 -
Specyfika technologii dbExpress.........................................................................................363
Jednokierunkowe zbiory danych tylko do odczytu .......................................................363
dbExpress kontra BDE ..................................................................................................364
dbExpress a aplikacje midzyplatformowe ...................................................................364
Komponenty dbExpress .......................................................................................................364
TSQLConnection...........................................................................................................364
TSQLDataSet.................................................................................................................367
Komponenty kompatybilne ...........................................................................................371
TSQLMonitor ................................................................................................................372
Edytowalne, dwukierunkowe zbiory danych dbExpress .....................................................372
TSQLClientDataSet.......................................................................................................372
Realizacja aplikacji dbExpress ............................................................................................373
Podsumowanie .....................................................................................................................373

+ 

) %$
 ,$34  
Strategia uniwersalnego dostpu do danych ........................................................................375
OLE DB, ADO i ODBC w zarysie ......................................................................................375
Wykorzystanie technologii dbGo for ADO .........................................................................376
Ustanawianie poczenia z baz danych za pomoc dostawcy OLE DB ......................376
Przykadowa baza danych .............................................................................................378
Komponenty dbGo for ADO ...............................................................................................378
Przetwarzanie transakcyjne..................................................................................................384
Podsumowanie .....................................................................................................................386

%          &  #'


 5  
'678/8/9 0+
CLX odsona pierwsza....................................................................................................389
Co to jest komponent? .........................................................................................................389
Hierarchia komponentw.....................................................................................................390
Komponenty niewizualne ..............................................................................................390
Komponenty wizualne...................................................................................................391
Struktura komponentu..........................................................................................................393
Waciwoci komponentu..............................................................................................394
Metody...........................................................................................................................396
Zdarzenia .......................................................................................................................397
Komponenty jako waciciele innych komponentw....................................................399
Komponenty rodzicielskie.............................................................................................400
Hierarchia komponentw wizualnych .................................................................................400
Klasa TPersistent ...........................................................................................................401
Klasa TComponent ........................................................................................................402
Klasa TControl ..............................................................................................................404
Klasy TWinControl i TWidgetControl..........................................................................404
Klasa TGraphicControl..................................................................................................406
Klasy kategorii TCustom...........................................................................................406
Pozostae klasy ..............................................................................................................407



Wykorzystanie informacji RTTI..........................................................................................410


Informacja o genealogii i zestawie waciwoci klasy ..................................................411
Przypisywanie waciwociom wartoci za porednictwem RTTI................................433
Podsumowanie .....................................................................................................................436

  )'78/ & 


Podstawy tworzenia komponentw .....................................................................................438
Czy tworzenie nowego komponentu w ogle jest konieczne? ......................................438
Etapy tworzenia nowego komponentu ..........................................................................439
Rejestrowanie komponentu ...........................................................................................460
Testowanie komponentu................................................................................................461
Wybr ikony dla komponentu .......................................................................................463
Przykadowe komponenty....................................................................................................464
Rozszerzenia kontrolek Win32......................................................................................464
Komponent TddgRunButton .........................................................................................473
Komponenty-pojemniki TddgButtonEdit .......................................................................478
Koncepcja ......................................................................................................................479
Definiowanie waciwoci.............................................................................................479
Definiowanie zdarze ....................................................................................................480
TddgDigitalClock jeszcze jeden przykad definiowania zdarze.............................482
Umieszczanie kompletnych formularzy w palecie komponentw ................................485
Podsumowanie .....................................................................................................................487

 ! :
' &0+
Komponenty pseudowizualne..............................................................................................489
Niestandardowe podpowiedzi kontekstowe ..................................................................489
Animowane komponenty .....................................................................................................493
Komponent TddgMarquee.............................................................................................494
Testowanie komponentu TddgMarquee ........................................................................504
Tworzenie edytorw waciwoci........................................................................................506
Definiowanie nowej klasy edytora.......................................................................................506
Edycja waciwoci w postaci linii tekstu .....................................................................508
Rejestracja nowego edytora waciwoci ......................................................................512
Edycja waciwoci za pomoc okna dialogowego.......................................................512
Edytory komponentw.........................................................................................................516
TComponentEditor ........................................................................................................516
TDefaultEditor...............................................................................................................517
Przykad edycji komponentu .........................................................................................517
Rejestracja edytora komponentu ...................................................................................519
Przechowywanie w strumieniach niepublikowanych danych komponentu.........................520
Okrelenie strumieniowalnego charakteru waciwoci................................................520
Kategoryzacja waciwoci..................................................................................................530
Klasy kategorii waciwoci ..........................................................................................531
Kolekcje komponentw klasy TCollection i TCollectionItem .......................................535
Przykadowy element kolekcji klasa TRunBtnItem .................................................537
TRunButtons kolekcja komponentu .........................................................................537
Implementacja wsppraca kolekcji i jej elementw
z komponentem macierzystym ...................................................................................538
Edycja kolekcji i jej elementw w dialogowym edytorze waciwoci ........................545
Podsumowanie .....................................................................................................................550

  ;#4 
CLX co to jest? ...............................................................................................................551
Architektura CLX ................................................................................................................552


  


Z Windows do Linuksa........................................................................................................555
Nie ma komunikatw.................................................................................................555
Przykadowe komponenty .............................................................................................556
Edytory rodowiskowe CLX ...............................................................................................585
Pakiety .................................................................................................................................589
Konwencje nazewnicze .................................................................................................590
Pakiety wykonywalne....................................................................................................591
Pakiety rodowiskowe ...................................................................................................593
Ikony komponentw ............................................................................................................596
Podsumowanie .....................................................................................................................597

(
 $
 <' * == -5
< -5

Rozdzia 13.

Trzy poprzednie rozdziay powicone byy architekturze i projektowaniu komponentw VCL, przeznaczonych dla platformy MS Windows. W niniejszym rozdziale zajmiemy si podstawami projektowania komponentw CLX, umoliwiajcych tworzenie
aplikacji zarwno dla Windows, jak i dla Linuksa. Tak si szczliwie skada, i znaczna cz umiejtnoci nabyta podczas projektowania komponentw VCL okae si
przydatna rwnie w odniesieniu do komponentw CLX.

CLX wymawiane najczciej jako clicks to akronim od Component Library for


Cross-Platform, czyli midzyplatformowej biblioteki komponentw; pojawi si po
raz pierwszy w zwizku z Kyliksem wywodzcym si z Delphi narzdziem typu
RAD dla Linuksa. Biblioteka CLX jest jednak czym wicej ni tylko adaptacj VCL
na gruncie Linuksa: jej obecno w Delphi 6 umoliwia (po raz pierwszy w historii
Delphi) przekroczenie granic Windows i tworzenie aplikacji zgodnych zarwno z Delphi, jak i Kyliksem.
Ponadto biblioteka VCL (w Delphi) utosamiana bywa raczej z komponentami wizualnymi (rwnie w nazwie), co nie powinno dziwi wobec faktu, i komponenty te stanowi wiksz jej cz (i jednoczenie lwi cz palety komponentw). Tymczasem
architektura CLX jest nieco bardziej zoona, bo oprcz wizualnych komponentw grupy
 zawiera take komponenty
  ,   i   .

  to grupa klas i moduw wsplnych dla Delphi 6 i Kyliksa nale do niej


m.in. moduy  ,   i  , okrelane w Delphi (od pocztku) mianem
biblioteki RTL. Mimo i moduy te stanowi mog skadniki aplikacji obydwu typw
VCL i CLX za aplikacj CLX zwyko si uwaa tak, ktrej strona wizualna
zrealizowana zostaa na podstawie klas grupy  .
 stanowi odmian tego, co wikszo programistw skonna jest uwaa

(w Delphi) za VCL, jednak oparta jest nie na standardowych kontrolkach Windows




K     

z bibliotek    czy   , lecz na tzw. widetach1 zawartych w bibliotece  . Do grupy   zaliczaj si komponenty zapewniajce dostp do danych za
pomoc nowej technologii  , natomiast nowe, midzyplatformowe oblicze
WebBrokera ucieleniaj komponenty grupy   .
W niniejszym rozdziale skoncentrujemy si gwnie na  , ze szczeglnym
uwzgldnieniem tworzenia nowych komponentw na bazie tej architektury. Opiera si
ona (jak ju wczeniej wspominalimy) na bibliotece  (cute) firmy Troll Tech, stanowicej niezalen od konkretnej platformy bibliotek klas C++, realizujcych funkcjonalno widetw skadajcych si na interfejs uytkownika. cilej w chwili
obecnej biblioteka  zawiera elementy charakterystyczne dla rodowisk MS Windows
oraz X Window System, moe wic by wykorzystywana zarwno na potrzeby aplikacji windowsowych, jak i linuksowych; na jej podstawie zrealizowano wanie linuksowy meneder okien KDE.
Biblioteka  nie jest bynajmniej jedyn dostpn midzyplatformow bibliotek klas;
to, i Borland zdecydowa si wanie na ni, wynika z kilku istotnych przyczyn. Po
pierwsze, jej klasy podobne s w duym stopniu do klas komponentw VCL na
przykad ich waciwoci zrealizowane zostay z udziaem metod dostpowych  
xxxx/ xxxx, po drugie wykorzystuj podobny do VCL mechanizm powiadamiania
o zdarzeniach (tzw. sygnay). Wreszcie po trzecie jej widety to nic innego jak standardowe kontrolki interfejsu uytkownika, speniajce t sam rol co standardowe
kontrolki Windows. To wszystko pozwolio na stworzenie komponentw biblioteki
CLX przez nadbudowanie pascalowych otoczek wok gotowych widetw zamiast budowania caej architektury od zera.

Jak przed chwil stwierdzilimy,  jest grup klas Object Pascala zbudowanych
na bazie funkcjonalnoci widetw biblioteki  co stanowi analogi do komponentw
VCL zbudowanych na bazie standardowych kontrolek Windows i biblioteki Windows
API. Podobiestwo to nie jest bynajmniej przypadkowe, lecz wynika z jednego z celw
projektowych: atwoci przystosowywania istniejcych aplikacji VCL do architektury
CLX. Rysunki 13.1 i 13.2 przedstawiaj hierarchiczn struktur klas w obydwu tych
rodowiskach; przyciemnione prostokty na rysunku 13.1 wyrniaj podstawowe klasy
biblioteki VCL.
Ju na pierwszy rzut oka wida rnic pomidzy obydwiema hierarchiami w architekturze CLX pojawiy si nowe (w stosunku do VCL) klasy, niektre zostay przesunite do innych gazi. Rnice te zaznaczone zostay na rysunku 13.2 za pomoc rozjanionych prostoktw. I tak, na przykad, komponent zegarowy (  ) nie wywodzi
si ju bezporednio z klasy ! ! , lecz z nowej klasy "! ! ! , stanowicej klas bazow do obsugi wszystkich tych przypadkw, gdy komponent niewizualny wymaga dostpu do uchwytu (handle) jakiej kontrolki  . Innym przykadem jest
etykieta  , nie bdca ju kontrolk graficzn, lecz wywodzca si z klasy # 
! , ktra wykorzystuje rnorodne moliwoci ksztatowania obrzea widetw  .
1

To spolszczona posta angielskiego terminu widget, ktry jest zlepkiem sw Visual Gadget przyp. tum.

  K!  "#  




Hierarchia klas VCL

Nieprzypadkowe jest take podobiestwo nazw klas bazowych kontrolek wizualnych


$!!  (VCL) i $% !  (CLX): charakterystyczny dla Windows czon
Win ustpi miejsca charakterystycznemu dla CLX Widget. Majc na wzgldzie
atwo przenoszenia kodu rdowego Borland zdefiniowa klas $!!  take
w bibliotece CLX, stanowi ona jednak tylko synonim klasy $% ! . Mona
byo oczywicie unikn tej nieco mylcej w skutkach (zwaszcza dla niewiadomego
uytkownika) operacji i utworzy dwa oddzielne moduy dla obydwu grup kontrolek,
a pniej odrnia je za pomoc symboli kompilacji warunkowej; utrudnioby to jednak przenoszenie kodu rdowego (identyfikator $!!  straciby racj bytu, a jego
systematyczna zmiana na $% !  wymagaaby dodatkowej fatygi), za w aplikacjach midzyplatformowych konieczne byoby utrzymywanie dwch identyfikatorw
na oznaczenie klasy bazowej kontrolek.

$


K     

Zwr uwag, i utrzymywanie w pojedynczym pliku kodu dla obydwu typw


komponentw (VCL i CLX) jest czym jakociowo rnym od tworzenia kodu
uniwersalnego komponentu CLX, dajcego si uy zarwno w Delphi 6, jak
i w Kyliksie (takimi komponentami zajmiemy si w dalszej czci rozdziau).


Hierarchia klas CLX

Na szczcie rnice przedstawione na rysunku 13.2 nie maj zbyt duego znaczenia
dla twrcw aplikacji, poniewa wikszo komponentw VCL posiada na gruncie
CLX identycznie nazwane odpowiedniki. Nie maj jednak takiego szczcia twrcy
nowych komponentw zmiany w hierarchii klas maj dla nich znaczenie zasadnicze.
Struktur hierarchii klas mona atwo zobaczy za pomoc przegldarki obiektw
(Object Browser) w Delphi 6 i w Kyliksie; jednak ze wzgldu na synonim $!! ,
uzyskamy dwie identyczne hierarchie (dla $% !  i $!! ).

Pomidzy VCL i CLX istnieje jeszcze wicej podobiestw, ktrych nie sposb
uwzgldni na przedstawionych rysunkach. Na przykad znane z VCL ptno (!&)
ma w CLX niemal identyczn natur i wykorzystywane jest w bardzo zbliony sposb,

  K!  "#  



cho oczywicie rnice pomidzy obydwoma rodowiskami przesdzaj o jego


odmiennej implementacji: w VCL jest ono otoczk kontekstu urzdzenia, za w CLX
analogicznego mechanizmu zwanego malarzem (painter), mimo to obydwa te mechanizmy reprezentowane s przez t sam waciwo "! . Ponadto, z uwagi na wymg
atwoci przenoszenia kodu, niemal identycznie wygldaj interfejsy komponentw
w obydwu grupach pod wzgldem repertuaru waciwoci publicznych ( ')
i publikowanych (( ) oraz zdarze ()!'*, )!(!% , )!+ , ) i ich metod
dyspozycyjnych ('*-., (!% -. i + , -.).

Mimo wielu podobiestw pomidzy analogicznymi elementami komponentw VCL i CLX,


istniejce midzy tymi rodowiskami rnice daj zna o sobie tym wyraniej, im blisza staje si zaleno konkretnego elementu od mechanizmu charakterystycznego tylko
dla jednego ze rodowisk. I tak, w rodowisku Kyliksa traci sens wikszo odwoa do
Win32 API; mechanizmy typowe jedynie dla Windows jak np. MAPI musz by
zastpione rwnowanymi mechanizmami linuksowymi, a uywajce ich komponenty
nie nadaj si po prostu do przeniesienia na platform linuksow. Z kolei niektre
problemy rozwizywane przez funkcje biblioteki RTL musz by rozwizane w inny
sposb przykadem moe by czuo Linuksa na wielko liter w nazwach plikw;
Pascal, niewraliwy na wielko liter w identyfikatorach, staje si pod Kyliksem wraliwy na wielko liter w nazwach moduw w dyrektywach  !
Linux pozbawiony jest te wielu znanych z Windows mechanizmw systemowych
nie ma tu technologii COM, s jednak obsugiwane interfejsy; nie ma te dokowania
okien, dwukierunkowej (bidirectional) obsugi tekstu, lokalizowania charakterystycznego dla krajw azjatyckich itp.
Pewnym problemem dla autorw aplikacji i komponentw jest istnienie oddzielnych
moduw, dedykowanych tylko okrelonym platformom, na przykad kod kontrolek windowsowych znajduje si w pliku Controls.pas, za kod dla widetw CLX w pliku
QControls.pas. Stwarza to moliwo pomieszania obydwu rodowisk w sytuacji,
gdy komponent CLX lub aplikacja przeznaczona dla Kyliksa opracowywane s w rodowisku Delphi 6. Tak skonstruowany komponent, jeeli zawiera elementy typowe
wycznie dla VCL, bdzie bez problemu pracowa w Delphi 6, najczciej jednak odmwi wsppracy pod Kyliksem. Mona unikn takiej sytuacji, gdy, za rad Borlanda,
komponenty i aplikacje przeznaczone dla Kyliksa bdziemy opracowywa pod Kyliksem niestety, rodowisko Kyliksa jest (w zgodnej opinii programistw) mniej komfortowe od Delphi 6.
Wobec opisanych konsekwencji rnic pomidzy VCL i CLX, nie wydaje si uzasadnione
uywanie komponentw CLX w aplikacjach przeznaczonych wycznie dla Windows.


 
Linux (a raczej podsystem /$!0) nie implementuje typowego dla Windows mechanizmu komunikatw; w efekcie nie do zaakceptowania jest w Kyliksie kod rdowy

%


K     

odwoujcy si do identyfikatorw w rodzaju 01


 ! 0!, 01  czy 01(.
Reagowaniem na zachodzce w systemie zdarzenia zajmuj si w bibliotece  wyspecjalizowane klasy dzieje si tak niezalenie od platformy systemowej, tak wic komponent CLX nie jest zdolny reagowa na komunikaty nawet pod Windows; zamiast
znanych z Delphi metod z klauzul  % (np. 2  (!% -.), powinien on korzysta z rwnowanych metod dynamicznych (  (!% -.), co wyjanimy dokadniej
w nastpnym punkcie.

 


W niniejszym punkcie przyjrzymy si nieco dokadniej przykadom transformacji komponentw VCL na rwnowane komponenty CLX. Na pocztek zajmiemy si popularnym spinerem to pomocniczy komponent wsppracujcy najczciej z polem
edycyjnym, dokonujcy jego automatycznej inkrementacji lub dekrementacji; realizuje
on wiele interesujcych mechanizmw (jak specyficzne rysowanie), wspprac z klawiatur i mysz, przyjmowanie i utrat skupienia (focus) itp.
Trzy kolejne komponenty to pochodne bazowego spinera. Pierwszy z nich wzbogacony
jest o obsug myszy i wywietlanie specyficznych kursorw ju na etapie projektowania, drugi realizuje wspprac z list obrazkw (3%  ), trzeci natomiast wsppracuje z kontrolk reprezentujc pole bazy danych.
Wszystkie prezentowane w tym rozdziale moduy nadaj si do wykorzystania zarwno
w Delphi 6, jak i w Kyliksie.

 
     
Rysunek 13.3 przedstawia trzy egzemplarze komponentu %!!  na formularzu
aplikacji CLX. W odrnieniu od pionowo uoonych strzaek, charakterystycznych dla
windowsowego spinera, komponent ten posiada odpowiednie przyciski w ukadzie poziomym: inkrementujcy i dekrementujcy.



Komponent
TddgSpinner
pomocny przy
wprowadzaniu
liczb cakowitych

Wydruk 13.1 przedstawia kompletny kod rdowy moduu %! implementujcego komponent %!! . Podobnie jak spiner windowsowy, wywodzi si on
z klasy  !  tyle e w tym przypadku jest to klasa CLX i komponent moe by uywany zarwno w Windows, jak i pod Linuksem.

  K!  "#  

&

Cho migracja na platform CLX rzadko wie si ze zmian nazw komponentw, to


jednak zasad jest poprzedzanie nazwy moduu VCL liter  dla podkrelenia zalenoci tego moduu od biblioteki  .
Kady z prezentowanych wydrukw zawiera wykomentowane linie stanowice cz
kodu VCL; komentarze oznaczone dodatkowo jako /45/ podkrelaj elementy
specyficzne dla przenoszenia komponentu z VCL do CLX.

QddgSpin.Pas kod 'rdowy komponentu TddgSpinner




  
 



    
  !" #
"  
 !"   
! $%
& '#


  
  !"  
 #

 ()*


    +,   

  
   
   !""-# $"    
 

 ". "
 
  '"+!
 -/01123*

4


5

 ."
 
6   
7- "5
&8
9
 :  6  7- "
;
< 5
8(

=
 &:
>(5


?@
"  &
 AB "5 C A<
  5
@D -
 A= 
(. "5


"&
(
 @
EE>


;C A<
  5
;<
" 
A<
  5
;=
A5
;=
9 -A<
  5
;:
=
F
A= 
5
;>=
F
A= 
5
EE9G
 " 
 ";B
-
 A  .?@
5
;B
-

A

?@
5
&8
EEC,HA
#  
"

!+
 
EEB
9
 
"  9:7 F &@:A9:7 F (5

'


K     
   I7 F 5
EEB



"  :?
 -
 &@:A:  (5
  "I?
 -
 5
8(
 " 
"  >
5@   5
"  F =
&=
A=
 5F
A= 
5
=
A3 "(5@ 5
EE: 
"  F "C &D
A<
  (5@ 5
"  <
"C &D
A<
  (5@ 5
.
" 
>  
A>
5
.
" 
: B@ =
&=
A=
 (A= 
5
EEC,HA?
 -
 +  +
"
!
EE"I?
 -
 
EE
"  ?
 -
 5@   5
EE     J
"  -
 5
 "5
.
" 

-
 & C A<
  (A= 
5
 "5
EE  .
 
   J
"  F?
 5@   5
"  F?K 5@   5
"  * F
&@* A95- .A- . (5@   5
"  : F
&=
A: =
5- .A- . 5
LA<
  (5@   5
"  : 6&=
A: =
5- .A- . 5
LA<
  (5@   5
&8
EEC,HA
#  " 

 
.
" 
F: 9- F
&- .A- . 5
: >A>
(A= 
5@   5
.
" 
F: 9- 6&- .A- . 5
: >A>
(A= 
5@   5
8(
.
" 
F: 9- F
&- .A- . 5
"
: >A>
(A= 
5@   5
.
" 
F: 9- 6&- .A- . 5
"
: >A>
(A= 
5@   5
EE: +  $" $"
"   =
&C A(5@ 5
"   =
9 -&C A<
  (5@ 5
"   C &C A<
  (5@ 5
 "

  K!  "#  


EE 
 @    

"
"  &DB
A

(5@   5
 - 
EE   "  $" $"
 =
A
 ;=

    =

 ."=
;" 5
 =
9 -A<
  
 ;=
9     =
9  .2M5
 <
" 
A<
  
 ;<
" 

   ;<
" 

 .25
 C A<
  
 ;C
    C 5
EE   "  J
 B
-
 A  .?@

 ;B
-

   ;B
-
 5
 B
-

A

?@

 ;B
-


   ;B
-

5
EEB  "
 $" $"  

 5
&8
 F5EEC,HA $" $%
+
 
8(
 F: 5
 ?
 5
 ;
5
 N - .2M5
 N 
 K5
 N
5
 >
- N
5
 >:
5
 - N
5
 B 5
  . 5
 C   5
 9 - .M15
 B
 "5
 B
FF5
 B
FB@ 5
 B
?
F5
 B
?
 5
 B
?K 5

(

%)


K     
 B
* F
5
 B
* > 5
 B
* 65
 B
: F
5
 B
: :@ 5
 B
: 65
 B
F5

5
 
 

4
: 



4
4
"
"

)  &DB
A

(5
 


-     &DB
(5
EE<
" " '
;=
A"=
;" 5
;=
9 -A2M5
;C A15
;<
" 
A25
;:
=
F
A; 5
;>=
F
A; 5
EE<
" "   "
"- $" $"
9 -AM15
N -A2M5
A 5
EEC,HA9  
  ' 
" 

A"9
 5
EEC,HA<
* +  + 

EE I7 F
<
* A<
* OP D Q5

5
: +  $" $" 4
"  

) =
&C A(5
 

 .;=
RHC -

 

;=
AC 5
<
@  5

5

5
"  

) =
9 -&C A<
  (5
 

 .;=
9 -RHC -

 

;=
9 -AC 5
<
@  5

  K!  "#  



5

5
"  

) C &C A<


  (5
 

 .;C RHC -

 

 .
-
 &C (-

 

;C AC 5
<
@  5
EE9
 
-

-
 5

5

5

5
:  !
 $ 
4
"  

)>
5
@
3A3 "5
LB.. A<
  5
A
5
B.. A<
  5EEC,HA

 


-   >
5
 -
@
 

;
A .);
5
>
)A"=
- 5
 .?
 -

=-)A .)
 
 

=-)A"=
;" 5
;
)A"=
- 5

5
EE9$  $%
&8
EEC,HA  KD 

+
 
  KD 
&N
 I
 I(5EE.
" 7F<
8(
3A3 "&;=
9 -,21
9 -,;=
9 -O2N -(5

@)3 "
 &3) .3)3)3 -3)=(5
<
. 3 "&3,2,2(5
A<
&;C (5
LB.. A3)O&3)=,3),

@) KN -&(( @05
EEC,HAB ".. &
+
.
"   KD 
(
B.. A3) .O&3)3 -,3) .,

%

%


K     

@) K9 -&(( @05
&8
EEC,HAS J  
 K3 "&
+
.
"   KD 
(
 K3 "&39 - @0LB.. (5
8(
 K3 "&3B.. LB.. (5
F =
&:
;:
=
F

3 "&11;=
9 -N -((5
F =
&>;>=
F

3 "&9 -,;=
9 -19 -N -((5
 .;" -

 

=-)A .)5
F ;"3 "&3(5

5

5

5

)>
4
"  

)F =
&=
A=
 5
F
A= 
5=
A3 "(5
 

 -
@
 

 .F
-
EE 
=-)A"=
-
 
=-)A;=
5
>
)A"=
- 5
3 "
 &=
) .=
)
=
)3 -=
)=(5
 .?
 -

 

&8
EE "D" @  
 
 
"D" @ N - -  K
>
)A"D" @  
5
=-)A"D" @  
5
8(
>
)A"D" @ = 5
=-)A"D" @ = 5


 
 

>
)A"=
- 5
=-)A"=
- 5

5
 .=
:
-
EE $ "   
 !"
 

3 "
 &TN - @0,2
;=
9 -,TN - @0O2(5


  EE $ " 
 
 !"
 

  K!  "#  


3 "
 &9 -,;=
9 -OTN - @0,2
9 -,TN - @0O2(5
3 "
 &9 -,;=
9 - @0,2
&N - @0(,&;=
9 - @0,T(
9 -,;=
9 - @0O2
&N - @0(O&;=
9 - @0,T((5

5
>
)A"9
  K5
=-)A"9
 5

5

5

)F =
4
"  

)F?
 5
 


-   F?
 5
EE
  
, $  !


EE%
  !"!+
3 
5

5
"  

)F?K 5
 


-   F?K 5
EE
" 
, $  !


EE
!%+
  !"!

3 
5

5
EEC,HA?
 -
 +  +
EE
"I?
 -
 
"  

)?
 -
 5
 


-   5
EE$ #
 
 

3 
5

5
:   J4



)
-

  
B
-

5 '% + # 

.
" !
" !  C)9$%  



3 
 $
   
  .
 

 #
)
4
.
" 


)
-
 & C A<
  (A= 
5
@
D -
 A= 
5
 

D -
 A 5
 .D 
&;B
-

(-

;B
-

& . C D -
 (5
3 AD -
 5

%

%$


K     

5
"  

)-
 5
 

 .D 
&;B
-
 (-

;B
-
 & .(5

5
EE '% + #
#  .  ! $" $%C 
EE
$ $ 
 ;C
"  

)F "C &D


A<
  (5
 

C AC ,D


5

5
"  

)<
"C &D
A<
  (5
 

C AC OD


5

5
:  '" !4
&8
EEC,HA>
#! ++  
 $" 
EE<
* & 
 (
"  

)9:7 F &@:A9:7 F (5


 


-   5
:)3 A"I9
D 5EE

  %
EE   

5
8(
"  

)* F
&@* A95- .A- . (5
 


-   * F
&* - .(5
EEC,HA 
 
. '  
EE  U@IU
 +
U* IU
" * .
* I .* IF
A
F "C &;<
" 
(5
* I6* I3 -A
<
"C &;<
" 
(5

5

5
  4
.
" 


)>  
A>
5
 

7 >&3 (5


3 A"

&3 (5

5

  K!  "#  


.
" 


): B@ =
&=
A=
 (A= 
5
@
3A3 "5
 

EE 
"  
" 
 .=
:
-

3A3 "&11;=
9 -N -(
 
3A3 "&9 -,;=
9 -19 -N -(5
EE"
   +  
"
 V
3 A><
3 "&3>  
(5

5
"  

): F
&=
A: =
5
- .A- . 5LA<
  (5
 


-   : F
&=
- .L(5
 .
&"F  




 (-

 ;"5EE
$



EE "  


 .&=
 .(

&: B@ =
&:
(: B@ =
&>((-

 

;:
=
F
A: B@ =
&:
(5
;>=
F
A: B@ =
&>(5
3 
5

5

5
"  

): 6&=
A: =
5
- .A- . 5LA<
  (5
 


-   : 6&=
- .L(5
 .=
 .-

 

 .: B@ =


&>(-

<
"C &;<
" 
(
   .: B@ =
&:
(-

F "C &;<


" 
(5
;:
=
F
A; 5
;>=
F
A; 5
3 
5

5

5
.
" 


)F: 9- F
&- .A- . 5
"
: >A>
(A= 
5
 


-   F: 9- F
&- .: >(5
F "C &;<
" 
(5
3 A 5

5

%

%%


K     
.
" 


)F: 9- 6&- .A- . 5


"
: >A>
(A= 
5
 


-   F: 9- 6&- .: >(5
<
"C &;<
" 
(5
3 A 5

5

)

Jak wida, kod rdowy moduu niewiele rni si od wersji w VCL. Mimo i rnic jest
niewiele, wikszo z nich jest jednak niezwykle istotna.
Po pierwsze, zwr uwag na nazewnictwo moduw:  , !  i ('; pojawi si te nowy modu   wsplny dla VCL i CLX.
Po drugie, mimo i deklaracja klasy komponentu niewiele odbiega w swej postaci od
wersji VCL pod wzgldem deklaracji pl i procedur zdarzeniowych nie ma w niej
metod obsugujcych komunikaty, (01 % i '1! (!% ). Kontrolka
!  (w CLX) zamiast wysya komunikat '1! (!%  przy zmianie jej waciwoci ! , wywouje po prostu (dynamiczn) metod ! (!% -. tote
do niej przeniesiona zostaa tre wyeliminowanej metody komunikacyjnej.
Podczas tworzenia komponentu czstym problemem jest obsuga klawiszy strzaek (na
klawiaturze); w przypadku komponentu %!!  powoduj one zmian reprezentowanej przez komponent wartoci. W bibliotece VCL informacja o zestawie klawiszy obsugiwanych przez kontrolk przekazywana bya za pomoc komunikatu 01 % ;
w CLX nie ma komunikatw i trzeba znale rwnowane rozwizanie zastpcze. Tak
si szczliwie skada, i kontrolka $% !  definiuje w tym celu waciwo
3! + , ktrej w konstruktorze przypisuje si stosown warto (i poszerza domylny repertuar obsugiwanych klawiszy o klawisze strzaek).
Wynika std praktyczny wniosek, i komponenty VCL uywajce raczej procedur zdarzeniowych (i metod zarzdzajcych zdarzeniami) ni komunikatw atwiej poddaj si
przenoszeniu na platform CLX.
Po trzecie w konstruktorze, oprcz ustawienia waciwoci 3! + , dokonywana
jest korekta standardowego ustawienia koloru kontrolki. W VCL kontrolka $!! 
dziedziczy swj kolor od kontrolki macierzystej (co symbolizuje warto '$!0),
tymczasem w CLX konstruktor klasy $% !  ustawia kolor kontrolki na '! ;
konieczna jest wic zmiana tego koloru na '$!0.
Na pocztku niniejszego rozdziau stwierdzilimy, i umiejtnoci nabyte w trakcie
projektowania komponentw VCL przydadz si w duym stopniu przy projektowaniu
komponentw CLX. Istotnie deklaracje waciwoci, metody dostpowe, a nawet
procedury zdarzeniowe nie rni si zasadniczo od tych uywanych przez komponenty
VCL. Pewnym wyjtkiem w tym wzgldzie jest metoda ,! -., wymagajca nieco
wicej przerbek.

  K!  "#  

%&

Pierwsz przyczyn tego stanu rzeczy jest nieobecno w CLX funkcji   6%!-.,
ktra w wersji VCL dokonywaa wyrodkowania wywietlanego tekstu. Funkcja ta wymaga
kontekstu urzdzenia GDI, dostpnego w VCL pod waciwoci !&"! i nieobecnego w CLX, gdzie wspomniana waciwo ma cakiem inne znaczenie wskazuje
na obiekt odpowiedzialny za wywietlanie (painter). Odpowiednie pooenie tekstu mona jednak wyliczy rcznie, za pomoc dostpnych geometrycznych metod ptna.
Kolejna ingerencja zwizana jest z kolorem, w ktrym (domylnie) zostayby wywietlone przyciski. Na obydwu platformach jest to kolor '6' &  !, jednak w CLX
warto ta utosamiana jest z '6' & "%(%(   (w module (').
Wszelkie operacje wykonywane na ptnie komponentu CLX poza jego metod
,! -. musz by poprzedzone wywoaniem metody !&  -.; po
zako1czeniu rysowania naley wywoa metod !& -..

Ostatnim z nieprzenonych elementw VCL, przysparzajcym czasem mnstwa kopotw, s kody wirtualnych klawiszy &*1xxxx, stanowice cz Windows API. CLX definiuje w ich miejsce cakowicie nowy zestaw staych rozpoczynajcych si od przedrostka
+ 1. W przypadku naszego komponentu nie jest to jednak duym problemem, ze wzgldu
na ubogi repertuar klawiszy (4) obsugiwanych w sposb specyficzny.
I tak oto uzyskalimy uniwersalny komponent, przydatny zarwno w Delphi 6, jak i w rodowisku Kyliksa. Najbardziej spektakularnym aspektem tej uniwersalnoci jest moliwo uycia tego samego kodu rdowego w obydwu rodowiskach!

 

  
      
Jak wida, przenoszenie komponentu do rodowiska CLX nie musi by wcale trudne
(chocia odkrycie waciwoci 3! +  wymagao nieco wysiku). Kiedy jednak przystpimy do rozbudowy komponentu CLX, rnice pomidzy VCL i CLX stan si bardzo wyrane.
Wydruk 13.2 przedstawia kod rdowy komponentu % %!! , pochodnego
w stosunku do %!! . Na rysunku 13.4 wida wyranie, jak kursor myszy zmienia swj wygld, gdy znajdzie si nad jednym z przyciskw; rysunek 13.5 pokazuje
natomiast zmian reprezentowanej wartoci na etapie projektowania (poprzez kliknicie
jednego z przyciskw).


Zmiana wygl*du
kursora wywoana
przez komponent
TddgDesignSpiner

%'


K     



Edycja wa-ciwo-ci
komponentu
TddgDesignSpiner
na etapie
projektowania
aplikacji


QddgDsnSpn.Pas kod 'rdowy komponentu TddgDesignSpiner

F



  
 

F  


  !" +


 
 !" 
 ! " 


   +
 
" ' ):#  
 

 $" $" C 
    
  
+" " 
 -/01123*

4

F

5

 ."
 
6  
5
&8
9
 :  6  7- "
;

5
8(

F  


"&

(
 @
EEC,HA" 
N. 
;-AN5
&8
EEC,HAB'  
 " <F? 

EE!  

" 
# C)
EE>
#  ". "
C
;-AN5
EEB
9
 
"  9: &@:A9: (5
   I 5
EEB



"  :F  
N  &@:A:F  
N  (5
  "IF  
N  5

  K!  "#  


8(
 " 
"  -
 5@   5
EEC,HA>
#  !  .
 
 
"  : :@ &- .A- . 5
LA<
  (5@   5
.
" 
F  
?@
 &
 AB "N5
?@
A?@
N(A= 
5@   5
 "
"
"  &DB
A

(5@   5
 "F 5@   5

5
 
 

&8
EEC,HA
 '  "W3FF

) 4EE!"'  !"
8(
 
 
;5EEC,HA
EEC,HA . &
.-   

.
EE- (    
""

EEC,HA>
#   "   
 !  
EE
"

= AP1))X08T,2Q.= &
W11WX1W11W11W11WTMW11W11
W11WTMW11W11W11WTMW11W11
W11WTMW11W11W11WT?W11W11
W11WTYW1W11W11WTYWX1W11
W11WTYW0MW11W1XWTYW0TW11
W1TW1W0TW11W1TWT1W1TW11
W10WT1W1TW11W10W11W1TW11
W12W11W1TW11W12W11W1TW11
W11WM1W1MW11W11WT1W1MW11
W11WT1W1MW11W11W01W21W11
W11W01W21W11W11WZ;W;MW11
W11WZ;W;MW11W11WZ;W?MW11
W11WZ;W;MW11W11W11W11W11
W11W11W11W11W11W11W11W11
W11W11W11W11W11W11W11W11
W11W11W11W11W11W11W11W11(5
:AP1))X08T,2Q.= &
W11WX1W11W11W11WZMW11W11
W11WZMW11W11W11WZMW11W11
W11WZMW11W11W11WZ?W11W11
W11WZ;W1W11W11WZ;W;1W11
W11WZ;W;MW11W1XWZ;W;W11
W1ZW;;W;W11W1ZW;;W;W11
W1XW;;W;W11W1XW;;W;W11
W12W;;W;W11W12W;;W;W11

%(

&)


K     
W11W;;W;MW11W11WZ;W;MW11
W11WZ;W;MW11W11WX;W;1W11
W11WX;W;1W11W11WZ;W;MW11
W11WZ;W;MW11W11WZ;W?MW11
W11WZ;W;MW11W11W11W11W11
W11W11W11W11W11W11W11W11
W11W11W11W11W11W11W11W11
W11W11W11W11W11W11W11W11(5
4
: F  


4
4
"
"F  


)  &DB
A

(5
@
= = A= N5
:= A= N5
 


-     &DB
(5
&8
EEC,HA9
 

;-A&N<

" [FF > I= 63B3[(5
8(
EEC,HA 

  "
= = A= I"  &X0X0\= ; (5
:= A= I"  &X0X0\:; (5

;-AI"  &= = := M1(5
.

= I &= = (5
= I &:= (5

5

5
 "F  


)F 5
 

&8
C,HAIF  F 
F &;-(5EE 
 7F<
8(
IF &;-(5

-   F 5

5
EE
   +
 
" '  J  !
&8
EEC,HA 

'
"  F  


)9: &@:A9: (5


 

 .: B@ =
&:
(: B@ =
&>(-

 &;-(
 

-   5

5
8(

  K!  "#  


EEC,HA>  .
 
 : :@  "   

"  F  


): :@ &- .A- . 5


LA<
  (5
 

 .: B@ =
&:
(: B@ =
&>(-

9  I &N


 ;-(
 
9  I6
 &N
 (5

-   5

5
&8
EEC,HA9

' )6#   
 
EEF  
?@
 )
"  F  


):F  
N  &@:A
:F  
N  (5
 

EEB !"

 
 
+ $" $"
EEC 
    
"! " )
EE7
   +
 
" ' 
EE $" ! 
!
+ 2,
 F -
EE
" +  %

+ J
EE !
"-!
 .: B@ =
&:
(: B@ =
&>(-

:)3 A2
 
:)3 A15

5
8(
.
" 
F  


)F  
?@
 &
 AB "N5
?@
A?@
N(A= 
5
@
: >A>
5
 

3 A; 5
 .&
 N
 (

&?@
I &?@
(
P?@
 I: =
> 
?@
 I: =
3   
?@
 I: =
F "Q(-

 

EE  A #!"" 


  
EE 
  
  ! "%)
: >A>
&: ?@
IK&: ?@
N&?@
((
: ?@
I&: ?@
N&?@
(((5
 .: B@ =
&:
(: B@ =
&>(-

3 A
 
3 A; 5

5

5

&

&


K     
"  F  


)-
 5
@
;A;5
 


-   -
 5
EE6
 $ 
! 
   '  $%
EE $" $" C
 ."F  




 -

 

;A7 >
;& .(5
&8
EEC,HA;)F  
! 
 F  
N
 .&;RH
(
&;)F  
RH
(-

;)F  
): . 5
8(
 .&;RH
(
&;)F  
NRH
(-

;)F  
N): . 5

5

5

)

Po przeanalizowaniu komentarzy ponownie mona zauway wyeliminowanie kodu


zwizanego z systemem komunikatw Windows. Dla kontrolki Windows sygnaem do
zmiany wygldu kursora jest otrzymanie przez ni komunikatu 01 , w odpowiedzi na co powinna wywoa funkcj  -. z odpowiednim parametrem. W CLX
nie ma komunikatw, trzeba zatem kontrolowa pooenie kursora za pomoc zdarzenia
)!2 2& ; gdy kursor znajdzie si nad jednym z przyciskw, naley nada kursorowi
dany wygld za pomoc funkcji $% 1 -., w przeciwnym razie zapewni jego ksztat domylny przez wywoanie funkcji $% 1! -..
Osobnym problemem jest samo okrelenie ksztatu kursora. W Windows robi si to
bardzo prosto, na przykad przez wczytanie odpowiedniego zasobu za pomoc funkcji
-.. W bibliotece  przeciona funkcja 1'  -. udostpnia rnorodne sposoby tworzenia kursorw, nie przewidujc jednak wykorzystania w tym celu
zasobw. Rozwizaniem zastpczym (ktre wykorzystalimy w naszym przykadzie)
jest wwczas zdefiniowanie dwch bitmap, z ktrych pierwsza okrela rozmieszczenie
czarnych i biaych pikseli w obrazie kursora, druga natomiast stanowi mask okrelajc jego przezroczyste regiony.
Kolejne zadanie polega na spowodowaniu przejcia przez komponent (niektrych) zdarze myszy na etapie projektowania. Komponent VCL sygnalizuje gotowo do takiej
obsugi, zwracajc warto 7 w odpowiedzi na komunikat '1 %!"  . W CLX
analogiczne zadanie spenia dynamiczna metoda %!& !  -., zwracajca wynik typu Boolean; komponent powinien j przedefiniowa stosownie do swej specyfiki.
I ostatni problem skoro komponent % %!!  posiada zdolno modyfikowania swej waciwoci  , modyfikacja ta nie moe odbywa si bez wiedzy inspektora
obiektw. W VCL mechanizmem zapewniajcym aplikacji czno z projektantem

  K!  "#  

&

formularzy jest interfejs ukrywajcy si pod waciwoci %!  formularza bdcego wacicielem komponentu; w CLX analogiczna waciwo nosi nazw %! "
*. Aby zasygnalizowa zmian zawartoci komponentu, naley wywoa metod 2
8  wspomnianego interfejsu, w ramach obsugi zdarzenia )!(!% robi si to tak
samo w VCL i CLX.


    
      
Kolejne rozszerzenie naszego komponentu (ktry nosi teraz nazw %3% !! )
polega na wyposaeniu go w bitmapy okrelajce wygld obydwu przyciskw. Bitmapy
te stanowi elementy listy typu 3%  (patrz rysunek 13.6) i wywietlane s zamiast
zwykych znakw + i .


Bitmapy nadaj*ce
wygl*d przyciskom
komponentu
TddgImgListSpinner

Kod rdowy moduu implementujcego komponent jest przedstawiony na wydruku


13.3; w porwnaniu z wydrukiem 13.2 zmiany wynikajce z przejcia na platform
CLX s znacznie mniejsze.


QddgILSpin.pas kod 'rdowy komponentu TddgImgListSpinner

<


  
 

< 

  !"
 +F  


)9! " '  $


  
 
 !"  $% 

 )
 -/01123*

4

<
5

 ."
 
  
F

< 5
&8
9
 :  6  7- "
;

F

< 5
8(

&$


K     

< 

"&F  


(
 @
;< A<  5
;< <
 K AP2))0Q.<
  5
;< -
 
A-
 
5
EE9
+
"   J
"  <  -
 &
 AB "(5
 " 
"    . " 
&D

A

5
B  
AB  
(5@   5
"  F =
&=
A=
 5F
A= 
5
=
A3 "(5@   5
"  "
 B.. &=
A3 "5@A<
  (5
"  - ":
  5
EE: +  $" $"
"   < &C A<  (5@ 5
.
" 
7 < <
 K&><
 KA<
  (A<
  5@ 5
"   < <
 K&><
 KA<
  5
C A<
  (5@ 5
 "
"
"  &DB
A

(5@   5
 "F 5@   5
 - 
 < A<  
 ;< 
    < 5
 < <
 K:
A<
  

 K2
 7 < <
 K
    < <
 K5
 < <
 K>A<
  

 K0
 7 < <
 K
    < <
 K5

5
 
 

 
7- "5EEC,HA:
4
: < 

4
4
"
"< 

)  &DB
A

(5
 


-     &DB
(5
;< -
 
A-
 
)  5
;< -
 
)B
-
 A<  -
 5

  K!  "#  


EE
##



 $ 
+
EE -
 

#  
  %
EE"   

;< <
 K P2QA,25
;< <
 K P0QA,25

5
 "< 

)F 5
 

;< -
 
); 5

-   F 5

5
"  < 

)  . " 
&D

A

5
B  
AB  
(5
 


-     . " 
&D

B  
(5
 .&B  
3 @ (
&D

;< (-

 < &


(5EE  
 +

5
.
" 
< 

)7 < <


 K&><
 KA
<
  (A<
  5
 

3 A;< <


 K P><
 KQ5

5
"  < 

) < <


 K&><
 KA<
  5
C A<
  (5
 

 .;< <
 K P><
 KQRHC -

 

;< <
 K P><
 KQAC 5
<
@  5

5

5
"  < 

) < &C A<  (5


 

 .;< RH
-

;< )6
3   -
 &;< -
 
(5
;< AC 5
 .;< RH
-

 

;< )3   -


 &;< -
 
(5
;< );  . " 
& .(5
- ":
  5

5
<
@  5

5
"  < 

)<  -
 &
 AB "(5
 

 .
 < -

 

&

&%


K     
- ":
  5
EE9  6  <
@   "
EE
 
 

6 5

5

5
"  < 

)- ":
  5
 

EE
! $%# " '  $" 
EE"! +
 .;< )9 -H=
9 --

=
9 -A;< )9 -5
 .;< )N -HN --

N -A;< )N -5



5
"  < 

)F =
&=
A=
 5
F
A= 
5
=
A3 "(5
@
A<
  5
 

 -
@
 

=-)A=
5
>
)A"=
- 5
3 "
 &=
) .=
)
=
)3 -=
)=(5
 .=
:
-
EE $  +" U
U
 

 .&< RH


(
&< <
 K:
RH,2(-

 

&8
EEC,HA <   
#   

EE#   
 $" $" =)
 .F
-

;< )F
 A  " 
 
;< )F
 A 5
8(
 .F
-

;< )=A"=
-
 
;< )=A"=
;" 5
"
 B.. &=
(5
&8
EEC,HA<  )F  

 
;< )F &
@< <
 K:
?
 (5
8(
;< )F &
@< <
 K:
 < 
?
 (5


 

  K!  "#  

&&


-   F =
&=
F
=
(5


  EE $  +" UU
 

 .&< RH


(
&< <
 K>RH,2(-

 

&8
EEC,HA <   
#   

EE#   
 $" $" =)
 .F
-

;< )F
 A  " 
 
;< )F
 A 5
8(
 .F
-

;< )=A"=
-
 
;< )=A"=
;" 5
"
 B.. &=
(5
&8
EEC,HA<  )F  

 
;< )F &
@< <
 K>?
 (5
8(
;< )F &
@< <
 K> < 
?
 (5


 

-   F =
&=
F
=
(5

5

5

5< 

)F =
4
"  < 

)"
 B.. &=
A3 "5
@A<
  (5
 

 .;< RH
-

 

A=
) .O&=
)3 -,=
) .( @0,
&;< )9 - @0(5
A=
)O&=
)=,=
)( @0,
&;< )N - @0(5

5

5

)

Lista obrazkw 3%  , w VCL stanowica otoczk standardowej kontrolki implementowanej w bibliotece   , w CLX zaimplementowana zostaa w zupenie
inny sposb, za pomoc tzw. prymityww graficznych biblioteki  . T now implementacj zawiera modu 3% , ktry tym samym zastpi na licie   modu
3% . Nie zmieni si jednak zasadniczo sposb korzystania z listy, ani te nazwa jej
klasy, czego wymiern korzyci jest niezmieniona deklaracja klasy komponentu
(w stosunku do jego wersji VCL). Identyczne s te metody komponentu w obydwu
wersjach, z jednym wszake wyjtkiem.

&'


K     

Wyjtkiem tym jest metoda 0


 !-., rnica w stosunku do VCL wynika z faktu,
i w CLX lista 3%  nie operuje pojciem stanu przycisku (zwolniony, nacinity,
itp.) reprezentowanego w VCL przez waciwo 0!%  , stan ten naley wic
rozrnia samodzielnie poprzez zmian koloru ta, ktry reprezentowany jest przez
waciwo
*. Ponadto metoda 3%   0-. ma w CLX nieco inne parametry ni w VCL, inne jest wic jej wywoanie.

    ! 


   "  
Skoro nadalimy estetyczny wygld przyciskom komponentu, warto teraz poeksperymentowa z przechowywan przez niego wartoci, a raczej z jej rdem. Kolejny
komponent pochodny %
!!  czerpie t warto z pola zbioru danych,
ktre reprezentowane jest przez jego waciwoci  ' i  # . Rysunek 13.7
przedstawia komponent %
!!  skojarzony z polem  !  zbioru & ! .


Komponent
TddgDBSpinner
u/ywany do edycji
pola bazy danych

Kod rdowy moduu implementujcego komponent zosta przedstawiony na wydruku 13.4.



 QddgDBSpin.Pas kod 'rdowy komponentu TddgDBSpinner

F=


  
 

F=

)<

' 


< 

 

"-)
 -/01123*

4

F=
5

 ."
 
6  <
F=F=5
&8
9
 :  6  7- "
;
<
F=F=5
8(


  K!  "#  


F=

"&< 

(
 @
;F
A; F
5EE
+
"EE
+
" 

"  F-
 &
 AB "(5
"  6 F&
 AB "(5
"  D" @ -
 &
 AB "(5
&8
EEC,HA 

'
"  :?K &@:A:?K (5  "I?K 5
"  :F  
N  &@:A:F  
N  (5
  "IF  
N  5
8(
 " 
"    . " 
&D

A

5
B  
AB  
(5@   5
"  - ";  &"
C A
(5@ 5
EE  .
 
 ! !" 

"  -
 5@   5
"  * > &@* A-(5@   5
EEC,HAF?K  :?K 
"  F?K 5@   5
EEC,HAF  
?@
  :F  
N  
.
" 
F  
?@
 &
 AB "N5
?@
A?@
N(A= 
5@   5
EE  .
 
 .  !"  $" $%C
"  F "C &D
A<
  (5@   5
"  <
"C &D
A<
  (5@   5
EE +  $" $"
.
" 
7 ; A; 5@ 5
.
" 
7 F; A
5@ 5
"   F; &"
C A
(5@ 5
.
" 
7 F" AF" 5@ 5
"   F" &C AF" (5@ 5
.
" 
7 3 B
A= 
5@ 5
"   3 B
&C A= 
(5@ 5
EE+ !"

" ; A; 
 7 ; 5
 F
A; F

 ;F
5
 "
"
"  &DB
A

(5@   5
 "F 5@   5
 - 
 F; A

 7 F; 
    F; 5
 F" AF"

&(

')


K     
 7 F"
    F" 5
EE   +
$" !!"
 
 3 B
A= 

 7 3 B



    3 B

 .; 5

5

?<
@ ;  "&?K"  
(5
 " 

<
@ ;  [ 
 
"-  %[O
[<
  
9;[5
 
 

 
 5EEC,HA:
4
: F=

4
4
"
"F=

)  &DB
A

(5
 


-     &DB
(5
;F
A; F
)  5
EE
. !"

"- #
 
!
EE 
! 
";F
)
A .5
EE! " 
 5#

 $ 

EE+!"
 
#   % 

;F
)B
F-
 AF-
 5
;F
)B
6 FA6 F5
;F
)B
D" @ -
 AD" @ -
 5

5
 "F=

)F 5
 

;F
); 5
;F
A
5

-   F 5

5
"  F=

)  . " 
&D

A

5
B  
AB  
(5

  K!  "#  


 


-     . " 
&D

B  
(5
 .&B  
3 @ (

&;F
RH
(

&D

;F
)F" (-

 

F" A
5EE$ 
    F"

5

5
.
" 
F=

)7 ; A; 5


 

3 A;F
); 5

5
.
" 
F=

)7 F; A


5
 

3 A;F
);   5

5
"  F=

) F; &"


C A
(5
 

- ";  &C (5


;F
);   AC 5

5
.
" 
F=

)7 F" AF" 5


 

3 A;F
)F" 5

5
"  F=

) F" &C AF" (5


 

 .;F
)F" RHC -

 

;F
)F" AC 5
EE9 
;  . " 
 
"

#


EE  
 !" '
"-# 
  % + 

.
EE 
" .C RH
-

C );  . " 


& .(5

5

5
.
" 
F=

)7 3 B
A= 
5
 

3 A;F
)3 B
5

5
"  F=

) 3 B
&C A= 
(5
 

;F
)3 B
AC 5

5

'

'


K     
"  F=

)- ";  &"


C A
(5
@
;  A;  5
 

EE G" 


 
"- 
EE.<
  .<
.9.;, #  

EE 
   ! 
 .&C RH[[(

&;F
RH
(

&;F
)F RH
(

&;F
)F )D" @ (-

 

;  A;F


)F ); =  &C ()F 5
 .&;  RH.<
  (

&;  RH.<
(

&;  RH.9(

&;  RH.;(-

 

  ?<
@ ;  )  &<
@ ;  (5

5

5

5
"  F=

)-
 5
 

EE
. !"
# 
 +

 .;F
RH
-

;F
): . 5

-   -
 5EE7
 
B
-


5
"  F=

)* > &@* A-(5


 


-   * > &* (5
 .* ]0Z-
EE"
" $
+?V
 

;F
)3  5EE
 
" $
+" 
* A]15EE

! J"
 "

5

5
"  F=

)F "C &D


A<
  (5
 

 .3 B

;F
)
: .-

 

EE
#

 
"- 

&8
EEC,HA:  =  9
 D><.
" 

:  = &1(


8(
= 5


 
 

  K!  "#  


EE  '
"-  "  .   $%
 .;F
)? -


-   F "C &D
(5

5

5
"  F=

)<
"C &D
A<
  (5
 

 .3 B

;F
)
: .-

 

EE
#

 
"- 

&8
EEC,HA:  =  9
 D><.
" 

:  = &1(


8(
= 5


 
 

EE  '


"-  "  .   $%
 .;F
)? -


-   <
"C &D
(5

5

5

F=

)F-


 # %  
 "- ' A
2)S
 + $% 

!
0) 
 '
"- !"
   "
X)S
 + $% 
 
"T)S
 + #!"    
"^)3     
   
 
" 
_)9$" $%F; 
 




4
"  F=

)F-
 &
 AB "(5
 

 .;F
); RH
-

C A;F
); )D<
  5

5

F=

)6 F

    
  "  $% 

  $%
   !
"-
" )9  

  
  

% $%)
4
"  F=

)6 F&
 AB "(5
 

'

'$


K     
;F
); )D<
  AC 5

5

F=

)D" @ -


    
  
" 
 

 
"- )
 +  $" $%D" @ )
  
 "  
"-#
"% $" $"
;F
)D" @
4
"  F=

)D" @ -
 &
 AB "(5
 

EE 
 
"- G 

 .&;F
RH
(
;F
)D" @ -

- ";  &F; (5



5
&8
EEC,HAF?K  :?K 
"  F=

):?K &@:A:?K (5


 

EE>'

 
" 

;F
)6 3 "5
 K" 
 ;"5EE
 '
+

EE "  +
 
  5EE
'   ! 

5

-   5

5
8(
"  F=

)F?K 5
 

EE>'

 
" 

;F
)6 3 "5
 K" 
 ;"5EE
 '
+

EE "  +
 
  5EE
'   ! 

5

-   5

5
&8
EEC,HAF  
?@
  :F  
N  

  K!  "#  


"  F=

):F  
N  &@:A:F  
N  (5
 

EE 
 # %# $% "  $"
EE
    
# ! +
"
$" !
EE 
 
 
"-  "
:)3 A15

5
8(
.
" 
F=

)F  
?@
 &
 AB "N5
?@
A?@
N(A= 
5
 

EE 
 # %# $% "  $"
EE
    
# ! +
"
$" !
EE 
 
 
"-  "
3 A; 5

5

)

'

You might also like