You are on page 1of 32

Molnr Roland

Adatbzis-kezel rendszerek fejlesztse Delphi


nyelven
Bevezets a Delphi-s adatbzis-kezels rejtelmeibe

Tartalomjegyzk
Bevezets.....................................................................................................................................3
A munkhoz kapcsold gyakorlati feladatok ....................................................................3
I.Az adatbzisokrl......................................................................................................................4
Alapfogalmak, elvek ...........................................................................................................4
Adatbzis ....................................................................................................................4
Adatbzis-kezel rendszer ..........................................................................................4
Adatmodellek alapelemei ...........................................................................................4
Az egyed..........................................................................................................4
A rekordtpus...................................................................................................4
A tulajdonsg...................................................................................................4
A kulcs.............................................................................................................4
A kapcsolat ......................................................................................................5
Adatmodell .................................................................................................................5
A normlformk .........................................................................................................5
Els normlforma (1NF) .................................................................................5
Msodik normlforma (2NF)...........................................................................5
Harmadik normlforma (3NF).........................................................................6
Magasabb normlformk.................................................................................7
A lookup .....................................................................................................................7
Trzsadattbla.............................................................................................................7
SQL.............................................................................................................................7
Adatbzis-tervezs ..............................................................................................................7
II.A Delphi adatbzis-kezel rendszere .......................................................................................8
Alapok, BDE.......................................................................................................................8
Alias ltrehozsa, szerkesztse ...................................................................................9
Tbla ltrehozsa, szerkesztse...................................................................................9
SQL lekrdezs ksztse .........................................................................................10
Komponensek....................................................................................................................10
III.A Delphi adatbzis-kezel komponensei..............................................................................10
TDataSet, mindennek az alapja.........................................................................................10
Data Access komponensek................................................................................................10
TDataSource.............................................................................................10
TTable ......................................................................................................10
TQuery .....................................................................................................11
TUpdateSQL ............................................................................................12
TBatchMove.............................................................................................12
Data Controls komponensek .............................................................................................12
TDBGrid ..................................................................................................12
TDBNavigator..........................................................................................13
TDBText ..................................................................................................13
TDBEdit ...................................................................................................13
TDBMemo ...............................................................................................13
TDBImage................................................................................................13
TDBListBox.............................................................................................13
TDBComboBox .......................................................................................13
1

TDBCheckBox .........................................................................................13
TDBRadioGroup ......................................................................................13
TDBLookupListBox.................................................................................13
TDBLookupComboBox ...........................................................................14
TDBRichEdit............................................................................................14
TDBCtrlGrid ............................................................................................14
TDBChart.................................................................................................14
Nyelvi problmk..............................................................................................................14
TDataModule ....................................................................................................................14
IV.Egy adatbzis-kezel alkalmazs elksztse .......................................................................15
Tervezs ............................................................................................................................15
A DataModule...................................................................................................................15
Az ablakok ........................................................................................................................16
Ablaktpusok.............................................................................................................17
A fkperny ............................................................................................................18
Tblamegjelent ablakok.........................................................................................18
Adatlapok..................................................................................................................20
Mveletvgz ablakok..............................................................................................21
Kimutatsok..............................................................................................................22
Folyamatkijelzk (ProgressBar-ok) .........................................................................23
Nyomtats, riport ......................................................................................................23
Project.......................................................................................................................24
V.Egyb problmk ...................................................................................................................25
Hibakezels .......................................................................................................................25
Hlzat hasznlata Paradox rendszerrel ............................................................................26
Biztonsgi problmk........................................................................................................27
Biztonsgi ments.....................................................................................................27
Adatsrlsek kezelse .............................................................................................27
Telept ksztse ..............................................................................................................28
Ksztsnk CD-t! ......................................................................................................30
VI.Lezrs .................................................................................................................................30
Irodalomjegyzk ........................................................................................................................31

Bevezets
A Borland Delphi napjaink egyik legfejlettebb alkalmazs-fejleszt rendszere. Elssorban adatbzisrendszerek ksztsre sznjk, de gyakorlatilag brmilyen szoftvert el lehet kszteni vele. Mivel mindig is
rdekelt a programozs s a modern technolgia, autodidakta mdon foglalkozni kezdtem vele (a fiskolai
tanrkon az 1992-es dtum Turbo Pascal 7.0 volt a legjabb fejlesztkrnyezet, amellyel tallkoztam).
Ksbb mr komolyabb alkalmazsokat is fejlesztettem Delphi-vel, gy a szmtstechniknak ez a terlete lett
az, amivel a legtbbet foglalkoztam. Rengeteg tapasztalatot gyjtttem, amelyet mindig is szerettem volna
megosztani olyanokkal, akiknek szksgk van r. Ezrt vlasztottam ezt a tmt dolgozati tmnak. n szemly
szerint a Delphi-vel val ismerkedsem idejn szvesen forgattam volna egy ilyen munkt, elkerlve ezzel
rengeteg bosszsgot s ksrletezst. Ezt a tmt vlasztva remlem, hogy ez a munka msokhoz is eljut, s
segt kezet nyjt mindazoknak, akik kzelebbrl is meg szeretnnek ismerkedni a Delphi-vel.
Ez a dolgozat azoknak szl, akik most ismerkednek a Borland Delphi fejleszteszkzzel, s szeretnk
megtenni az els lpseket az adatbzis-kezel rendszerek fejlesztse fel. Ez a dolgozat egy rvid, de lnyegre
tr kalauz, mely vgigvezet a kezdetektl egszen a telept ksztsig minden nagyobb llomson, amelyen
egy adatbzis-kezel szoftver fejlesztse sorn t kell haladni. Clja nem az, hogy megmutassa, hogyan kell
fejleszteni, hanem az, hogy megmutassa, hogyan lehet elkezdeni. Minden kezdet nehz hangzik a kopott
monds. Ezen a nehz kezdeten igyekszik tsegteni olvasjt. Vgigolvasva, kvetve a tancsokat mr btran
hozzkezdhet a Kedves Olvas a fejlesztshez. Ne vrjon azonban teljes kr lerst vagy magyarzatot, hiszen
mindenrl rszletes informci tallhat a Delphi sgjban (Help), s n nem azt kvntam magyartani. Sokkal
inkbb egy tfog segtsget szeretnk nyjtani, mindenhol utalva a Delphi Help-re.
Ahhoz, hogy e munka tanulmnyozsa eredmnyes legyen, a kvetkez dolgok szksgesek:
- Id, hiszen ez nem megy egyik pillanatrl a msikra.
- Ksrletez kedv, mert programozni tanulni csak gy lehet, ha ksrletezgetnk.
- Angoltuds, mivel a Delphi s a hozz tartoz sg angol nyelv, gy a helyes hasznlat rdekben legalbb
minimlis angoltudssal s egy j sztrral kell rendelkezni.
- Szmtgp s egy teleptett Delphi 3, 4 vagy 5
A dolgozat rsakor Delphi 5-t hasznltam, gy elfordulhat, hogy a tbbi verziban egy-kt dolog
mshogy s mshol van, de a lnyeg mindegyiknl megegyezik.
A dolgozat felptst tekintve az elmlettl halad a gyakorlat fel. Elszr adatbzis-kezelsi
alapfogalmakat ismertet, majd a Borland adatbzis-kezelsnek elvi mkdst magyarzza, azutn pedig rtr
az adatbzis-kezel rendszerek fejlesztsnek lpseire. Vgl klnbz gyakorlati problmk megoldsra
nyjt hasznos tancsokat.
A dolgozatban sokat fogok hivatkozni a Delphi sgjra, a kvetkezkppen: (Delphi Help: Tmakr).
Az itt megadott tmakrt berva a Trgymutat ablak keres sorba, megtalljuk az oda vonatkoz bvebb
lerst. Az irodalomjegyzkben szerepl irodalmakra a kvetkezkppen utalok: [jegyzkszm/oldalszm] (pl.:
[2/213] = Szelezsn Jnos Adatbzisok c. knyvnek 213. oldala).

A munkhoz kapcsold gyakorlati feladatok


Jelen munka ksztse eltt mr volt szerencsm adatbzis-kezel alkalmazsokat fejleszteni, gy kell
tapasztalatot szereztem a Delphi-s Paradox rendszerek mkdtetsrl, programozsrl. A dolgozatomban ezen
munkkrl kszlt kpernykpek (s egy-kt helyen ezekbl kimsolt kdrszletek) tallhatak. Ezek a munkk
azonban nem kapcsoldnak konkrtan a dolgozat trgyhoz, hiszen ltalnossgban beszlek a feladatokrl.
Nem lttam teht sok rtelmt annak, hogy ezekkel bvebben foglalkozzak. A pontossg kedvrt azrt
szeretnm kzlni, milyen munkk ezek.
Az egyik feladat egy helyi rdi reklmadminisztrcijnak szmtgpestse volt. Az adatbzis
rendkvl egyszer, mindssze hrom f- s ngy altblbl ll. A hrom ftbla kzl az egyik a reklmok
adatait trolja (felvtel idpontja, hirdetpartner, hirdetsszervez, futs kezdete, vge, darabszm, fizets
dtuma, mdja, a reklm szvege, tpusa, stb.). A msodik tblban a hirdetpartnerek, a harmadikban a
hirdetsszervezk adatai vannak (nv, cm, telefonszm, stb.). A ngy altbla kzl egy a reklmtpusokat, egy a
fizetsmdokat, egy a felhasznlkat, egy pedig a felhasznli tpusokat trolja. A tblk kztt egyszer 1:N
relcik vannak.
3

A msik feladat ennl lnyegesen bonyolultabb: egy tterem rendels-, szmla-, s raktrnyilvntartst
kellett megoldani. A rendszer kt rszbl ll: az ttermi program a rendelsekkel s a szmlkkal foglalkozik, a
raktr program pedig a raktrkszlettel, s az ttermi program ltal regisztrlt rendelsek alapjn (a sajt
sszetev-adatbzist hasznlva) a raktri ttelek mennyisgnek automatikus aktualizlsval. A rendszer kt
adatbzist (tterem s raktr), s sszesen 29 Paradox tblt tartalmaz. Az ttermi program az ltala trolt
hatalmas adatmennyisg (rendelsek s szmlk) ellenre megfelel sebessggel dolgozza fel az adatokat,
ksznheten annak, hogy a rendelsek s szmlk adatait kt-kt tblban is trolja. Egyikben az aktulisakat, a
msikban a rgebbieket, melyekkel a program csak zrs esetn foglalkozik. rdekes feladat volt mg a
szmlanyomtatk kezelse, melyet gy oldottam meg, hogy meghajtprogram (driver) nlkl mkdjn.
Mindkt szoftver lehetv teszi a hlzati hasznlatot, mely igazn az tterem programnl volt nagy
kihvs, hiszen nagyobb forgalom idejn egyszerre tbb szmtgpen veszik fl a rendelseket s adjk ki a
szmlkat, gy rendkvl sr s nagy az adatmozgs.
Az emltett munkk ksztse alatt szerzett tapasztalataim prblom tadni ezen dolgozat keretein bell.

I.

Az adatbzisokrl

Alapfogalmak, elvek
Ebben a rszben az adatbzisokkal kapcsolatos ltalnos fogalmakkal ismerkednk meg.

Adatbzis
Amikor az ember adatbzis-kezel szoftverrel dolgozik, hajlamos azt hinni, hogy minden, amit azzal
vgez, az adatbzis s adatbzis-kezels. Ez azrt van, mert nagyon sokan nincsenek tisztban az adatbzis
fogalmval. Nhny adatfjl mg nmagban nem adatbzis, csupn adattblk halmaza. Ahhoz, hogy
adatbziss vljon, a tblk kztti kapcsolatokat is definilni kell.
Gondoljunk pldul arra, hogy van kt tblnk, az egyikben nevek, a msikban cmek. Mindkettnek
van egy kd nev mezje is. Ez a lers nmagban mg nem egy adatbzist hatroz meg, csupn kt, egymstl
fggetlen adattblt rtunk le. A dolog akkor vlik adatbziss, ha kiktjk a kvetkezt: a neveket s a cmeket
tartalmaz tblban lv kd sszekapcsolja a kt tblt gy, hogy egy, a neveket trol tblban lv nvhez az
azonos kd, a cmeket trol tblban lv cm tartozik. Ezzel definiltuk az adatkapcsolatot.
Az adatbzison teht voltakppen adatoknak kapcsolataikkal egytt val brzolst, trolst
rtjk. [2/13]

Adatbzis-kezel rendszer
Az adatbzis nmagban semmit nem r. A felhasznl szmra akkor vlik rtkk, ha megadunk
hozz egy olyan szoftvert, amellyel az adatbzist kezelni tudja. Az ilyen szoftvert adatbzis-kezel rendszernek
nevezzk. Az adatbzis-kezel rendszereknek kt f funkcija van: az adatdefinci (az adatbzis szerkezetnek
definilsa, a szerkezet feltltse konkrt adatokkal, illetve ezek mdostsa, trlse), valamint a lekrdezs
(adatok visszakeresse, kimutatsok ksztse). [2/21]

Adatmodellek alapelemei
Az egyed
Egyednek hvunk minden olyan dolgot (objektumot), ami minden ms dologtl (objektumtl)
megklnbztethet, s amirl adatokat trolunk. [2/33]
A rekordtpus
Az adatbzis-kezel rendszerekben () az egyedtpust rekordtpusnak hvjuk. Ez a legkisebb
cmezhet egysg (ennl kisebb rszeire nem lehet hivatkozni az adatbzisnak). [2/34]
A tulajdonsg
Az egyedeket tulajdonsgokkal (attribtumokkal) rjuk le. A tulajdonsg az egyed egy jellemzje, ami
megadja, meghatrozza az egyed egy rszlett. [2/35] A tulajdonsg s az attribtum azonos jelents
fogalmak, s a tovbbiakban felvltva hasznljuk ket.
A kulcs

Amennyiben egy tulajdonsg vagy tulajdonsgok egy csoportja egyrtelmen meghatrozza, hogy egy
egyed melyik rtkrl, elfordulsrl van sz (vagyis az egyedhalmaz melyik elemrl), akkor ezeket
a tulajdonsgokat egytt kulcsnak nevezzk [2/36]
A kapcsolat
Kapcsolatnak nevezzk az egyedek kztti viszonyt. [2/38] A kapcsolat fajti:
Egy-egy tpus kapcsolat (1:1 kapcsolat): olyan kapcsolat, ahol az egyik egyedhalmaz mindegyik
elemhez a msik egyedhalmaznak pontosan egy eleme kapcsoldik (teht a kt egyedhalmaz
egymsba klcsnsen egyrtelmen kpezhet le). [2/40]
Egy-tbb tpus kapcsolat (1:N kapcsolat): Azt mondjuk, hogy az A egyed s a B egyed kztt egytbb (1:N) kapcsolat van, ha az A egyedhalmaz mindegyik elemhez a B egyedhalmaz tbb eleme is
tartozhat. [2/40]
Tbb-tbb tpus kapcsolat (N:M kapcsolat): Tbb-tbb (jelben N:M) tpus kapcsolatnak
nevezzk az A egyed s a B egyed kztti kapcsolatot, ha az A egyedhalmaz minden elemhez a B
egyedhalmaz tbb eleme tartozhat, s fordtva egy B-beli elemhez is tbb A-beli elemet rendelhetnk
hozz.[2/41]

Adatmodell
Ezek utn mr definilhatjuk, mi is az adatmodell: Az adatmodell egyedek, tulajdonsgok s
kapcsolatok halmaza, amely absztrakt mdon tkrzi a vals objektumoknak, azok jellemzinek
(tulajdonsgainak) s viszonyainak (kapcsolatainak) elvont kategriit. [2/48]

A normlformk
Az adatbzisok bels szerkezett n. normlformk jellemzik. Ha egy adatbzis eleget tesz bizonyos
feltteleknek, akkor azt mondjuk, hogy egy adott normlformban van.
Els normlforma (1NF)
Egy R relcirl azt mondjuk, hogy els normlformban van, ha minden sorban pontosan egy
attribtumrtk ll. [2/87]
Ez els hallsra lehet, hogy bonyolultnak hangzik, annl is inkbb, hogy az adatbzis-kezelk csak
olyan adatbzist fogadnak el, amely 1NF-ben van.
Egy pldval lehet a legjobban rzkeltetni, mit is jelent ez valjban:
NV
Nagy Gza
Kiss Jnos
Br dn

SZAKKPZETTSG
gpszmrnk, kzgazdsz, mszersz
lakatos
fodrsz, lakatos

A fenti tblzat nincs 1NF-ben, mert a SZAKKPZETTSG mezben nhol tbb rtk is szerepelhet.
Ezt gy is lehetne brzolni, hogy minden egyes szakkpzettsget kln sorba tesznk:
NV
Nagy Gza

Kiss Jnos
Br dn

SZAKKPZETTSG
gpszmrnk
kzgazdsz
mszersz
lakatos
fodrsz
lakatos

Amennyiben ezt els normlformra szeretnnk hozni, a legegyszerbb, ha a tbb attribtumrtket


tartalmaz sort annyi sorra bontjuk, amennyi az attribtumrtkek szma:
NV
Nagy Gza
Nagy Gza
Nagy Gza
Kiss Jnos
Br dn
Br dn

SZAKKPZETTSG
gpszmrnk
kzgazdsz
mszersz
lakatos
fodrsz
lakatos

gy a tblzat mr 1NF-ben van.


Msodik normlforma (2NF)

Egy relci akkor van msodik normlformban, ha els normlformban van, s minden nem-kulcs
tulajdonsga teljesen fgg a kulcstl. [2/93]
Nzzk pl. a kvetkez, az elznl kiss bonyolultabb, 1NF-ben lv tblt, ahol szmlk adatait
troljuk. A SZSZ a szmlaszm, a TKOD a ttelkd, a TNV a ttelnv, az ER az egysgr rvidtse.
ELADS
SZSZ
234
234
235
235

DTUM
2000.02.11.
2000.02.11.
2000.02.20.
2000.02.20.

VEV
XYZ Kft
XYZ Kft
UVT Kft
UVT Kft

VEVCM
Bp. Nagy t 10.
Bp. Nagy t 10.
zd, Hd t 3.
zd, Hd t 3.

TKOD
142
264
245
142

TNV
Kifli
Tej
Kaka
Kifli

DB
5
3
6
4

ER
20
40
10
20

R
100
120
60
80

A kulcsot a szmlaszm (SZSZ) s a ttelkd (TKOD) alkotjk, hiszen ketten egytt egyrtelmen
meghatroznak egy rekordot (ezeket dlt betvel jelljk). A tblzat nincs 2NF-ben, mert vannak
benne olyan msodlagos attribtumok, amelyek nem az egsz kulcstl, csak az azt alkot egyes
attribtumoktl fggnek.
A DTUM fgg az SZSZ-tl, mert egy szmlhoz egyazon dtum tartozik. Ez igaz a VEV-re, s a
VEVCM-re is. Hasonlkppen belthat, hogy a TKOD is rendelkezik azzal a tulajdonsggal, hogy
tbb msodlagos attribtumot egyedl is meghatroz (TNV, ER).
A 2NF-re hozs egyszer mvelet: a relcit tbb, 2NF-ben lv tblzatra bontjuk. A mi esetnkben ez
kt tblt (ELADS1 s TTELEK) fog eredmnyezni, s azoknak a kulcsai az ELADS tblnk
kulcsnak kt attribtuma lesz:
ELADS1
SZSZ
234
234
235
235

DTUM
2000.02.11.
2000.02.11.
2000.02.20.
2000.02.20.

VEV
XYZ Kft
XYZ Kft
UVT Kft
UVT Kft

VEVCM
Bp. Nagy t 10.
Bp. Nagy t 10.
zd, Hd t 3.
zd, Hd t 3.

TKOD
142
264
245
142

DB
5
3
6
4

R
100
120
60
80

TTELEK
TKOD
142
264
245

TNV
Kifli
Tej
Kaka

ER
20
40
10

A kt tbla kztti kapcsolatot a TKOD valstja meg. Ezzel a relcit msodik normlformra hoztuk.
Harmadik normlforma (3NF)
Egy relci harmadik normlformban van, ha msodik normlformban van s egyetlen msodlagos
attribtuma sem fgg tranzitvan a kulcstl. [2/100]
Egy C tulajdonsg akkor fgg tranzitvan az A kulcstl, ha meghatrozza a kulcstl szintn fgg B
tulajdonsg is. [3/224]
Vegyk alapul az elbbi ELADS1, 2NF-ben lv tblt. A SZSZ meghatrozza a VEV attribtumot,
az pedig meghatrozza a VEVCM-et. Ez azt jelenti, hogy a VEVCM tranzitvan fgg a SZSZ
kulcstl, mivel azt meghatrozza a nem kulcs VEV tulajdonsg is. A tbla teht nincs 3NF-ben.
Ahhoz, hogy 3NF-ben legyen, ugyanazt a mveletet kell elvgezni, mit az imnt: fl kell bontanunk a
tblt. Itt azonban fel kell ismerni egy msodlagos kulcsot is: VEV. Ez lesz a kt j tbla kztti
kapcsolat.
ELADS2
SZSZ
234
234
235
235

VEVK

VEV
XYZ Kft
UVT Kft

DTUM
2000.02.11.
2000.02.11.
2000.02.20.
2000.02.20.

VEV
XYZ Kft
XYZ Kft
UVT Kft
UVT Kft

TKOD
142
264
245
142

DB
5
3
6
4

R
100
120
60
80

VEVCM
Bp. Nagy t 10.
zd, Hd t 3.

gy kikszbltk a tranzitv fggssget, a relci 3NF-ben van. Termszetesen a modellhez tartozik


mg a TTELEK tbla is, de azt az elz pldhoz kpest vltozatlanul hagyjuk, hiszen az megfelel a
3NF feltteleinek is.
Magasabb normlformk
A harmadik normlforma a minimum, amit egy adatbzis tervezsnl be kell tartani. Ne gondoljuk
teht, hogy ez a normalizls cscsa. Lteznek magasabb szint normlformk is (BCNF, 4. s 5. NF),
ezek trgyalsa azonban kimerten ezen dolgozat kereteit, ezrt nem foglalkozunk velk.

A lookup
Ezzel a szval sokat fogunk mg tallkozni a dolgozat folyamn. Angolul keresst, utnanzst jelent.
Az adatbzis-kezelkben a tblk kztti kapcsolat megvalstsra hasznljk. Segtsgvel az imnti
pldinkban szerepl ELADS1 s TTELEK tblt sszekapcsolhatjuk gy, hogy a megjelentett
vgeredmny egy ELADS-hoz hasonl tblzat lesz, ahol a TNV s az ER n. lookup mezk,
amelyek valjban nincsenek a tblzatban, csupn az adatbzis-kezel helyezi oda ket, az ltalunk
definilt kapcsolat alapjn. Ez a kapcsolat a kvetkezkppen nz ki: ELADS1.TKOD <==>
TTELEK.TKD. gy a program a TKD alapjn a TTELEK tblbl gyakorlatilag behzza az
adatokat az ELADS1 tblba.
Ezzel azonban korntsem merlnek ki a lookup ltal nyjtott lehetsgek. Tblzatunkban ugyanis nem
muszj megjelenteni a TKD mezt, gy a felhasznl azt ltja, hogy ha felvesz egy j szmlt, a
VEV meznek ad rtket, holott valjban a TKD-ot manipullja. Ezt azonban a rendszer gyesen
elrejti elle.
Hasonlkppen llthatunk lookup kapcsolatot az ELADS2 s a VEVK tblzatok kztt is, a VEV
mez alapjn.
gy az ELADS2, a VEVK s a TTELEK (3NF-ben lv) tblk hasznlatval megjelenthetjk gy
az adatbzist, hogy az ELADS (csupn 1NF-ben lv) tblt lssuk. gy nem vesztjk el a
normalizls ltal biztostott elnyket, a felhasznl viszont egy helyen lt mindent, gy neki nem kell
tudnia, mi is az a normalizls.

Trzsadattbla
A normalizls folyamn keletkeznek olyan tblk, amelyek a tbbihez kpest viszonylag llandnak
mondhatk (pldnkban ilyen a TTELEK, ill. a VEVK tbla). Ezeket a tblk mindig valamilyen fbb tblval
vannak kapcsolatban (itt: ELADS1, ill. ELADS2). Az ilyen tblkat trzsadattblknak nevezzk. A
trzsadattblk (rtelemszeren) trzsadatokat tartalmaznak. A trzsadatok manipulcijt ltalban a program
karbantart egysgben vagy automatikusan szoktk megoldani.

SQL
Az SQL (Structured Query Language = Strukturlt lekrdez nyelv) egy szabvnyostott (ISO 9075)
adatbzis-kezel nyelv. Alapveten kt rsze van: adatdefincis nyelv (DDL, Data Definition Language) s
adatmanipull nyelv (DML, Data Manipulation Language). A DDL segtsgvel tblkat hozhatunk ltre,
trlhetnk, stb., mg a DML-lel beszrhatunk, szerkeszthetnk, trlhetnk, illetve lekrdezhetnk adatokat egy
vagy tbb tblbl.
A Delphi termszetesen tmogatja az SQL-t. Komponensein keresztl knnyen pthetnk be
alkalmazsunkba SQL-utastsokat. Mivel ebben a munkban a Paradox rendszerekrl van elssorban sz, az
SQL-t bvebben nem trgyaljuk.

Adatbzis-tervezs
Az elz rszben megtudhattuk, hogyan kell az adatbzist egyszersteni, normalizlni. A szably teht
az, hogy gy kell megtervezni az adatbzist, hogy az legalbb a harmadik normlforma kvetelmnyeinek eleget
tegyen. A gyakorlatban azonban ez nem mindig mkdik.
Az ltalam ksztett ttermi alkalmazsban tallhat pldul olyan eset, amikor a rendels fejlct s a
trzst tartalmaz tblkban egyarnt szerepel az asztal kdja, holott elg lenne csupn a fejlcben trolni, hiszen
egy rendels tteleihez csupn egy asztalkd tartozhat. Azrt volt szksg ennek ellenre erre a megoldsra, mert
a szmlzsnl asztalok szerint kell szrni (mindig csak egy asztalhoz tartoz rendelseket kell megjelenteni), s
jelentsen felgyorstotta a mkdst az eredeti tervben nem szerepl asztalkd mez a rendelsek trzst trol
tblban. A msik eset, amikor hasonl problmval tallkoztam, a szmlk rsz- s vgsszegnek trolsa volt.
Knytelen voltam ugyanis eltrolni a brutt rt is a szmla tteleinek, illetve a szmla brutt vgsszegt, pedig
ezeket egyrtelmen meg lehet hatrozni, mivel az adatbzis tartalmazza a ttelek nett rait s FA-kulcsait, de
kiszmtsuk jelentsen lasstotta volna a mkdst. Mondhatnnk azt is, hogy a nett rat sem kellene trolni,
hiszen azt is egyrtelmen meghatrozhatjuk, de gondolni kellett arra, mi trtnik, ha valaminek megvltozik az
ra. Ekkor ugyanis az eredeti modell szerint (amelyben mg nem troltam a szmlk sszegeit) a rgebben
7

kiadott szmlk sszege is megvltozott, gy hamis adatokat kaptunk. A vgleges megoldssal mr nem
jelentkezhet ez a problma, hiszen a szmla a kiadsnak idpontjban aktulis rakat tartalmazza.
Egy sz, mint szz, nem lehet agyon optimalizlni az adatbzist. Megfogalmazhatjuk teht az adatbzistervezs egyik legfontosabb titkt (amelyben Halassy Bla knyve is megerstett): Sohasem szabad az
adatszerkezetet egyszersteni a programbonyolultsg rovsra. [3/207]
Azt termszetesen mondani sem kell, hogy az adatbzis-tervezs kt fontos szablya: mindennek benne
kell lennie, amire szksg van, s semminek nem szabad benne lennie, amire nincs szksg. Hogy ismt Halassy
Bla szavait idzzem: Az a j adatfle, ami nincs. [3/155]. Mert ami nincs, azzal nem kell foglalkozni, nem
foglal helyet, nem vesz ignybe processzoridt, s nem kell fradozni vele. Teht flsleges adatokat
semmikppen ne troljunk. Ami viszont kell, az kell. Ezek a kijelentsek lehet, hogy trivilisnak hangzanak, de
fontosnak tartom leszgezni ket, mert sokszor nem tartjuk be ezeket, s ksn brednk r, hogy hibztunk.
Az adatbzis-tervezs bonyolult dolog. Rengeteget lehet hibzni, de a leggyakoribb hiba, ha nem
ismerjk elgg a mkdsi mechanizmusokat, azaz nem tudjuk, mire lesz szksg. Ezrt nagyon fontos, hogy
eltte tjkozdjunk, s a feladatot nagyon pontosan hatrozzuk meg. Ha megkrnek, hogy ksztsnk egy
bizonyos alkalmazst, ne elgedjnk meg ennyivel, krdezzk meg, hogyan kell mkdnie. Ezzel rengeteg
veszdsget megsprolhatunk. Elmondhat teht az is, hogy az adatbzis-tervezs (de igaz ez a
programtervezsre is) msik legfontosabb szablya a minl pontosabb feladat-meghatrozs.

II.

A Delphi adatbzis-kezel rendszere

Eddig az adatbzisokrl ltalnossgban beszltnk. Most ttrnk igazi tmnkra, a Delphi-s


rendszerek fejlesztsre. Ehhez ismernnk kell a Delphi adatbzis-kezel rendszernek mkdsi alapjait.

Alapok, BDE
A BDE a Borland Database Engine rvidtse, amely egy Windows alap 32 bites adatbzis-motor.
Feladata, hogy kapcsolatot teremtsen a fizikai adatbzis s az azt kezel alkalmazsok kztt, s ezzel
megknnytse a Borland fejlesztrendszereit hasznl programozk munkjt. Leveszi vllunkrl a
tblaformtumok kezelst, s alapvet adatbzis-kezel rutinokat tartalmaz. A BDE a kvetkez adatbzisokat
tmogatja: dBASE, Paradox, Text, FoxPro, Access, InterBase, Oracle, Sybase, Microsoft SQL, ODBC
(Microsoft Open Database Connectivity). A programoz ezek kzl szabadon vlaszthat, anlkl, hogy
mdostan programjt. Minden formtumnak sajt, fggetlen meghajtja (drivere) van. Ezeken kvl azonban
vannak megosztott szolgltatsok is, amelyeket minden driver hasznlhat. Ilyen pl. a Buffer Manager (buffer
kezel), a Sort Engine (rendez motor), stb.
A Delphi adatbzis-kezelse teljes mrtkben a BDE motorra pl, a Delphi minden DB komponense
ezt hasznlja az adatok kzvetlen vagy kzvetett elrshez. A komponensek a BDE API (Application Program
Interface) fggvnyeken keresztl mkdtetik a Database Engine-t. A BDE fggvnyei objektum-orientltan
plnek fel, gy azok elrse egyszer s strukturlt.
A Database Engine fbb rszei a kvetkezk:
- BDE mag (BDE core): a rendszer magjt kpez .DLL fjlok tartoznak ide.
- BDE API fggvnyek: alapvet adatbzis-mveleteket tartalmaz fggvnytr, mely tartalmaz adatbzis
kezelsre, konfigurlsra, hibakezelsre, lekrdezsre, tranzakcikra hasznlhat fggvnyeket.
- Adatbzis meghajtk (Database Drivers): ide tartozik az t standard meghajt (Paradox, dBASE, FoxPro,
Access, s Text).
- Opcionlis meghajtk (Optional Drivers): egyb meghajtkat tartalmaz (InterBase, DB2, Informix, Oracle,
Sybase, Microsoft SQL Server).
- Query motorok (Query Engines): az SQL (Structured Query Language Strukturlt lekrdez nyelv)
motorok.
- BDE Administrator: a BDE belltsait vgz program (BDEADMIN.EXE).
- Database Desktop: adatbzis fjlok kezelst vgz segdprogram, mellyel egyszeren hozhatunk ltre,
tlthetnk ki, vagy mdosthatunk klnfle formtum tblkat. Ezen kvl SQL lekrdezseket is
kszthetnk segtsgvel.
A BDE fontos szolgltatsa mg az n. alias-ok kezelse. Az alias-ok segtsgvel elnevezhetjk
adatbzisunkat, hogy ksbb ezen a nven hivatkozzunk r, annak fizikai helytl fggetlenl. Standard
adatbzisoknl az alias gyakorlatilag egy egyszer mutat, ami egy adott knyvtrra mutat. SQL adatbzisoknl
viszont mr egyb informcikat is tartalmaz (felhasznlnv, jelsz, stb.).
A BDE-nek rengeteg belltsi lehetsge van, s ltalban az alaprtelmezett belltsok nem felelnek
meg az ignyeinknek. Teleptskor ezrt mindig clszer vgignzni ezeket a belltsokat. Ezt a BDE
Administrator (DBEADMIN.EXE) programmal tehetjk meg. A belltsok kzl megemltnk nhny
8

fontosabbat. Ilyen pl. a Langdriver, amivel a nyelvet llthatjuk be. Ilyet minden egyes driver belltsai kztt
tallunk, mivel a driverekhez egyenknt adhatjuk meg, milyen nyelvvel dolgozzanak. Ez a vltoz
alaprtelmezetten 'ascii' ANSI rtkre van lltva. Ha magyar, kezetes szvegeket is trolunk az
adatbzisunkban, clszer ezt HUN 852 DC rtkre lltani. Mivel mi elssorban a paradox rendszerekkel
foglalkozunk, ezrt a Paradox driver belltsait nzzk meg. Itt a Langdriver vltoznak a Paradox HUN 852
DC rtket kell adni.
Ha hlzaton keresztl hasznlunk paradox tblkat, kt dologra kell odafigyelnnk. Az egyik a Net
Dir. Ez a paradox hlzati kontroll fjl (PDOXUSRS.NET) helyt hatrozza meg. Ez a fjl hangolja ssze a
tblkat hlzaton keresztl elr programokat. Fontos, hogy ha tbb szmtgprl hasznlunk hlzaton
keresztl egy adatbzist, ezt a vltozt minden szmtgpen be kell lltani gy, hogy az ugyanoda mutasson.
Clszer az adatbzist trol szmtgp egyik knyvtrt megadni. Csak akkor tudjuk egyszerre tbb
szmtgprl hasznlni az adatbzisunkat, ha ezt a vltozt helyesen lltjuk be. A vltoznak mindig
valamelyik meghajt, vagy megosztott knyvtr gykerre kell mutatnia.
Msik fontos bellts hlzati hasznlat esetn a Local Share. Ezt a System/INIT belltsok kztt
talljuk. Ha egyszerre tbb programbl szeretnnk elrni egy adatbzist, ezt igazra (TRUE) kell lltani. Ha ezt
nem tesszk meg, az adatbzist a hlzaton keresztl elr programok nem tudjk frissteni az adatbzis
pillanatnyi vltozsait.

Alias ltrehozsa, szerkesztse


Ha ltrehozunk egy adatbzist, els dolgunk, hogy ltrehozunk szmra egy alias-t. Ezt tbbflekppen
is megtehetjk: hasznlhatjuk erre a BDE Administrator-t, a Database Desktop-ot, s az SQL Explorer-t is. n az
elst ajnlom, mert kezelse egyszerbb: az Object/New menpontot kivlasztva meg kell adni az adatbzis
tpust (mi Standard adatbzisokkal foglalkozunk), majd be kell rni az alias nevt, s ki kell tlteni a jobb
oldalon a Path mezt. Ezzel ksz is az alias. Ha az SQL Explorer-t hasznljuk, az eljrs ugyanez. A Database
Desktop esetben mr msknt kell eljrni: Tools/Alias Manager menpont, az ablakon New gomb, megadjuk a
nevet s utat, majd a Keep New gombra kattintva elmentjk.
Ha ezek utn ezzel az alias-szal szeretnnk dolgozni, egy valamit mg rdemes megtenni: belltani a
Database Desktop munkaknyvtrnak ezt az alias-t (File/Working Directory). Ez azrt clszer, mert a
Database Desktop mindig a munkaknyvtrt nyitja meg, ha a megnyit vagy a ment ablakot hasznljuk.

Tbla ltrehozsa, szerkesztse


Ezeket a mveleteket a Database Desktop-pal tudjuk elvgezni. Kattintsunk a File/New/Table
menpontra. Vlasszuk ki a tbla tpust. Mivel ebben a munkban Paradox rendszerekkel foglalkozunk,
vlasszuk a Paradox 7-et. A tblzat kitltse nem bonyolult, viszont jobb oldalon tallunk nhny opcit (a
lenyl listbl vlaszthatjuk ki ket).
A Validity Checks segtsgvel a kijellt mez rtkre vonatkoz belltsokat tehetjk meg. Ezek
rtelemszeren kitltendk. Figyeljnk arra, hogy melyik mezkre hasznljuk, illetve nem hasznljuk a Required
Field opcit. Ha ez be van kapcsolva, a tblzatba nem lehet elmenteni rekordokat gy, hogy ez a mez nincs
kitltve. Ez akkor hasznos, ha a mezre mindenkpp szksg van. Ha ugyanis elfelejtjk a programban kitlteni,
azonnal hibazenetet kapunk. Az esetleges lefagysok miatti resen val elmentst is megakadlyozhatjuk ennek
segtsgvel.
A Secondary Indexes segtsgvel manipullhatjuk a msodlagos indexeket. J tudni, hogy akkor
mkdik rendesen egy index, ha tulajdonsgaiban be van jellve a Maintained jellngyzet. Ezt viszont csak
akkor tudjuk bejellni, ha van legalbb egy elsdleges indexnk (a mez-tblzatban a Key oszlopban csillag
lthat). A Maintained opci egybknt arra vonatkozik, hogy a BDE automatikusan frisstse-e a msodlagos
indexeket. Ha ez nincs bejellve, manulisan kell megoldanunk az jraindexelst.
Ha valamilyen adatbzis-rendszert ksztnk, elfordulhat, hogy gyelnnk kell a biztonsgra. Ezrt
ajnlatos az adatbzis tblit jelszval vdeni. Egy adatbzison bell clszer ugyanazt a jelszt hasznlni. Ezt a
jelszt nem szksges a felhasznlknak tudni, mivel bepthetjk a programunkba. gy csak azok a programok
tudnak hozzfrni az adatbzishoz, amelyek ismerik ezt a jelszt. Az egyb biztonsgi intzkedseket
(felhasznlk kezelse, azok eltr jogai, stb.) mr a programunkon bell intzhetjk. A Paradox tblk
lehetsget nyjtanak arra is, hogy tbb jelszt adjunk meg, s azokhoz klnbz jogokat rendeljnk (Auxilary
Password). Ezt akkor rdemes csak hasznlni, ha tbb program is hozzfrhet egy adatbzishoz, de mindegyikk
ms-ms jogosultsgokkal. Ezt a problmt gy a legegyszerbb lekezelni.
Mint azt az imnt emltettem, fontos az is, hogy milyen nyelv a tbla. Ezt tblnknt megadhatjuk
(Table Language). A Database Desktop elszr mindig az alaprtelmezett nyelvet lltja be a tblnak (ezt a
BDE Administrator-ban definilhatjuk, lsd fntebb), de meg is vltoztathatjuk kedvnk szerint.
Ha mr mindent belltottunk, a Save As gombbal menthetjk a tblt.

SQL lekrdezs ksztse


SQL lekrdezst a legegyszerbben a Database Desktop-pal kszthetnk (File/New/SQL file). Ezt
szerkeszthetjk, menthetjk, futtathatjuk. Ha egy Delphi programba szeretnnk SQL-t pteni, a lekrdezst
mindig clszer itt megrni s kiprblni (az SQL-rl bvebben: Program files\Common files\Borland
Shared\BDE\localsql.hlp).

Komponensek
A Delphi-ben az adatbzis-kezelst komponenseken keresztl valsthatjuk meg. A komponenseket
mozaikknt egymshoz illesztve alaktjuk ki a programunk szerkezett. A komponensek biztostjk a
programoz s a BDE kztti kapcsolatot. Alapvet mveleteket tartalmaznak, melyek felhasznlsval knnyen
valsthatjuk meg elkpzelseinket. Komponensek nlkl szinte elkpzelhetetlen a munka, hasznlatukkal nem
kell trdnnk a kezelt adatbzis tpusval, formtumval, lnyegesen emberkzelibb programozst biztostanak.

III.

A Delphi adatbzis-kezel komponensei

A Delphi adatbzis-kezel komponensei kzl azokat a standard komponenseket vesszk sorra,


amelyek a native tblk kezelshez szksgesek. Ezeket a standard komponenseket kt rszre osztva talljuk
meg a Delphi eszkztrn: Data Access (adathozzfrs), s Data Controls (adatkontroll, adatvezrls). A
komponensek lersban nem a teljessgre trekszem, hanem a lnyegesebb dolgok kiemelsre. Bvebbeket
ezekrl a Delphi Help-ben olvashatunk.

TDataSet, mindennek az alapja


A TDataSet osztly minden olyan komponens alap osztlya, amely sorokban s oszlopokban megjelen
adatot reprezentl. Ez az osztly tartalmazza az alapvet tblamanipulcis metdusokat, tulajdonsgokat, stb.
Munknk sorn sokszor fogunk ezzel az osztllyal tallkozni.

Data Access komponensek


Ide azok a komponensek tartoznak, amelyek segtsgvel megvalstjuk az adathozzfrst, az adatbzis
fjljaival val kapcsolatot, ezek a komponensek kapcsoljk ssze az adatokat az adatmegjelent, manipull
objektumokkal.

TDataSource
Ez a komponens teremt kapcsolatot az n. DataSet komponensek s a vizulis adatmegjelent
(manipull) komponensek kztt. A DataSet komponensek azok a komponensek, amelyek valamilyen
adathalmazt biztostanak (TTable, TQurey). A komponens Dataset tulajdonsgt kell a megfelel komponensre
(Table-re vagy Query-re) lltani.

TTable
A TTable segtsgvel bepthetnk egy tblt a programba. A komponens a BDE-t hasznlva
hozzfrst biztost egy adatbzis-tblhoz. Ennek segtsgvel kezelhetek az adatok (navigci, hozzfzs,
mdosts, trls, stb.).
Ha felhelyeznk egy ilyen komponenset a form-ra, az els dolog, amit tennnk kell, a tblzat
fjlnevnek megadsa. Ehhez elszr a DatabaseName-et kell megadnunk, amennyiben ltrehoztunk az
adatbzisunk rszre alias-t. Ezt a TableName tulajdonsg belltsa kveti. A lenyl listban megtallhatjuk az
adatbzisunk fjljait, vagy ha nem hasznlunk alias-t, a program knyvtrban lv fjlokat.
Az IndexName belltsval megadhatjuk az index nevt, de hasznlhatjuk erre a clra az IndexDefs
vagy az IndexFieldNames tulajdonsgokat is (bvebbekrt ld. a sgt). Az indexeket termszetesen futsidben
is vltoztathatjuk, kivve ha a CachedUpdates be van kapcsolva.
A CachedUpdates mdot akkor hasznljuk, ha gyorsabb adathozzfrst szeretnnk megvalstani,
illetve minimalizlni szeretnnk a hlzati forgalmat. Ha ez be van kapcsolva, a BDE a memriban trolja az
adatokat, s azokat nem menti lemezre, egszen addig, amg meg nem hvjuk az ApplyUpdates metdust. Teht
ha ezt nem tesszk meg, a mdostsok elvesznek. A CachedUpdates md akkor is hasznos lehet, ha olyan
alkalmazst ksztnk, amiben fontos, hogy akr nagy mennyisg adatmdosts is visszavonhat legyen, ez a
10

legegyszerbb mdja: ha vissza szeretnnk vonni a vltozsokat, csupn a CancelUpdates metdust kell
meghvnunk.
A tulajdonsgok kztt tallunk egy Active nevt. Ezzel mr akr szerkeszt mdban is bekapcsolhatjuk
a tblt, de hasznlhatjuk futsidben az Open ill. a Close helyett is. Clszer azonban szerkeszt mdban nem
bekapcsolni, mert bizonyos esetekben megneheztheti a munknkat, hiszen ilyenkor lefoglalja az adatbzist, gy
ms program (pl. Database Desktop) nem biztos, hogy hozz tud frni.
A TTable esemnyei kztt megtalljuk a navigci s az adathozzfrs sszes esemnyt, ezen kvl
pedig hibakezelst is vgezhetnk velk. rdemes ket vgignzni.
Segtsgkkel pldul egyszeren megoldhatjuk a trlsre val rkrdezst, illetve a trls
megakadlyozst bizonyos esetekben, stb.
A TTable metdusai (az egyszerbbek) mr csekly angoltudssal rendelkezk szmra is egyszeren
megjegyezhetk: trlni a Delete-tel, hozzfzni az Append-del kell, stb. (bvebbeket ld. Delphi Help: TTable).
Fontos lehet, hogy a Table mezit magunk is megadhatjuk. Ha akarjuk, nem kerl bele minden mez a
fizikai fjlbl, de mi is adhatunk hozz mezket. Ezt a komponensre val dupla kattintssal tehetjk meg a
legegyszerbben. A megjelen ablak mveleteit a jobb gombbal val kattintssal rhetjk el. Az Add all fields
minden mezt behelyez, ami a fjlban tallhat. j mez ltrehozsa esetn (New field) meg kell adnunk, hogy
az adatmez (Data field), szmolt mez (Calculated field), vagy Lookup (keres) mez legyen. Szmtott
meznl a tbla OnCalcFields esemnybe rhatjuk be a vgzend szmtsokat (figyeljnk arra, hogy be legyen
kapcsolva az AutoCalcFields, mely biztostja, hogy a szmolt mezket automatikusan szmoljuk). A Lookup
mez arra szolgl, hogy ms tblbl (DataSet) keressnk ki egy rekord egy mezjt (Result field), amelynek
valamely mezje (Lookup Keys) megegyezik a jelen tbla egy mezjnek aktulis rtkvel (Key field). Ennek
megrtshez itt egy egyszer plda:
Van kt tblnk:
Nevek (szemelykod, nev)
Lakas (szkod, lakhely)
A Table1-ben szeretnnk ltni a neveket s a hozz tartoz lakhelyet is.
A Table1 forrsa legyen a Nevek. A Table2 a Lakas tblt biztostja.
A hozzjuk tartoz DataSet-ek rtelemszeren DataSet1, DataSet2.
Adjuk hozz a Table1 mezihez mindet (Add all fields). Majd hozzunk ltre egy j mezt. Vlasszuk a
Lookup field rdigombot, majd tltsk ki a Lookup definition-t: Key Fields=szemelykod,
DataSet=DataSet2, Lookup Keys=szkod, Result Field=lakhely.
Az eredmny magrt beszl.
Ha a tbla mezit hozzadtuk a mezlisthoz, azokat kivlasztva szerkeszthetjk ket az Object
Inspector segtsgvel. A rengeteg lehetsg kzl egy hasznos dolgot emelnk ki, ez pedig a DisplayName,
melyben azt a szveget adhatjuk meg, amivel meg szeretnnk jelenteni a rekordot. Ez azrt hasznos, mert
mezneveknek ltalban rvidtseket hasznlunk, de ezeket a felhasznlnak nem kell tudnia. Ha ezt a
tulajdonsgot belltjuk, ezen tl az adatokat megjelent komponensek ezt a nevet fogjk kirni.
A tblban tallhat adatokat a Filter tulajdonsg segtsgvel szrhetjk is (amennyiben a Filtered
tulajdonsg true). Ennek megvan a megfelel szintaktikja, amelyet a Help-ben a TBDEDataSet.Filter tmakr
alatt talljuk meg. Szrs esetn a tblzatban csak a szrfelttelnek eleget tev rekordok jelennek meg.

TQuery
Ez a komponens egy olyan DataSet-et pt be a programba, ami SQL kifejezsen alapul. Arra
hasznljuk, hogy SQL lekrdezseket hajtsunk vgre a segtsgvel. Azrt hasznos ez a komponens, mert ezzel
egyszerre tbb tblt is elrhetnk, illetve sszekapcsolhatunk, valamint szmtsokat, rendezseket,
levlogatsokat is nagyon knnyen vgezhetnk vele (az SQL nyelvbl addan).
Itt is tallunk a Table-hz hasonl tulajdonsgokat s esemnyeket. Ebbl is ltszik, hogy csak abban
klnbzik a TTable-tl, hogy az adatforrsa egy SQL lekrdezs. Termszetesen a Query ltal visszaadott
adatokat mdostani nem tudjuk, de magval a Query-vel vgezhetk adatmdost mveletek (Update, Delete,
stb.), mivel ezeket az SQL nyelv lehetv teszi. Ekkor a komponens nem ad vissza tblt. Az SQL lekrdezst a
komponens SQL nev tulajdonsgban adhatjuk meg. Ha lekrdezst runk, s mg nem rezzk magunkat elg
gyakorlottnak, clszer a lekrdezst elszr a Database Desktop-pal elkszteni, lefuttatni, s ha mkdik,
utna tvinni a programunkba, gy ugyanis egyszerbb a hibaellenrzs. Ha pedig valakinek nem tetszik a
Delphi string-szerkeszt ablaka, a Code Editor gomb megnyomsval hasznlhatja a norml kdszerkeszt
ablakot is. Ennek azrt van elnye, mert itt az SQL parancsokat a Delphi felismeri, s kiemeli.
A TTable-hz hasonlan ennl a komponensnl is mkdik a filter.
Metdusai kzl az ExecSQL nevt emltenm meg, mellyel lefuttathatjuk a lekrdezsnket.
Termszetesen a TTable-hz hasonlan itt is mkdik az Open s a Close is.

11

TUpdateSQL
Ha mr a Query-nl tartunk, rdemes megemlteni a TUpdateSQL komponenset, amely kifejezetten
adatmdostsra szolgl. Itt kln trl (DeleteSQL), mdost (ModifySQL) s hozzfz (InsertSQL) SQL-t
adhatunk meg. Ezeket is az ExecSQL metdussal tudjuk futtatni, csak itt meg kell adnunk, hogy milyen mdban
indtjuk el (trl, mdost, beszr).

TBatchMove
Elfordulhat, hogy szksgnk van arra, hogy egy tblbl bizonyos adatokat egy msik tblba
msoljunk. Erre kitn eszkz ez a komponens. Fontos, hogy forrsnak (Source) s clnak (Destination) TTable
tpust kell megadni, teht az adott tblnak lteznie kell a programban.
Minden ilyen esetben ajnlatos ezt a komponenset hasznlni, mivel ezzel lehet a leggyorsabban
adatokat mozgatni. Mg ha SQL-ben egyszerbbnek is tnik egy ilyen mvelet (mondjuk egy Insert vagy
Update), a gyakorlat azt mutatja, egy query lefuttatsa nagysgrendekkel tbb idt vesz ignybe ami kevs
adatnl mg nem rzkelhet, de minl tbb adat van, annl lassabb lehet egy ilyen lekrdezs. Ezzel a
komponenssel radsul nem csak msolni, hanem trlni is lehet (a cltblbl trli azokat az adatokat, amelyek
megvannak a forrsban is).

Data Controls komponensek


Ide az adatokat megjelent, kontroll vizulis komponensek tartoznak.

TDBGrid
Egyszer tblamegjelent komponens. Egy TTable (vagy TQuery)objektum tartalmt jelenti meg,
standard formban (a tblzat oszlopai a mezk, sorai a rekordok). A tbla tartalmt szerkeszteni is tudjuk a
segtsgvel (amennyiben a ReadOnly tulajdonsga false). A szerkeszts a standard tblzatkezel
programokhoz hasonlan trtnik (rdemes vele ksrletezni). Szerkesztsre val hasznlatt azonban csak
mdjval javaslom, mert amilyen kevs dolga van vele a programoznak, annl tbb bosszsgot okozhat ez a
komponens. Ennek tbb oka is van. Egyrszt a felhasznlk szmra bizonyos esetekben bonyolultnak tnhet ez
az adatszerkesztsi md, msrszt a szerkesztst teljes egszben a komponens oldja meg, azaz neknk nehezebb
dolgunk van, ha egynileg szeretnnk megvalstani ezeket. Hasznlata ezrt csak egyszerbb tblzatok
szerkesztsre ajnlott. Kitn viszont arra, hogy sszestett adatokat, lekrdezseket (SQL), valamint listkat
jelentsnk meg vele. Ha szerkeszteni szeretnnk a tartalmt, clszer erre a clra kln ablakot (adatlapot)
gyrtani, ami megknnyti a szerkesztst (lsd: V. fejezet).
A komponens Options tulajdonsgt kinyitva rengeteg belltsi lehetsget tallunk. Ezek kzl
nhnyat emelnk csak ki. A dgEditing tulajdonsgot false-ra lltva kikapcsolhatjuk a szerkeszt mdot, gy az
adatokat nem lehet mdostani. A dgRowSelect bekapcsolsval egyrszt automatikusan kikapcsoljuk a
szerkesztst, msrszt engedlyezzk, hogy a tblzatnak mindig egy teljes sora legyen kijellve. Ezzel azonban
csnjn kell bnni, mert ha nem fr ki egyszerre a tblzat sszes oszlopa, s tovbb lapozunk a grdtsvon,
hogy lthatv tegyk a tbbi oszlopot is, majd valamelyik sorra kattintunk, a tblzat automatikusan visszall
gy, hogy az els oszlop lesz lthat. Ez a jelensg csak a dgRowSelect bekapcsolt llapotnl jelentkezik, s
sokszor kellemetlensgeket okoz. Figyeljnk arra is, hogy amennyiben a dbRowSelect be van kapcsolva, a
dbEditing-et nem tudjuk true-ra lltani. A dgIndicator a tblzat bal oldaln lv indiktor-oszlopot kapcsolja
be, illetve ki. Ez az indiktor sokszor hasznos, mert ltjuk az aktulis rekordot, s annak llapott (szerkesztett,
beszrt, stb.).
Sokszor lehet arra szksg, hogy a tblzatbl csak meghatrozott mezket jelentsnk meg, illetve
hogy csak meghatrozottakat tudjunk szerkeszteni. Erre szolgl a DBGrid oszlopszerkesztje (Column Editor),
amit a Columns tulajdonsg gombjra kattintva rhetnk el (ezen kvl megnyithatjuk ezt az ablakot a
komponensre val dupla kattintssal, illetve a helyi menjbl is). Alaprtelmezsben ez az ablak res, teht a
tblzat minden mezt megjelent, amit a hozz tartoz Table tartalmaz. A helyi menbl (jobb gomb), illetve az
ablak eszkztrbl is elrhet Add All Fields paranccsal azonban hozzadhatjuk az sszes mezt, hogy aztn
sajt kedvnk szerint szerkeszthessk azokat. Az ablak egy sorra kattintva az Object Inspector-ban
megjelennek annak tulajdonsgai, amelyek segtsgvel minden lnyegi jellemzt bellthatunk. Nagy tblzatok
esetn pldul ajnlatos klnbz szn oszlopokat hasznlni. Ha pedig valamelyik mezre nincs szksgnk,
egyszeren kitrlhetjk ebbl a listbl.
Van a komponensnek egy apr, m nha elg zavar hibja: a grgetsvot nem hagyomnyos mdon
kezeli. A csszka mrete ugyanis mindig lland, s nem kveti a grgetst, mivel ha az els elem az aktv, a
csszka legfell van, ha az utols elemen llunk, akkor legalul, minden egyb esetben pedig a sv kells
kzepn. St, ha fl-le grgetnk, s az aljra illetve a tetejre lapozunk a tblzatban, a csszka csak akkor
mozdul el a sv aljra ill. tetejre, ha az els ill. utols elem az aktv, s szreveszi, hogy nem tud tovbb
12

grgetni (EOF vagy BOF). Ez a hiba jelentsen megneheztheti a tblzatban val naviglst, mivel nem ltjuk,
hogy hol jrunk benne.

TDBNavigator
Ez egy egyszer komponens, mely csupn az alapvet tbla-navigcis parancsok kiadsra szolgl:
lapozhatjuk vele adatainkat, szerkeszthetjk, elmenthetjk, trlhetjk (stb.) ket. A VisibleButtons tulajdonsg
segtsgvel megadhatjuk, mely gombok legyenek lthatak.
A kvetkezkben olyan komponensekrl lesz sz, amelyekhez hasonlk megtallhatk a Standard
komponensek kztt is. Ezrt ezek hasznlatt nem rszletezem, csupn a standard vltozattl val eltrsekre s
az adatbzis-kezel vonatkozsaira trek ki.

TDBText
A standard TLabel-hz hasonl statikus adatmegjelent komponens, mely egy adatforrs egy
mezjnek aktulis rtkt jelenti meg. Szerkesztsre nem hasznlhat. A DataSet s a DataField tulajdonsg
segtsgvel adhat meg a megjelenteni kvnt mez forrsa s neve.

TDBEdit
Ennek is megvan a standard prja, a TEdit, melytl csupn annyiban tr el, hogy szvegt egy tbla egy
mezjnek aktulis rtkbl veszi, illetve szerkesztsnl ezt a mezrtket mdostja. Hasonl a TDBText-hez.

TDBMemo
Memo tpus mezk megjelentsre szolgl komponens. Hasznlata ennek is trivilis.

TDBImage
Szintn egyszer komponens, amely a kpeket tartalmaz mezk megjelentsre szolgl.

TDBListBox
Ez egy olyan specilis ListBox, melynek elemei (Items) egy adott tbla adott mezjnek lehetsges
rtkeit tartalmazhatja. Az aktulis rtket amennyiben az megtallhat a listban automatikusan kijelli. Az
adott mez rtknek szerkesztse gy trtnik, hogy a listbl (kattintssal) kivlasztunk egy elemet, s az kerl
be j rtkknt a mezbe. A lehetsges elemeket a TStrings tpus Items tulajdonsgban adhatjuk meg.
Akkor hasznljuk, ha egy meznek csak adott rtkei lehetnek, gy a felhasznl semmikppen nem tud
ms rtket belltani (pl. neme: frfi/n).

TDBComboBox
Olyan a TComboBox nev standard komponensbl kszlt lenyl lista, mely az imnt emltett
TDBListBox-hoz hasonlan mkdik, csak itt a lista a lenyit gomb megnyomsa utn jelenik meg.

TDBCheckBox
Logikai (boolean) tpus adatmezk megjelentsre s szerkesztsre szolgl jellngyzet.
Hasznlata ugyancsak trivilis.

TDBRadioGroup
A TDBListBox-al megegyez funkcikat lt el, rdigombok hasznlatval.

TDBLookupListBox
Olyan ListBox, amely lookup (keres, lsd: II. fejezet) mez mkdtetsre szolgl. Egy tbla egy
mezjnek rtkt jelenti, illetve szerkeszti. A lista elemeit a ListSource (TDataSet) forrs ListField mezjnek
13

rekordjai alkotjk. A KeyField tulajdonsgba a ListSource azon mezjt lltjuk be, amely alapjn keresni
akarunk a ListSource-ban. Termszetesen a DataSource s a DataField a manipulland adat forrst s mezjt
adja meg.

TDBLookupComboBox
A TDBLookupListBox-hoz hasonl, csak ennl lenyl listbl vlaszthatunk rtket.

TDBRichEdit
RichText szerkeszt, amely tartalmt memo tpus mezben trolja. Olyan helyzetekben clszer
hasznlni, amikor szksg van a szvegek formzott trolsra (pldul ha olyan szvegeket trolunk, melyeket
esetleg nyomtatni is fogunk, s szksgnk van alapvet formzsi lehetsgekre), ugyanis ez a komponens (a
szabvny RichText formtumot hasznlva) formzssal egytt kezeli a mez tartalmt (gy hagyomnyos
TDBMemo-val megjelentve nem a ksz szveget, hanem annak forrskdjt kapjuk).

TDBCtrlGrid
Olyan tblzat, amely egy adatforrs rekordjait jelenti meg, szabad formj elrendezsben. Ez azt
jelenti, hogy klnbz adatmanipull objektumokat helyeznk el a tblzat legfels sorba, amiket a program
futsakor a komponens megsokszoroz, s minden egyes sorban ugyanazzal a kiosztssal megjelenti a rekordok
adatait. A tblzatra azonban csak bizonyos adatmanipull komponenseket helyezhetnk fl (pldul TDBEdit,
TDBListBox, stb.). a DataSource tulajdonsgot a DBCtrlGrid-nek kell belltani, a rajta lv objektumok
DataSource nev tulajdonsga nem llthat.

TDBChart
Adatbzison alapul grafikon ksztsre sznt komponens. Mivel hasznlata, mkdse olyan
szertegaz, s sokrt, hogy taln egy kln munkt is megrne, nem foglalkozunk vele. rdemes megtekinteni
demjt, a Delphi knyvtrban a Demos\Teechart\teedemo.dpr fjlt megnyitva s futtatva.

Nyelvi problmk
A Delphi adatbzis-kezel komponenseit hasznlva hamar rbukkanunk az angol nyelv szvegekre,
melyeket a komponensek mkds kzben jelentenek meg. Pldul ha egy DBGrid-et vagy DBNavigator-t
hasznlunk, s bekapcsolva hagyjuk a ConfirmDelete tulajdonsgot, majd trlni prblunk egy adatot, azonnal
elnk ugrik a kvetkez krds: Delete Record?. Ha tovbb jtszadozunk a komponensekkel, az esetleges
hibajelzseket is angolul fogjuk megkapni. Ez egy magyaroknak sznt, magyar nyelv program esetben nem
mutat jl, s amennyiben a felhasznl nem tud angolul klnsen zavar lehet.
Mit tehetnk? hangzik a krds. A vlasz egyszer, de nem kzenfekv: t kell rni az angol
szvegeket magyarra. Hogy hol? A Delphi knyvtrban a Source\Vcl knyvtrban tallhat egy dbconsts.pas
nev fjl. Ebben csak a Db-komponensekkel kapcsolatos szvegek vannak definilva, mint konstansok. Ezeket
egyszeren t kell rni, s a nyelvi problmink nagy rsze megolddik, mghozz rkre. (Clszer utna ezt az
tszerkesztett fjlt biztonsgos helyre is elmenteni.) Amennyiben mg mindig van angol szveg a programban, a
Delphi 5-t hasznlknak van mg egy lehetsge: a Project\Languages menpont, ahol nmi gyeskeds utn
lefordthatjuk a programban tallhat sszes string-et (bvebbeket ld. Delphi Help: languages: adding to a
project).

TDataModule
Ha mr prblkoztunk nhny bonyolultabb ablak sszelltsval, lthatjuk, hogy a nem vizulis
adatkomponensek (mint pldul a TTable s trsai) sok helyet foglalhatnak el a form-on. Ezt kikszblend
szletett a TDataModule komponens, mely egy olyan ablak, amelyen csak nem vizulis komponenseket lehet
elhelyezni. Elnye, hogy ttekinthetbb tudjuk tenni a programunkat, mivel ezen az ablakon brhov tehetjk a
komponenseket, s az ablak is brmekkora lehet, hiszen nem jelenik meg futs kzben. Msik elnye, hogy ha
egy ablakra kitesznk egy komponenset, annak lenyitjuk a DataSource tulajdonsgt, a Delphi az aktulis formon lvkn kvl felknlja azokat az objektumokat is, amelyek a DataModule-on vannak.
Delphi 5-t hasznlk mg adat-diagrammot is kszthetnek a DataModule segtsgvel.

14

IV.

Egy adatbzis-kezel alkalmazs elksztse

A tovbbiakban arrl lesz sz, milyen mdszerekkel s felttelekkel kszthetnk adatbzis-kezel


alkalmazsokat Delphi-ben.

Tervezs
A programok ksztsnek els s legfontosabb fzisa ez. Gondos tervezs nlkl nem szabad (s
igazn nem is lehet) elkezdeni egy fejlesztst. A program elszr mindig a fejleszt agyban szletik meg, s
csak aztn kezddik a kdols. Flrerts azonban ne essk! A program gondos megtervezse nem azt jelenti,
hogy sorrl sorra megrjuk elre a kdot, hanem hogy tgondoljuk mkdsi elvt, rendszert. A gyakorlati
megvalstson elg kdols kzben gondolkodni, mert ha j a tervezs, nincs problma vele. Csak akkor
kezdjnk el programot tervezni, ha az adatbzis mr gondosan megterveztk s elksztettk. Annak ugyanis
fggetlennek kell lennie a programtl.
Fontos szempont programtervezsnl, hogy rendszere tlthat s knnyen bvthet legyen. Mivel a
Delphi objektumorientlt fejlesztrendszer, neknk is objektumorientltan kell gondolkodnunk. A
programunknak jl kell illeszkednie az ltala hasznlt adatbzis felptshez. Minden feladatot az elvrt mdon
kell megoldania. Fel kell kszlni arra is, hogy az les hasznlat sorn hatalmas adatmennyisgek
halmozdhatnak fl, gy mindenre meg kell keresnnk a legoptimlisabb megoldst. Gyakori hiba, ha a fejleszt
nem gondol arra, hogy jval tbb adat kerl majd az adatbzisba, mint amennyivel tesztelte. Az nem elg, ha a
tesztek sorn a program szp eredmnyeket produkl. Mindig el kell gondolkozni azon, nem lehet-e mg jobban,
mg egyszerbben, mg gyorsabban megoldani a feladatokat.
Az ablakokat is rdemes elre megtervezni, gy ttekinthetbb lesz a programterv, s ksbb is
gyorsabban halad a munka. s persze a megrendelnek meg lehet mutatni ezeket a terveket, ami nem egy utols
szempont.
Ez a fejezet nem programot tervezni tant, inkbb segt kezet nyjt a tervezshez s a kdolshoz.

A DataModule
Ha tl vagyunk a tervezsen s az adatbzis ltrehozsn, az j Project megnyitsa utn els dolgunk
egy j Data Module megnyitsa (File/New/Data Module). Ebbe kerlnek bele aztn a tblk (TTable), s az
SQL-ek (TQuery). Mindegyiknek be kell lltani a DatabaseName tulajdonsgt, illetve a forrst (TableName
s SQL). Ha ezeket meg is szeretnnk jelenteni, csatlakoztatnunk kell hozzjuk egy-egy DataSource-t (ki kell
helyezni ket, majd a DataSet tulajdonsgukat a megfelel rtkre lltani).
Ezek utn be kell lltanunk a lookup kapcsolatokat.
El kell dntennk, hogy egy-egy tblt vagy Query-t mikor szeretnnk hasznlni. Ha a program futsa
sorn llandan (vagy elg gyakran) szksgnk van r, clszer ezt a program futsnak kezdetn megnyitni
(nem ajnlatos mr szerkeszt mdban megtenni ezt, az Active tulajdonsg true-ra lltsval, mert ez a
ksbbiekben problmkat okozhat). Ehhez rdemes a tblkat tartalmaz DataModule OnCreate esemnybe
helyezni a megnyitsi blokkot. A megnyitst mindig ajnlatos Try-blokkba tenni (ld. Delphi Help: Try...except
statements; VI. fejezet). gy ha nem sikerl megnyitni valamelyik tblt, az esetleges hibkat az Except rszben
le tudjuk kezelni. A legegyszerbb ilyen megnyitsi blokk gy nz ki:
Try
Table1.Open;
Table2.Open;
Query1.Open;
//stb
Except
ShowMessage(Hiba! A tblk megnyitsa meghisult.);
Halt;
End;
Hasznlhatunk persze olyan tblkat s lekrdezseket is, amelyeket csak nha, vagy egy adott modul
megnyitsakor kell megnyitnunk. Ekkor rtelemszeren jrjunk el, s a megfelel helyre helyezzk az Openeket, hogy elkerljk a flsleges erforrs-pazarlst.
Ha a tblkhoz jelsz is tartozik, a jelszavakat a Session.AddPassword metdus segtsgvel trolhatjuk
el. gy a programunk tudni fogja a jelszt (vagy jelszavakat), s nem fog kln rkrdezni. Az AddPassword
metdust mindig a megnyits eltt kell meghvnunk.
Ha mg csak most kapizsgljuk a Delphi adatbzis-kezelst, mg nincs r szksgnk, de ksbb
felmerl a krds: Mi lesz, ha trldik az alias, vagy olyan gpen indtjuk el a programunkat, ahol van BDE,
elrhet az adatbzis is, de mg nincs hozz alias? Ebben az esetben vagy kzzel hozzuk ltre, vagy (s ez a
szebb megolds, hiszen ehhez a felhasznlnak nem kell ismernie BDE Administrator-t) a programunkkal
15

vgeztetjk el ezt a munkt. A megolds alapesetben egyszer, le kell krdezni, hogy ltezik-e az adott alias, s
ha nem, ltre kell hozni. Ez addig j, amg a programunk indtsi knyvtrhoz kpest fix helyen tallhat az
adatbzis knyvtra (mondjuk a program knyvtrban van egy Database knyvtr). Hasznlhatjuk azonban az
adatbzist hlzaton keresztl is. Ekkor nem tudhatjuk, hol lapul az adatbzisunk. Ekkor bizony a vtlen
felhasznlval kell megkerestetnnk azt.
Ilyen problmk megoldsra a kvetkez mdszert ajnlom. Ha a programot s az adatbzist egyazon
szmtgpre teleptjk, az adatbzis mindig legyen a program knyvtrban, pldul egy Database nev
alknyvtrban. gy ha nem ltezik az alias, egyszeren ltrehozzuk, s belltjuk neki knyvtrknt ezt a
knyvtrat. Arra is fel kell azonban kszlni, hogy az adatbzist egy msik szmtgpen szeretnnk trolni.
Ilyenkor a programnak clszer megnznie, ltezik-e ez a bizonyos Database knyvtr. Ha nincs, akkor
bizonyra valahol mshol kell lennie. Ekkor a legjobb, ha kzljk a felhasznlval, hogy nem tudjuk, hol az
adatbzisa, s legyen szves, mutassa meg neknk. Ezt egy egyszer fjlmegnyit ablakkal is megtehetjk. Ha ez
megvan, mr ltrehozhatjuk az alias-t. A figyelmes programoz az ekkor megadott knyvtr nevt eltrolhatja
egy fjlban, gy ha legkzelebb eltnik az alias, csak onnan kell kiolvasni annak helyt, nem kell a
felhasznlt nyaggatni ezzel.
Egybknt aggodalomra semmi ok, az alias-ok nem szoktak csak gy eltnni. Ez a problma
ltalban a program els indtsakor jelentkezik. Persze a program teleptjvel (ld.: VI. fejezet) is ltrehozhatjuk
az alias-t, de tapasztalatom azt mutatja, hogy az kezetes knyvtrnevekkel (ha az adatbzis elrsi tjban van
kezet) vigyzni kell.
A problma programon belli megoldsra itt egy egyszer plda (a DataModule OnCreate
esemnyben):
var ActDir:string; {az aktulis knyvtrat fogjuk ebben trolni}
DBDir:string; {az adatbzis knyvtrt troljuk ebben}
{}
if not Session.IsAlias('En_Aliasom') then
begin
GetDir(0,ActDir); {Lekrjk az aktulis knyvtr nevt}
if DirectoryExists(ActDir+'\Database')
then DBDir:=ActDir+'\Database'
else
begin
Showmessage('_Hibazenet_');
Form1.OpenDialog1.Directory:=ActDir; {Az OpenDialog valamely
ltez form-on kell, hogy legyen!}
if not Form1.OpenDialog1.Execute then Halt {ha a felhasznl
mgsem-mel lpett ki, megszaktjuk a program futst}
DbDir:=Form1.OpenDialog1.Directory;
end;
try
{Ltrehozzuk az alias-t:}
Session.AddStandardAlias('EN_Aliasom', DbDir, 'PARADOX');
{Mentjk a BDE belltsait:}
Session.SaveConfigFile;
finally
Showmessage('Az adatbzis inicializlsa befejezdtt.');
end;
ChDir(ActDir); {visszalltjuk az aktulis knyvtrat}
end;
{}
//Itt jhet a tblk megnyitsa...
Ha ezzel is ksz vagyunk, a tblk egyes esemnyeihez hozz kell rendelnnk a sajt eljrsainkat. Meg
kell adnunk, mi trtnjen, ha a felhasznl ki akar trlni egy adatot, vagy jat akar beszrni, stb., azaz ki kell
dolgozni a tblk esemnyeit. Fknt rinti ez a szmtott mezket, hiszen azok szmtsi algoritmust a tblk
OnCalcFields esemnyben kell kifejteni. Hogy ezen fell mire van mg szksg, azt a program milyensge s a
programoz zlse hatrozza meg.

Az ablakok
Az alkalmazsok fejlesztse sorn nagy hangslyt kell fektetnnk az ablakok kialaktsra, hiszen a
programot a felhasznlnak ksztjk, s a felhasznlk szmra fontos a j megjelens s a knny
kezelhetsg. Elsdleges szempont mindig a funkci. Mindennek a helyn kell lennie, s megfelelen, logikusan
kell mkdnie. Emellett azonban figyelnnk kell arra is, hogy flsleges, zavar dolgok ne kerljenek a
16

kpernyre. Csak azt jelentsk meg, ami informci-tartalommal br. A redundancit lehetleg kerljk.
Ablakunkat tovbb minl tlthatbb kell tennnk. A felhasznlk azt szeretik, ha egy ltaluk is kvethet,
egyszer logika alapjn plnek fel a kezelfelletek. Ez sokszor okoz fejtrst a fejlesztnek, mivel a bels
mkdse fell szemlli a programjt. Akkor j egy program, ha a felhasznlnak nem szksges tisztban
lennie a bels mkdssel.
Ha az ablak funkcionlisan megfelel felpts, mg nem biztos, hogy knnyen kezelhet. Ehhez
elszr is mindent jl lthatv s hasznlhat mretv kell tennnk. Ez alatt elssorban a bettpust s mretet,
valamint a gombok s egyb objektumok nagysgt rtem. A Windows ltal hasznlt alaprtelmezett
bettpusnl (MS Sans Serif 8) a 10-es mret Arial olvashatbb, ezrt clszer a form-unk ltrehozsa utn
rgtn erre belltani a form Font tulajdonsgt. Ez a belltott rtk lesz rvnyes a form-ra kerl
objektumokra is. Ha van a kpernyn hely, a gombokat rdemes az alaprtelmezetthez kpest egy kiss
megnagytani.
Programunkat tlthatbb tehetjk tovbb azzal, ha a szabvnyos gombok (TButton) helyett TBitBtn-t
hasznlunk, amelyre kis kpeket lehet helyezni (Glyph), ezzel megknnytve a felismersket. Elegend
kpecskt tallunk a Delphi kptrban, amelyet teleptstl s verzitl fggen a Delphi knyvtrn bell az
Images\Buttons, vagy a Program files\Common Files\Borland Shared\Images\Buttons knyvrban keressk.
Tallkozhatunk olyan esettel is, amikor a programot a megrendel rintkpernys monitoron szeretn
hasznlni. Ekkor mr tervezskor figyelnnk kell az ablakokon tallhat kezelk mretre, mert egy mr
meglv ablakot tszabni gy, hogy minden megfelel mret legyen, sokszor nagy veszdsgekkel jr. Ha nem
fr el minden szksges funkci egy ablakban, akkor clszer azokat egyms utn megjelen
prbeszdablakokba helyezni. Ekkor figyeljnk arra, hogy logikusan, lpsrl lpsre haladjunk. Itt emltem
meg, hogy azok az objektumok, amelyek rendelkezhetnek grdtsvval, a Windows grdtsv-belltsait
hasznljk. Ez gyakran kicsinek bizonyul. Ebben az esetben clszer a felhasznlt felszltani, hogy a
megfelel helyen tegye meg a szksges belltsokat a Windows-ban. Ha erre felkszlnk, a programunkat
clszer nagy grdtsv-mrettel is kiprblnunk, hogy ne ksbb rjen meglepets.
Ltezik mg egy ers buktat az ablakok tervezsben s kivitelezsben. Ez pedig a felbonts krdse.
Nem mindegy ugyanis, hogy milyen felbontsban tervezzk meg az ablakot, s hogy azt milyen felbontsban
fogjk hasznlni. Gyakori hiba, hogy valaki egy 1024x768 mret kpernyn tervezi meg az ablakjait, de azt egy
800x600-as kpernyn fogjk futtatni, s azon bizonyos dolgok kilgnak a kpbl. De az ellenkezje is
elfordulhat, amikor egy kisebb felbontsra tervezett programot nagyobb felbontsban futtatunk, s hatalmas
res helyek jelennek meg az ablakok jobb szln s aljn. A problmra tbb megolds is van. Elszr is
clszer sklzhat ablakokat ksztennk. Ekkor azt kell meghatrozni, hogy melyik komponens melyik
irnyba legyen mozdthat. Erre rendelkezsnkre ll a komponensek Anchors tulajdonsga. Ennek ngy logikai
tpus eleme van (Left, Top, Right, Bottom), amelyekkel meghatrozhatjuk, hogy a komponens az ablak melyik
szlhez legyen rgztett tvolsgra (clszer ksrletezni vele). Jl sklzhatv tehetjk alkalmazsunkat, ha
megfelelen hasznljuk a komponensek Align tulajdonsgt (ez nem minden komponensnek van, s nem
sszekeverend az Alignment-tel). Ha pl. alClient-re lltjuk, a komponens kitlti a teljes terlett az ablaknak
vagy annak a panelnek, amelyre helyeztk. rdemes egybknt TPanel-eket hasznlni, objektumok egy
csoportjnak megjelentsre, mert a segtsgkkel csoportosthatjuk a komponenseket, s a TPanel-nek is van
Align tulajdonsga. Az Align tulajdonsgot alLeft-re, alTop-ra, alBottom-ra vagy alRight-ra lltva
rtelemszeren a megfelel oldalra zrva jelenik meg a komponens.
Csnya, de sokszor elkerlhetetlen megolds, ha az ablak (form) automatikus grgetst (AutoScroll)
hasznljuk ki. Bizonyos specilis szoftvereknl azonban nem rdemes ilyenekkel veszdni, hanem egyszeren
meg kell hatrozni egy felbontst, amelyben a program mkdik. Ha pedig a program elindtsakor nem
megfelel a felbonts, figyelmeztetni kell errl a felhasznlt (a kp mrett a Screen.Height, ill. a Screen.Width
tulajdonsgok segtsgvel krdezhetjk le a legegyszerbben).

Ablaktpusok
Alkalmazsunk tervezsnl figyelembe kell vennnk, hogy hogyan fogjk hasznlni. Kt elrendezsi
tpus kzl vlaszthatunk. Az egyik a hagyomnyos (SDI) ablakok, amikor egy jonnan megnyl ablak a tbbi
fl rajzoldik, s esetleg vltogathatunk a megnyl ablakok kztt. Ha ezt a megoldst hasznljuk, oda kell
figyelnnk arra, hogy a prbeszdablakok mgtti ablak ne legyen elrhet (az Enabled tulajdonsga legyen
false, vagy nem a Show, hanem a ShowModal metdussal jelentjk meg a prbeszdablakot).
Hasznlhatjuk azonban az n. MDI ablakokat is. Ezek elnye, hogy a gyermekablakok a szlablakon
bell nylnak meg (ezt a megoldst hasznljk pl. a szvegszerkesztk is). Ehhez lltsuk a fablak FormStyle
tulajdonsgt fsMDIForm-ra, a gyermekablakokt pedig fsMDIChild-ra. MDI ablakokat hasznlva a Windows
rengeteg lehetsget nyjt, gy egyszeren kszthetnk ilyen alkalmazsokat (ld.: Delphi Help: MDI
applications).
Szintn rdemes megfontolni, hogy az ltalunk ksztett program az egyedli alkalmazs-e, amit
hasznlni fognak a szmtgpen. Ha igen, akkor hasznos lehet, ha a programot teljes kpernyn futtatjuk,
eltakarva ezzel a Windows tlcjt is (ehhez a WindowsState-et wsMaximized-re, a BorderStyle-t pedig bsNonera kell lltani). gy a felhasznl nem tud vletlenl rossz helyre kattintani, elindtva ezzel valamilyen nem
17

kvnatos alkalmazst. Ha viszont ms szoftvereket is hasznlnak egy idben az ltalunk ksztettel,


mindenkppen adjunk arra lehetsget, hogy a programot minimalizlni lehessen, s futsakor el lehessen rni a
Start ment s a tlct.

A fkperny
A szoftverek egyik legfontosabb eleme (vizulis szempontbl), a programmodulok kztti sszekt
kapocs, a fkperny. Nem szabad teht elhanyagolnunk ezt sem, a modulokhoz hasonlan, krltekinten kell
bnnunk vele. A fkperny milyensge elssorban attl fgg, hogy alkalmazsunk hagyomnyos SDI, vagy
MDI ablakokat hasznl.
Hagyomnyos ablakok esetn a hagyomnyos fkperny-struktra hasznlata ajnlott. Ez azt jelenti,
hogy a program klnbz funkciit a fkpernyn elhelyezett nyomgombokhoz rendeljk (ha tl sok ilyen
funkci van, hasznlhatjuk azt a megoldst, amikor egy gombot lenyomva egy legrdl men [Popup Menu]
jelenik meg). A gombok elhelyezkedse eszttikailag s logikailag is fontos, de lnyegben a fejleszt zlse
hatrozza meg milyensgt.
Ha MDI ablakokat hasznlunk, a program funkciit az ablak tetejn, mensorban, illetve eszkztrsorban rdemes elhelyezni. Mindketthz teljes tmogatst nyjt a Windows. Megadhatunk pl. egy menpontot
(WindowMenu), amelybe a Windows automatikusan berja a nyitva lv gyermekablakok listjt, s segtsgvel
knnyedn t is vlthatunk egy msikra.
Ignyes fejlesztk szpthetik az alkalmazsukat gy is, hogy a fkperny htterbe valamilyen kpet
helyeznek el (ilyenkor a TImage nyjtja a segt kezet). Internetrl letlthet komponensekkel a gombok teljes
talaktst (textrzst) is meg lehet oldani. Minden csak tletek krdse. A felhasznlk pedig szvesebben
dolgoznak szp programokkal.
A tbbi ablak szptst azonban nem kell tlzsba vinni, mert ez sokszor a hasznlhatsg krra
vlhat.

Egy hagyomnyos fkperny, textrzott gombokkal s httrrel

s egy egyszerbb elrendezs, lenyl menvel

Tblamegjelent ablakok
Megszokott dolog, hogy ha adatbzisrl beszlnk, rgtn sszekapcsolt tblzatok sokasgra
gondolunk. Adatbzis-kezel programok sokasga jelenti meg tblzatban adatait. Ez azonban nem jelenti azt,
hogy ez minden esetben j. Csak akkor szksges ilyen ablakokat alkalmazni, ha szksg van a rgztett adatok
18

sokasgnak ttekintsre, sszehasonltsra. (Teht egy jegykiad-nyomtat programban flsleges az eddig


flvett jegyek listjnak megjelentse, hiszen visszamenleg csak bizonyos kimutatsokat, lekrdezseket
vgznk, de a konkrt adathalmazra nincs szksgnk.)
Ezek utn, ha gy gondoljuk, hogy mgis szksgnk van tblzatra, azt inkbb csak
adatmegjelentsre, s nem szerkesztsre ajnlatos hasznlni. A tblzattal trtn adatmegjelentsnek van egy
nagy elnye: ha gyesen csinljuk, a felhasznl egyszeren s gyorsan naviglhat, kereshet, rendezhet, szrhet
benne.
Egy ltalnos tblzat-ablaknak a kvetkez rszei lehetnek: (1) maga a tblzat, (2) a navigcis panel,
(3) mveletvgz panel, (4) szr panel, (5) informcis sv (sttuszsor). Ezek kzl termszetesen nem
ktelez mindnek szerepelni, s egyb dolgot is megjelenthetnk, igny szerint.
A tblzatot (1) termszetesen DBGrid-del valstjuk meg (errl a komponensrl mr szt ejtettnk a
IV. fejezetben). Az els, amit meg kell tennnk vele, hogy testre szabjuk a megjelentst az Options s a
Columns tulajdonsgok segtsgvel. Belltjuk a megjelentend mezket, esetleg azok sznt, mrett, stb. ezek
utn gondolnunk kell az esemnyeire. Gyorsbillentyket definilhatunk az OnKeyPress s az OnKeyDown
esemny segtsgvel, s itt tudjuk megoldani a rendezs krdst is. A leggyakoribb megolds ugyanis egy
tblzatban a rendezs belltsra, hogy amelyik oszlop fejlcre kattint a felhasznl, a szerint az oszlop
szerint rendezzk az adatokat. Ehhez azonban tudni kell, hogy rendezni csak akkor tudunk, ha azt az adatokat
biztost Table lehetv teszi, azaz a defincijban szerepel az adott mez szerinti index (Query hasznlata
esetn a rendezsi sorrendet csak a lekrdezs mdostsval s jrafuttatssal vltoztathatjuk meg).
Amennyiben erre lehetsgnk van, a megolds egyszer: a DBGrid OnTitleClick esemnyben figyeljk, hogy
melyik oszlopra trtnt a kattints, s az annak megfelel rtkre lltjuk a tbla indext. rdemes mg ilyenkor
a fejlc bettpust megvltoztatni (pl. flkvrre, vagy alhzottra), hogy knnyen lthat legyen az aktulis
rendezs. Arra figyeljnk, hogy a lookup mezk szerint nem lehet rendezni. gy csak a kapcsolatot megvalst
kulcs szerint rendezhetnk (ami ltalban szm), s egyltaln nem garantlt, hogy ez meg fog felelni az
zlsnknek. Megolds lehet az, hogy SQL lekrdezseket hasznlunk, illetve ezeket vegytjk a tblkkal.
(Tallkoztam mr olyan megoldssal, hogy a kt legfontosabb lookup-mezhz tartozott egy-egy Query, s ha
azon mezk fejlcre kattintott a felhasznl, a tbla helyett a Query-t kapcsolta be a program a tblzat
adatforrsul, a Query-t pedig minden adatmdostsnl jrafuttatta. Ez kiss lassnak tnhet, de mindenkppen
clravezet.).
A navigcis panel (2) a msik dolog, amire szinte mindig szksg van. Szerepe akkor nagy, ha mr
nagyon sok adatunk van a tblzatban, s gyorsan el szeretnnk jutni egy adott rekordhoz. Ami biztosan kell, az
a tblzat els s utols rekordjra mozgat gomb (segtsgnkre van a TDBNavigator). A msik egy, a
kulcsmezkhz rendelt ugr-sv. Ezt egy egyszer TEdit-tel s egy gombbal tudjuk megvalstani. Ha a gombra
kattint a felhasznl, az adatbzisban megkeressk a begpelt szveghez legkzelebb es adatot
(Table.FindNearest). Fontos, hogy ezt csak kulcsmezkkel tudjuk elvgezni. Nehezebb a dolgunk, ha egy
lookup-mez rtkeit is bevesszk. Ekkor abban a tblban kell keresni, amelyikbl a lookup szedi a rekordokat,
s a tallt rekord kulcsrtkt kell megkeresni a tblzatunkban.
Kln panelen illik elhelyezni azokat a gombokat, amelyekkel mveleteket vgezhetnk (3). A hrom
alapvet mveletnek mindenkppen ott kell lennie (beszrs, mdosts, trls), de ide kerlhetnek a nyomtats,
szrs s egyb lekrdezsek gombjai. Ha lehet, hasznljunk BitButton-okat (TBitBtn), s helyezznk ki rjuk
klnbz kis kpeket. Bizonyos esetekben hasznlhatunk szerkeszt objektumokat is (DBEdit, DBComboBox,
stb.), ment s elvet gombokkal ksrve.
A szr panelnek (4) nem muszj mindig ltszania, inkbb egy gombbal ki-be kapcsolgathatjuk. A
szrt gy kell elksztennk, hogy a lehet legtbb adatra tudjunk vele szrni. Itt is fontosnak tartom
megemlteni, hogy lookup tpus mezkre nem lehet szrni, ezt mshogy kell megoldanunk, pldul gy, hogy a
lookup mez forrstbljbl minden adatot kilistzunk egy ComboBox-ba, s egy adott elem kivlasztsnl
rkeresnk arra a kapcsolt tblban, majd a tallt mez kulcsrtke szerint szrjk a tblzatunkat. A
ComboBox-ot norml szrknl is hasznlhatjuk, de azt minden adatmdosts esetn jra fel kell tlteni. A
ComboBox-ba elhelyezhetnk egy (mind) elemet is, melyet kivlasztva az adott mezre val szrst
kikapcsoljuk. A mind-et azrt kell zrjelbe tenni, mert a zrjelet rendezsnl a Windows elre helyezi, gy
biztosak lehetnk abban, hogy ez a felirat az els elemek kztt lesz (a rendezshez be kell kapcsolni a
ComboBox-on az AutoSort-ot). Szrshez zls szerint termszetesen hasznlhatunk Edit-et is, de vigyzzunk: ha
az Edit OnChange esemnyre (ez az esemny akkor hvdik meg, amikor vltoztatjuk az Edit tartalmt)
vltoztatjuk a szrfelttelt, ersen lelassthatjuk alkalmazsunkat azzal, hogy minden billentyletsre hosszas
mveleteket vgznk. Hasznljunk inkbb frisst-gombot.
A mai alkalmazsokban teljesen ltalnosnak mondhat a sttuszsorok (5) hasznlata. Mi se
dzkodjunk ilyeneket hasznlni, ha msra nem, ht arra, hogy az egrmutat alatt lv objektumrl adunk benne
rvid lerst. Ezt gy tehetjk meg, hogy az objektumok Hint (bubork-sg) tulajdonsgba egy | jel utn egy
hosszabb
lerst
runk,
az
Application.OnHint
eljrsba
pedig
megadjuk,
hogy
StatusBar.SimpleText:=Application.Hint. (Delphi 5-t hasznlk ezt az TApplicationEvents komponens
segtsgvel tehetik meg, a rgebbi verzikban ezt kzzel kell hozzrendelni az esemnyhez gy, hogy ksztnk
egy sajt eljrst, s egyenlv tesszk az Application.OnHint rtkvel. Ld: Delphi Help: Hint, OnHint,

19

GetLongHint example.) Termszetesen a sttuszsorba kirhatjuk az aktulis rekord llapott, vagy brmi mst,
amit a felhasznlval kzlni akarunk (a TStatusBar hasznlatrl ld. a Delphi Help: TStatusBar).
A gyorsabb hasznlhatsg rdekben nagy hangslyt kell fektetnnk a billentykombincik
alkalmazsra. Ide nem csak a gombokon lv alhzott karaktereket vehetjk be, hanem hasznlhatjuk a
funkcibillentyket is. Ebben az esetben az OnKeyDown esemnyt hasznlhatjuk.

Egy tblamegjelent ablak, szrkkel

Adatlapok
Egy rekord szerkesztsre legjobb eszkz az adatlap. Itt minden szksges informci egy helyen van,
de mindig csak az aktulis rekordrl kapunk informcikat. Adatlapot a legegyszerbben gy kszthetnk, ha
megnyitjuk a megfelel tbla FieldsEditor ablakt, kijelljk a szksges mezket, majd egrrel rhzzuk az j
ablakra. A hats: megjelennek a megfelel tpus, mret, megfelelen belltott szerkesztkomponensek, a
megfelel cmkkkel elltva. Ha ezek mell kitesznk egy DBNavigator-t, ksz is az adatlapunk. Az
ignyesebbek persze sajt gombokat is hasznlhatnak. Nha clszer azt a cselt bevetni, hogy az adatlap
megjelensekor nem szerkeszthet (hiba prbl a felhasznl valamit is mdostani), csak a szerkeszt gomb
megnyomsa utn. Ehhez az adatlaphoz tartoz DataSet AutoEdit tulajdonsgt kell false-ra lltanunk.
Ennl nagyobb gondossgra is szksg van azonban, ha egy, a program trzst kpez tblzat
adatlapjt ksztjk. Nem mindegy ugyanis a mezk sorrendje, elhelyezkedse. Ha pldul az adatlapnak ltezik
nyomtatott megfelelje is (amit ezen adatlap alapjn tltenek ki, vagy fordtva), a szmtgpen lv adatlap j,
ha a papron lvnek a pontos msa. De ha nem is ll fenn ilyen helyzet, ismt gondoljunk arra, hogy ezt a
programot a felhasznlknak rjuk, gy az knyelmk a legfontosabb. Oda kell figyelni arra, hogy a
komponensek sorrendje (Tab Order) megfelel legyen, azaz a TAB billentyt nyomogatva milyen sorrendben
lpkedhetnk az adatlapon (ennek belltsa: a form vagy label kijellse utn Edit/Tab Order menpont).
rdemes tovbb a mezkhz gyorsbillentyket rendelni, hogy minl knnyebb legyen egy adott mezhz
ugrani. Ehhez a cmkk szerept betlt label-ek feliratban (Caption) az & jellel meg kell jellni a megfelel
betket (Az & jel utni karaktert a Windows automatikusan alhzza), majd a FocusControl nev
tulajdonsgukban be kell lltani a hozzrendelt mezt. Ha ezt megtettk, a felhasznl az alhzott bet ALT
billentyvel egytt trtn lenyomsval a FocusControl-ban megadott mezbe tud ugrani, s azt szerkeszteni.
A lookup mezkre ltalban DBLookupComboBox-okat szoks hasznlni az adatlapokon. Ennek az a
htrnya, hogy csak a listban szerepl elemek kzl vlaszthatunk. Ez persze egyrtelmen kvetkezik a lookup
mez mkdsbl mondhatnnk. De a felhasznl nem tudja, mi az a lookup. Ez nem is rhat fl ellene.
Inkbb a fejlesztnek kell megoldania, hogy ha nem szerepel egy elem a listban (trzsadattblban), amire pp
szksg lenne, akkor valamilyen mdon fel lehessen venni gy, hogy ne kelljen az adatlapot elhagyni. A
legegyszerbb, ha a lookupcombobox mell helyeznk egy nyomgombot, amellyel elrhet az adott
trzsadattbla ablaka, ahol mdosthatjuk a tartalmt. Msik megolds, ha egy j elemet ltrehoz gombot
helyeznk ki, amely egy res adatlapot jelent meg. Ezt kitltve a program flveszi az elemet a trzsadattblba,
majd azt berja a lookup mezbe.
Az adatlapok ksztsekor gondolnunk kell arra, hogy minl automatikusabban mkdjenek. Egyrszt
ltezhetnek alaprtkei az egyes mezknek (pl. dtum esetn az aktulis dtum), msrszt elfordulhat, hogy egy
mez rtkbl lehet kvetkeztetni egy msik mez rtkre is. J plda erre, hogy ha egy megrendel adatlapon
a partner kivlasztsa utn, ha annak van bankszmlaszma, a fizetsmdnl a banki tutalst, ha pedig nincs,
akkor a kszpnzfizetst jelli ki a program. Az ehhez hasonl mdszerek hossztvon jl bevltjk a hozzjuk
fztt remnyeket.
Egy igen hasznos s egyben ltvnyos megolds a sznvlts mezobjektumok hasznlata. Ez azt
jelenti, hogy a mezk szne az llapotuktl fgg: ms szne van, ha szerkeszthet, ha csak olvashat; de ami a
legfontosabb: ms szne van, ha aktv (benne van a kurzor). Ez egy nagyon ltvnyos, de legalbb annyira
hasznos lehetsg, amit a Delphi komponensek ri mg nem fedeztek fel, de mr j pr alkalmazsban lehet
20

tallkozni vele. Ha valaki ilyet szeretne hasznlni a programjban, kt dolgot tehet: vagy r egy sajt
komponenst, ami tudja ezt a lehetsget, vagy pedig a programon bell kezeli le ezt a problmt. Az els
megolds kicsit bonyolultnak tnik, de csak egyszer kell megtenni. A msodikat egyszerbb, de minden egyes
programba kln bele kell pteni. Ha komponenst runk, elszr tanulmnyozzuk t a Delphi Help megfelel
fejezeteit (Creating a new component), csak aztn fogjunk bele. Ha ez mr meg van, arra kell figyelni, hogy a
sznvltst nem az onEnter, illetve onExit eljrsokba, hanem a
procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
illetve a
procedure CMExit(var Message: TCMLostFocus); message CM_EXIT;
deklarcij eljrsokba kell foglalni.
Abban az esetben viszont, ha programon bell oldjuk meg, nem kell mst tenni, mint hogy a megfelel
objektumok onEnter s onExit esemnyben megadni a megfelel szneket. Egy esemnykezel persze egyszerre
tbb objektumhoz is tartozhat, ekkor viszont clszer a kvetkezkppen megadni a szneket:
(Sender as TControl).Color:=SajatSzin;
Sorolhatnm mg azon lehetsgeket, amelyekkel szebb s hasznlhatbb tehet egy alkalmazs.
Minden csak a fejleszt fantzijn s tletessgn mlik.

Egy adatlap, sznvlts beviteli mezkkel


Figyeljk meg, hogy a kapcsold tblkba (hirdet neve, szervez neve) kzvetlenl vehetnk fel j rekordot az
j hirdet, ill. az j szervez felirat gombokkal. Tovbbi rdekessg, hogy a reklm szvegt formzni is
lehet (RTF).

Mveletvgz ablakok
Ebbe a kategriba sorolom azokat a prbeszdablakokat, amelyek nem egyszer adatbzismanipulcit, hanem valamilyen sszetettebb mveletet vgeznek. Ezeket azrt kell elklntennk, mert
felptskben, mkdskben teljesen msak, mint mondjuk az adatlapok. Ezeket az ablakokat ltalban arra
ksztjk fel, hogy valamilyen (ltalban meghatrozott) felhasznli mveletsorozatra valamilyen
meghatrozott adatbzis-mveletsorozatot hajtson vgre. Itt ne egy j nv felvtelre gondoljunk egy
telefonknyv-program keretein bell, hanem pldul egy ttermi rendszer fizets-moduljra, ahol egy szmlhoz
tbb asztal, tetszs szerinti rendelsei tartozhatnak.
Az ilyen feladatok elvgzsre hrom mdszer knlkozik. Az els, amikor egy ablakra rakjuk ki az
sszes szksges objektumot, melyekkel elvgezhet a mveletsor. Itt figyelni kell az tlthatsgra, s arra,
hogy ne legyen az ablak zsfolt. Ha nem elg nagy az ablak, s nem fr el rajta minden, akkor jhet szba a
msodik lehetsg, az egyms utn felbukkan ablakok hasznlata. Ezeknl fontos, hogy mindegyiken legyen
21

visszalpsi lehetsg (Mgsem gomb). A harmadik mdszer a legszebb, s manapsg egyre nagyobb teret hdt
magnak: a varzsl. Ennek persze csak akkor van rtelme, ha szabadon oda-vissza lpkedhetnk benne, illetve
brmikor kilphetnk belle. Nagyon fontos, hogy kerljk a felesleges szvegeket s oldalakat (dvzl oldal,
elkszn oldal, stb., ld. legtbb Microsoft varzsl), csak a lnyegre figyeljnk. J, ha minden oldalon van
valamilyen alaprtelmezett bellts (lehet ez az elz alkalommal hasznlt rtk), mert gy mg knnyebben
vgig lehet menni a varzsln. A Delphi sajnos varzsl komponenset nem tartalmaz, de nagyon egyszeren
kszthetnk magunknak egyet a TNotebook (Win 3.1 fl) segtsgvel, amely tbb lapbl ll, s lapjaira brmit
fltehetnk.

Rendels az ttermi rendszerrel (mveletvgz ablak): a tpusokra egyszer kattintva kivlaszthatjuk a baloldalon
megjelentend tteleket, azokra egyszer kattintva pedig felvehetjk a rendelsbe ket.

Kimutatsok
Az adatbzis-kezel programok fontos rszt kpezik a kimutatsok. Ezek alatt ltalban valamilyen
szempontbl csoportostott, valamilyen szrvel elltott, valamilyen rendezsi elvet kvet adatmegjelentst
rtnk. A feladat bonyolultsgtl fgg, hogy egy kimutatsnak hogyan kell kinznie, mit kell megmutatnia. Az
a j kimutats, amellyel minl tbb szempontbl lehet adatokat csoportostani. Kimutatsok ksztsnl szinte
elkerlhetetlen az SQL-lekrdezsek (Select-ek) hasznlata. A lekrdezsekkel termszetesen lehet szmtott
adatokat is megjelenteni, sszevonni, stb. (bvebbeket a Local SQL Guide-ban).
Az SQL-lekrdezseket hasznl kimutatsok fontos jellemzje, hogy menet kzben nem tudunk
vltoztatni a feltteleken (kivve a szrket), csak ha jrafuttatjuk a lekrdezst. Ezrt clszer a feltteleket a
kimutats megjelentse eltt bekrni a felhasznltl, majd lefuttatni az SQL-eket, s aztn megjelenteni azok
eredmnyeit. Ezek utn sem szabad azonban elfeledkezni a felttelekrl: rdemes azokat kijelezni a kimutatsablakban is. A kimutats-ablak szerkezete tetszleges lehet, de ha egyszerre tbb tblzatot jelentnk meg, azt
mindenkppen rdemes egy TPageControl megfelelen feliratozott lapjaira helyezni, hogy minl ttekinthetbb
legyen.
Gyakran hasznlunk kapcsolt tblkat, amikor egy adat trzse egy tblban, az egyb adatai (amelybl
tbb rekord is lehet) pedig egy msik tblban szerepelnek. Ekkor a legszebb megolds, ha mindkt tblzatot
megjelentjk, de gy, hogy az egyik tblban egyszerre csak egy, a msik tblban kivlasztott elem rszletei
jelenjenek meg. Ezt pedig a legegyszerbben gy tehetjk meg, ha az egyik tbla MasterSource-t s
MasterFields-t a msik tblnak megfelel DataSource-ra, illetve mezjre lltjuk.
Ha pl. van kt tblnk:
TableNevek(szemlykd, nv) (DataSourceNevek)
TableLakas(szemlykd, lakhely) (DataSourceLakas)
(Egy szemlyhez tbb lakhely is tartozhat.)
Ekkor a kvetkezket kell tennnk:
22

TableLakas.MasterSource:=DataSourceNevek;
TableLakas.IndexFields:=szemlykd;
TableLakas.MasterFields:=szemlykd;

Plda a kimutatsra: zrs az tterem programmal

Folyamatkijelzk (ProgressBar-ok)
Elfordulhat, hogy a programunk olyan mveleteket vgez, amelyek viszonylag idignyesek. Ekkor
nem tl j, ha ezt csupn egy homokrs egrkurzorral jelezzk (ezt egybknt az Application.Cursor
crHourGlass rtkre lltsval tehetjk meg), hanem folyamatkijelzket (ProgressBar-okat) hasznlunk. gy a
felhasznl meg tudja tlni, hogy mennyi van mg htra, s az is nyilvnvalv vlik szmra, hogy a program
nem fagyott le, hanem dolgozik.
Erre a feladatra termszetesen a TProgressBar komponens hasznlhat. A dolog egyszer:
megszmoljuk hny mveletet vgznk, s azt megadjuk a ProgressBar-nak (Max). Ezutn minden mveletet
kveten lptetjk (StepIt). Ha tudjuk, hogy a mveletek nem lesznek folyamatosak (a mveletek vgrehajtsi
ideje kztt nagyok a klnbsgek), clszer a Smooth rtket kikapcsolva hagyni, gy nem olyan feltn.
Kalkullhatunk azzal is, hogy egy hosszabb mvelet utn esetleg tbbet lptetnk egyszerre. Ami nagyon fontos,
hogy mindenkppen legyen valsg alapja a folyamatkijelznknek. Ha tehetjk, clszer szvegesen is kzlni,
hogy ppen mit csinl a program (ez hibakeressnl is jl jhet).
Mindez azonban semmit nem r, ha nem jelenik meg. Normlis esetben ugyanis a Windows nem
dolgozza fel a komponenseknek kldtt zeneteket, mikzben mi egy eljrson bell mveleteket vgznk. Ezt
neknk kell megtenni, az Application.ProcessMessages segtsgvel (ezt minden StepIt utn be kell rnunk).
Ezzel megolddik a problma. Termszetesen mshol is alkalmazhatjuk a ProcessMessages metdust, ahol
zavar, hogy sokig nem frisslnek az ablakok.

Nyomtats, riport
Gyakran van arra szksg, hogy amit az adatbzisunkban (vagy esetleg SQL lekrdezsnkben)
trolunk, papron is megjelentsk. Erre a Delphi is lehetsget nyjt a QuickReport komponenscsomag
segtsgvel (QReport fl). Az j riportot elhelyezhetjk a form-on, de ltrehozhatjuk nll ablakknt is
(File/New/Report). Hasznlata nagyon egyszer: belltsait a jobb egrgombbal elrhet menbl s az Object
Inspector segtsgvel tehetjk meg. A riportra ezek utn rpakolhatjuk a megfelel komponenseket a QReport
eszkztrbl. Hasznlatukat a mellkelt pldaprogramok segtsgvel knnyen megrthetjk (a Delphi
knyvtrn bell a Demos/Quickrpt knyvtrban talljuk ket). A lnyege az, hogy Band-eket kell elhelyeznnk,
23

amelyeknek klnbz tpusai lehetnek (BandType tulajdonsg), majd ezekben helyezzk el az adatokat
megjelent komponenseket (pl. QRDBText). A komponenseket szleskren konfigurlhatjuk, knynkkedvnk szerint.
Programunkon bell a QuickReport Preview metdust meghvva nyomtatsi kpet mutathatunk meg.
Ezt clszer alkalmazni, mert a felhasznlk szeretik ltni, mi fog a nyomtatott paprra kerlni. A Preview ablak
hasznlata egyszer, de clszer magyartani a Delphi knyvtrn bell a Lib/qrprev.dfm fjl megnyitsval s
trsval.

Egy QuickReport-tal ksztett nyomtatsi kp

Project
Ha mr mindennel ksz vagyunk, nem rt, ha vgignzzk a Project belltsait (Project/Options). A
Forms lapon bellthatjuk, hogy melyik form legyen az alkalmazsunk f formja (Main Form), valamint hogy
mely formokat hozza ltre automatikusan a program (amelyeket futsidben, kzzel kvnunk ltrehozni, azokat
trljk a listbl). Az Application lapon megadhatjuk, mi legyen a program neve (Application.Title, ez jelenik
meg a tlcn) s hogy mi legyen az ikonja (Application.Icon). Brmennyire is lnyegtelennek tnik, nagy
hangslyt kell fektetnnk az alkalmazs ikonjnak kivlasztsra. A felhasznlk ugyanis az alapjn azonostjk
a programunkat, gy annak utalnia kell funkcijra, vagy mindenkppen egyedinek, az ltalban hasznlatos
ikonoktl eltrnek kell lennie. A Compiler oldalon a fordtra vonatkoz belltsokat tehetjk meg. Vgs
fordts esetn (ha mr teljesen ksz vagyunk a programmal, s nem hajtunk tbb hibakeresst vgezni)
clszer a Runtime errors s a Debugging panelen mindent kikapcsolni, ezzel is cskkentve a program
erforrsignyt. Hasonl okokbl rdemes bekapcsolni a Code generation-ban az Optimization-t. Mg egy fl
van, ami rdekes szmunkra, ez pedig a Version info. Itt a programnak azon tulajdonsgait llthatjuk be,
amelyeket a Windowsban, az exe tulajdonsg-lapjn is megtekinthetnk. A mezket kitltve megadjuk a
verziszmot (a Build szm automatikus nvelsre is van lehetsgnk), a szerzt, a tulajdonost, stb.
Ha mr ezeken is tl vagyunk, jhet az utols Build, majd a hasznlat. Sok sikert!

24

V.

Egyb problmk

Hibakezels
Ebben a rszben a hibk kezelsnek alapjaival ismerkednk meg, hogy itt szerzett tudsunkat
felhasznlhassuk az adatbzis-kezel rendszerek ksztse sorn, hiszen egy adatbzis kezelse sorn rengeteg
hibalehetsg van, sokuk fggetlen attl, hogy a programot hogy rtuk meg.
A Windows a hibakezelst n. exception-kkel oldja meg. (Az exception jelentse: kifogs, kivtel,
kivteles esemny, megszakts. A magyar nyelv Windows-okban kivtelnek fordtjk, holott a kivteles
esemny, vagy a megszakts jobban illene r.) Kivtel akkor jn ltre, ha egy hiba, vagy egyb esemny
megszaktja a program norml futst. A kivtel az irnytst egy kivtel-kezelnek (exception handler) adja t,
ami lehetsget ad arra, hogy elklntsk a program norml futst a hibakezelstl. A kivtel informcit (ami
ltalban egy hibazenet) tud tvinni attl a ponttl, ahol elidztk, addig a pontig, ahol lekezelik. Ha egy
alkalmazs hasznlja a SysUtils unitot, minden futtatsi hiba (runtime error) automatikusan kivtell
konvertldik. Olyan hibk, amelyek ms esetben megszaktank a program futst mint pl. kevs memria,
nullval val oszts, ltalnos vdelmi hiba elfoghatk s kezelhetk. A kivtelek is objektumok, gy
hasznlatuk knnyen elsajtthat. (Delphi Help: Exceptions: Owerview)
Sajt magunk is ltrehozhatunk ilyen kivteleket, a raise kulcssz segtsgvel. A legegyszerbben a
kvetkez plda alapjn jrhatunk el:
raise EMathError.Create(Hiba trtnt! Kutykurutty!);
A hibk kezelse sem sokkal bonyolultabb ennl. A legegyszerbb, ha a problms mveleteket n. tryblokkba tesszk. Ez a kvetkezkppen nz ki:
Try
X := Y/Z;
except
on EZeroDivide do HandleZeroDivide;
end;
Az on utn a hiba tpust (pontosabban a kivtel osztlynak nevt) rjuk, a do utn pedig meghvhatjuk
a kezel eljrsunkat.
Ha azt szeretnnk, hogy a kritikus mvelet utn mindenkppen vgrehajtdjanak bizonyos mveletek,
s csak azutn keletkezzen kivtel, hasznlhatjuk a try..finally szerkezetet is:
Reset(F);
try
{...} // fjlmveletek az F fjllal
finally
CloseFile(F);
end;
A hibakezelsnek van mg egy fontos rsze, ez pedig a komponensek hibaesemnyei. Nevk ltalban a
kvetkezkppen nz ki: On*Error. Nevk utal mivoltukra, pl. a TTable OnDeleteError esemnye akkor
keletkezik, ha egy adat trlse meghisult. Ezek hasznlatval rengeteg hibalehetsget kiszrhetnk,
kezelhetnk. Ehhez jl kell tudnunk hasznlni az Exit, az Abort, ill. a Halt eljrsokat.
Az Exit kilp az aktulis eljrsbl. Ha a fprogramban van, a program kilp, ha egy meghvott
eljrsban van, visszaadja a vezrlst arra a pontra, ahol az eljrst meghvtuk. Akkor hasznljuk, ha olyan eset
ll fenn, amely mellett az eljrs nem folytathat.
Az Abort megszaktja az aktulis folyamatot anlkl, hogy hibt generlna. Hasznlatt a kvetkez
plda jl mutatja:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
if DBEdit1.Text = '' then
Abort;
end;
Teht a Table1 tbla ments (Post) eltt meghvott esemnyben (BeforePost) megnzzk, hogy resen
hagyta-e a felhasznl a DBEdit1 ltal reprezentlt mezt. Ha igen, az abort-tal megszaktjuk a mveletet, s gy
nem engedlyezzk a mentst.
A Halt azonnal meglltja a program futst, s a paramterknt megadott hibakddal kilp. Csak akkor
hasznljuk, ha a program futtatsa egyltaln nem folytathat.
A fentiek ismeretben nyugodtan elkezdhetnk hibaelhrt, kezel programrszeket rni.
25

Hlzat hasznlata Paradox rendszerrel


Gyakori feladat, hogy egy PARADOX adatbzist tbb szmtgprl szeretnnk egyszerre hasznlni.
Ehhez azonban mg nem felttlenl szksges kliens-szerver alkalmazst kszteni, ha jl dolgozik az ember,
megfelel platform erre a PARADOX is. gy kell teht megtervezni az alkalmazsunkat, hogy ne okozzon neki
gondot, ha vele egy idben egy msik program is dolgozik az adatbzisn. A problma ltszlag ugyanaz, mint
amikor egy szmtgpen egyszerre fut tbb program ri el ugyanazt az adatbzis. Az erre val felkszts
azonban nem elg. Az adatbzis ugyanis msknt viselkedik, ha a programok nem egyazon szmtgpen futnak.
Elsnek arra kell figyelnnk, hogy ha egy program szerkesztsre megnyitott egy adatot, azt egy msik
program csak olvassra tudja megnyitni. Ezrt le kell kezelnnk azt az esetet, amikor a msik program is
megprblja szerkeszteni azt. Ennek a legegyszerbb mdja, ha a tblk OnEditError esemnybe berjuk a
kvetkezt: E.Message:= 'Nem sikerlt megnyitni az adatot. Lehet, hogy egy msik felhasznl pp szerkeszti.';.
Ezzel azt rjk el, hogy hiba esetn a Delphi ezt az zenetet fogja kirni. A tbbivel nem kell foglalkoznunk,
hiszen a Delphi automatikusan megszaktja a hibt okoz folyamatot.
Gyakori eset, hogy egy adatbzisban egy egyed azonostsra egy szmrtket (kdot) hasznlunk, amit
minden egyes j egyed felvtelekor eggyel nvelnk. Ez a nvels pedig gy trtnik, hogy az j egyed a kdjt
gy kapja meg, hogy a legnagyobb kdhoz hozzadunk egyet. Ekkor azonban elfordulhat az, hogy kt program
egyszerre hoz ltre egy-egy j egyedet (vagy az egyik megnyitja, de mg nem menti, amikor a msik is
megnyitja). gy mindkt program azonos kddal szeretn elmenteni az adatot, ami nem tl szerencss (s nem is
lehet, ha ez a kd az egyedli elsdleges kulcs). Az ehhez hasonl esetek megoldsra az tnik megfelelnek,
hogy mihelyst ltrehozzuk az j egyedet, megkapja a megfelel kulcsot (kdot), s rgvest mentjk is, majd jra
megnyitjuk szerkesztsre. gy a felhasznl vagy a program korltlan ideig gondolkodhat az adatok kitltsn,
az egyed helye biztostott az adatbzisban.
Fontos krds hlzat hasznlata esetn a frissts megvalstsa. Minden mvelet eltt frissteni, a
mveleteket kveten pedig rgzteni kell az adatokat. A programok ugyanis nem veszik maguktl szre a
vltozsokat, amiket egy msik program okozott. Ezrt clszer a tblk Refresh metdust hasznlni, mieltt
valamilyen mveletbe kezdnk. Mivel a BDE az adatokat a memriban (bufferekben) trolja, azok nem rdnak
ki rgtn a merevlemezre, gy a vltozsokat csak az adott szmtgpen fut programok rzkelhetik (mivel
egyszerre csak egy BDE futhat, s az szolglja ki az sszes BDE-programot). Gondolnunk kell teht arra, hogy
egy esetleges meghibsods vagy ramkimarads esetn, tovbb ha egy msik szmtgp szeretn az aktulis
adatokat lekrdezni, ez az elv nem kvethet. Ezrt minden mvelet elvgzse utn rdemes a bufferek tartalmt
a merevlemezre rni a FlushBuffers metdus segtsgvel, ha pedig CacheUpdate mdot hasznlunk, az
ApplyUpdates-el (a CacheUpdate zemmdrl a TTable-nl volt sz, a IV. fejzetben).
Ezeket betartani azonban mg mindig csak fl siker. Ahhoz, hogy egyszerre tbb szmtgpen fut
programok (pontosabban BDE-k) megfelel mdon kezelhessk az adatllomnyokat, a BDE megfelel
belltsait is el kell vgezni. A BDE ugyanis az adatbzis megnyitsakor annak knyvtrban n. lock-fjlokat
(paradox tblk hasznlata esetn ez a paradox.lck s a pdoxusrs.lck) helyez el. Ezekben trolja azt, hogy mely
tblknak mely rekordjait nyitottk meg szerkesztsre, gy azokhoz csak olvassi hozzfrst enged. Ahhoz
viszont, hogy egyszerre tbb program (BDE) a hlzaton keresztl elrje ezt az adatbzist, ssze kell hangolni
ket. Erre szolgl a pdoxusrs.net fjl, amit a BDE a neki belltott NET DIR vltoz rtknek megfelel helyre
helyez el, illetve ott keresi. Ezrt fontos, hogy az sszes BDE egy helyen (a hlzat egyik megosztott
knyvtrban) keresse ezt a fjlt. Teht minden szmtgpen megfelelen kell belltani a BDE Administrtator
programban a Configuration/Drivers/Native/Paradox elem NET DIR paramtert (azon a gpen, ahol az adatok
vannak, a C:\-t rdemes belltani, a tbbi gpen pedig rtelemszeren ezt a knyvtrat kpvisel hlzati
megoszts nevt). Ha a belltsok nem helyesek, a program lellhat azzal, hogy az adatbzist valaki ms
hasznlja.
Ha mr a BDE belltsainl tartunk, ismt megemltem, hogy a sikeres hlzati mkds rdekben a
Configuration/System/INIT/LOCAL SHARE vltozt TRUE-ra kell lltani, klnben az adatokat nem tudjk
frissteni a hlzaton keresztl az alkalmazsok.
Ha olyan programot runk, amely hlzaton, tbb pldnyban mkdik, gondolnunk kell arra, hogy
bizonyos mveletek kizrlagos megnyitst kvetelnek maguknak (ilyen pl. a tbla rtse, az EmptyTable), azaz
ekkor csak egy pldnyban futhat a programunk. A legjobb s legegyszerbb az, hogy a mvelet elvgzse eltt
kzljk a felhasznlval, hogy zrja be a tbbi alkalmazst. Ha pedig mgis hiba lp fl, mg egyszer
figyelmeztetjk errl.
A fentiekbl ltszik, hogy a Paradox rendszereket nem arra talltk ki, hogy egyszerre tbb szz
program frjen hozz egy adatbzishoz. Nhny program viszont tkletesen mkdik hlzatban, ha betartjuk a
szablyokat. A tapasztalatom azt mutatja, hogy megfelel odafigyelssel ezeket a hibalehetsgeket ki lehet
iktatni, s vgeredmnyben egy jl hasznlhat alkalmazst kapunk.

26

Biztonsgi problmk
Elfordulhat, hogy az adatbzis megsrl. Mit kell, mit lehet ilyenkor tenni? Milyen kiltsaink vannak,
hogyan hrthatjuk el a hibt, s hogyan elzhetjk meg? Ezek a krdsek minden fejlesztt foglalkoztatnak.
Ebben a rszben megoldst keresnk rjuk.

Biztonsgi ments
A krok megelzsnek legegyszerbb mdja, ha biztonsgi msolatot ksztnk adatainkrl.
Egyszerbb fjlsrlseket kivdhetnk azzal, hogy az adott merevlemezre msoljuk le az adatokat. Biztosra
azonban csak akkor mehetnk, ha ezt egy msik adathordozra tesszk meg (trtnhetnek ugyanis olyan krok,
amelyek a merevlemez adatainak teljes elvesztsvel jrnak egytt).
Biztonsgi msolat ksztsre rengeteg mdszer knlkozik. Elszr is el kell dntennk, hogy errl mi
magunk kvnunk gondoskodni, vagy rbzzuk a felhasznlra. Ha nem akarjuk a felhasznlkat ilyenekkel
terhelni, rdemes a programunkba ptett automatizmussal megoldani. Persze az is megolds, ha kln
programot ksztnk erre a clra, amit a Windows Feladattemezjvel adott idszakonknt futtatunk. Ehhez
azonban mr ismerni kell a Feladattemez vezrlst, vagy a telepts sorn kzzel be kell konfigurlni. Ha a
felhasznlra bzzuk a dolgot, bepthetjk a programunk karbantart moduljba, vagy rhatunk r kln
programot, amelynek parancsikonjra kattintva automatikusan lefut. A legrosszabb megolds, ha nem tesznk
semmit, hanem a felhasznlra bzzuk, hogy ksztsen kzzel (valamilyen fjlkezelvel, Intzvel) msolatot az
adatbzis fjljairl. Ez ugyan nem valami felhasznlbart, de ha tudjuk, hogy a felhasznl kpes erre, minden
tovbbi nlkl pthetnk r.
A biztonsgi ments ktfle lehet. Vagy mindig ugyanazokat a fjlokat rjuk fell az aktulis
adatbzissal, vagy minden alkalommal egy kln dtummal elltott knyvtrba msoljuk azokat, lehetv tve,
hogy egyszerre tbb biztonsgi msolat is elrhet legyen. Arra kell ekkor figyelmet fordtanunk, hogy sok
biztonsgi ments mrete mr elg jelents lehet, s nem tl szerencss ezzel terhelni a httrtrakat. Meg kell
teht oldanunk az elavult biztonsgi mentsek trlst is.
Ami nagyon fontos: nem neknk rdeknk az adatok biztonsgos trolsa s mentse, hanem a
felhasznlnak.
Ha mr megoldottuk a biztonsgi msolat ksztst, mr csak a visszatltssel kell trdnnk. A
msolatot ugyanis azrt ksztjk, hogy problma esetn knnyen vissza lehessen tlteni azt az eredeti
adatfjlokat fellrva.
A feladat programozsa nem bonyolult, mindssze az adatbzis fjljait kell msolgatni a CopyFile
(windows unit) fggvny segtsgvel. A dolog jelentsge ott van, hogy gondoltunk r, s nem a felhasznlnak
kell ezzel trdnie.
Azt, hogy milyen idkznknt mentnk, attl tegyk fggv, hogy mennyire gyakran vltozik az
adatbzis, s ezek a vltozsok mennyire rekonstrulhatk.

Adatsrlsek kezelse
Az adatsrls ltalban gy mutatkozik meg, hogy program indtsakor, vagy futsakor valamilyen
hibazenetet kapunk a BDE-tl, amelyben hibs adatfjlokrl, megnyithatatlan tblkrl tjkoztat minket. Az
esetek tbbsgben a hiba javthat, mivel nem a tblk, csak a hozzjuk tartoz jrulkos fjlok srlnek.
Ezeket a srlseket ltalban a program futsnak vratlan megszakadsa okozza, amely trtnhet a mi
hibnkbl, de lehet a Windows hibja is. Hlzati hasznlat esetn egy vratlan kapcsolatszakads (rintkezsi
hiba, stb.) is okozhat ilyen hibt, ugyangy, mint az ramsznet.
Hogy jobban lssuk a helyzetet, tisztzzuk, milyen fjlok tartoznak egy Paradox alap adattblhoz. Az
els a .db fjl, ami maga a tbla. Ha ez srl, nem tudunk igazn mit kezdeni vele, a biztonsgi mentshez kell
nylnunk.
A tbbi, egy tblhoz tartoz fjlnak a pont eltti neve megegyezik a .db fjl pont eltti nevvel.
Ha hasznljuk a tbla Validity Checks (rvnyessg vizsglat) lehetsgt, automatikusan ltrejn egy
.VAL fjl, ami ezeket a belltsokat trolja. Ha ez srl meg, a 12036 kd, .VAL file is out of date (.VAL fjl
elavult) hibazenetet kapjuk, mikor megprbljuk megnyitni az adatllomnyt. Ezt gy tudjuk kivdeni, ha
letrljk. Ekkor azonban elvesztjk az imnt emltett lehetsgeket, gy inkbb jra kell gyrtanunk ezt a fjlt
(hogy hogyan, azt majd a ksbbiekben tisztzzuk).
Az elsdleges indexszel kapcsolatos informcik a .PX fjlban troldnak. A tbbi, msodlagos indexinformcik a .GX? s a .GY? fjlokban vannak (a ? helyn szm, illetve bet tallhat, attl fggen, hogy
hnyadik az index). Ha ezek kzl srl valamelyik, a 8961-es kd Corrupt table/index header (hibs
tbla/index fejlc) hibazenetet kapjuk. Ezen a problmn a tbla jraindexelsvel lehet segteni (ha nem
lltunk be indexet a tblnak, hibs index-llomnyokkal is megnyithatjuk).
Ahhoz, hogy az imnt felsorolt hibkat ki tudjuk javtani, szksgnk van a tblk definciira. Ezrt
azokat el kell trolnunk a hibajavt programban. Ezt nagyon egyszeren gy tehetjk meg, hogy ltrehozzuk a
megfelel tblkat (TTable), majd jobb egrgombbal kattintva, az Update Table Definition menpont
segtsgvel belltjuk a mezdeklarcikat (amiket a tbla a FieldDefs tulajdonsgban trol) s az
27

indexdeklarcikat (ezek az IndexDefs-ben vannak). Ha mindezt elvgeztk, a Table-k mr ismerik a tblink


struktrjt, defincijt. gy mr brmikor ltrehozhatunk egy ennek megfelel, res tblt, a CreateTable
metdus segtsgvel. Ezt a lehetsget hasznlhatjuk fel a srlt fjlok javtsra, a kvetkezkppen: ha
srltnek tallunk egy llomnyt (a .db fjl kivtelvel), letrljk, majd egy SQL lekrdezsben megnyitjuk a
tblt (a SELECT * FROM tbla.db lekrdezst hasznlva), s meghvjuk a tblhoz tartoz Table CreateTable
metdust. Ezzel ltrejtt egy j, res tbla, amelynek struktrja hibtlan, a tbla elz adatait pedig
tmenetileg a Query-ben troljuk. A kvetkez lps az adatok tmsolsa a Query-bl a Table-be. Ezt a
korbban szintn bemutatott TBatchMove segtsgvel vgezhetjk el. Ha ezek utn sem tudjuk megnyitni a
tblt, sajnos nem tudunk rajta segteni.
A tblknak vannak olyan tulajdonsgai is, amelyeket nem tudunk a TTable-ben eltrolni, s ezltal a
CreateTable metdussal ltrehozott tbla sem tartalmazza. A leggyakoribb ilyen tulajdonsg, amivel
tallkozunk, a jelsz. Ezrt ezt magunknak kell megadni, a tbla ltrehozsa utn. A dolog abbl a szempontbl
nem egyszer, hogy nincs meg a megfelel eljrs, amivel egy tblnak jelszt llthatnnk be. Nmi keresgets
utn azonban tallunk egy pldt, mghozz a Borland Database Engine Online Reference-ben (megtallhat a
Start menben is, a Delphi-n bell a Help/Borland Database Engine menben, valamit a BDE knyvtrban).
Ha ebben az llomnyban rkeresnk az AddMasterPassword szra, s a kiadott tallatot megnyitva az oldal
Example 4: Add a master password to a Paradox table alcmet visel rszbl az eljrst kimsoljuk, mris van
egy sajt jelszhozzad rutinunk (ami egybknt a DbiDoRestructure nev BDE API fggvnyt hasznlja).
Sokszor nem elg az adatokat fizikailag ellenrizni. Hibs mkds esetn ugyanis elfordulhatnak
kitltetlen mezk, amik rengeteg bosszsgot okozhatnak. rdemes teht a tblk tartalmt is ellenrizni, s
lehetsg szerint a kell helyen beavatkozni. Hogy be lehet-e avatkozni, s ha igen, milyen mdon, azt a konkrt
feladat illetve adatbzis hatrozza meg, ezrt rszletekbe nem bocstkozunk.
Egy szoftver fejlesztse sorn gondolnunk kell arra is, szksges-e naplzni a mveleteket, s ha igen,
ezt milyen mdon oldjuk meg. A naplzs azrt tlt be fontos szerepet egy szoftver mkdsben, mert
segtsgvel knnyen visszakereshetk a mveletek, s knnyebben megy a hibakeress is (fleg ha a hiba egy
egyszer felhasznl keze alatt keletkezett, aki mg a hibajelensget, illetve a hibazenetet sem tudja
felidzni). A naplzs legegyszerbb mdja, ha minden esemnyt berunk egy naplfjlba, dtummal, idvel
elltva. Hasznlhatjuk pldul a TListBox-ot, melybe a Lines.Add metdussal beszrhatunk egy sort, a
Lines.SaveToFile-lal pedig egyszeren kimenthetjk tartalmt a paramterben megadott fjlba.
A vrt adatforgalomtl fggen rnknt, esetleg naponta megnyitunk egy jabb naplfjlt, s abba
folytatjuk a naplzst. Ha a fjljainknak txt kiterjesztst adunk, a Jegyzettmbbel knnyen megjelenthetek
lesznek. gyelnnk kell azonban arra, hogy az elavult naplfjlokat nha trlni kell, mert az egy knyvtrban
trolhat fjlok szma a legtbb Windows-os rendszerben vges (brmilyen kicsik is ezek a fjlok).
A biztonsg krdse nagyon fontos egy programnl, fleg ha azt valaki zemszeren hasznlja, s
fontos adatokat trol s kezel segtsgvel. A biztonsgi intzkedsek hossztvon jelentenek elnyt, s bevltjk
a hozzjuk fztt remnyeket. Ezen vdelmi mechanizmusok ellenre azonban nem engedhetjk meg
magunknak azt a luxust, hogy kevsb trdjnk a rendszernk egyb rszeinek helyes, biztonsgos
mkdsvel, hiszen ezeket a biztonsgi intzkedseket a program ltal okozott hibknl nem igazn tudjuk
kihasznlni.

Telept ksztse
Ha egy ltalunk ksztett programot felhasznls cljbl ms kezbe adjuk, gondoskodnunk kell egy
teleptprogramrl. Ez fleg igaz azokra a programokra, amelyek hasznljk a Borland Database Engine-t,
mivel azt a szmtgpekre kln telepteni kell (persze ezt megtehetjk a Delphi telept CD-jrl is, de az nem
az igazi). A Delphi programcsomag tartalmaz egy InstallShield Express nev programot, amellyel knnyen s
gyorsan kszthetnk komplett teleptkszletet. Elnye a tbbi, Interneten fellelhet ingyenes vagy olcsbb
telept-ksztkkel szemben, hogy kifejezetten Delphi-hez kszlt, gy tmogatja a BDE-t. A program nem
tartozik kzvetlenl a Delphi-hez, a Delphi telept CD-jrl, mint nll programot tehetjk fl
szmtgpnkre.
A programban, ha j teleptt ksztnk, elszr meg kell adnunk annak nevt s helyt. Ha testre
szabhat teleptt (Custom Setup) szeretnnk kszteni, jelljk be az Include a custom setup type
jellngyzetet. A Create gomb megnyomsa utn megjelen Setup Checklist-ben klnbz opcikat tallunk.
Ezeken egyenknt vgig kell mennnk. A teljessg ignye nlkl most vgignzzk a lehetsgeket.
Set the Visual Design
Az App Info lapon a program ltalnos jellemzit adhatjuk meg. Itt kell kivlasztanunk, melyik fjl a
programunk futtathat llomnya (Application Executable). A Main Widow-ban a telept httert, a Featuresben pedig az automatikus Uninstall-t kapcsolhatjuk be.
Specify InstallShield Objects for Delphi
Ebben a csoportban llthatjuk be, milyen Delphi komponenseket teleptsen az ltalunk ksztett
telept. Szmunkra a BDE a legfontosabb. Ezt meg is talljuk a General fln bell. Kivlasztva egy bellt
varzsl jelenik meg. Els lpsben a teleptend BDE komponenseket adhatjuk meg. Ha Full BDE Installationt vlasztunk, a teljes BDE belekerl a kszletbe, de a Partial-lal mi adhatjuk meg ezeket a rszeket. Ha Paradox
28

rendszerben dolgozunk, elg a Paradox Driver-t bejellni. Ha hasznlunk valami mst is (pl. SQL-t),
rtelemszeren azt is be kell jellnnk. A kvetkez lapon alias-okat hozhatunk ltre. Itt clszer megadni a
program ltal hasznlt alias-okat. Ezeknek a tulajdonsgait kettvel arrbb be is llthatjuk. rdemes mg a
komponensek kzl kivlasztani a BDE Control Panel File-t, melynek segtsgvel a Vezrlpultbl is elrhet
a BDE Administrator program.
Specify Components and Files
A teleptben a fjlokat csoportostjuk. Vannak programfjlok, adatbzisfjlok, sgfjlok, stb.,
melyeket ilyen mdon csoportba szerveznk, gy teleptskor knnyen kivlaszthatak a szksges rszek. A
Groups lapon ltre kell hoznunk a hasznlni kvnt csoportokat, s azokhoz hozzadni a megfelel fjlokat. A
Components-ben megadhatjuk, hogy ezek a csoportok milyen komponenseken bell legyenek, a Setup Types-ban
pedig azt, hogy mely teleptsi tpus (Egyni Custom, Tipikus Typical, Minimlis Compact) hogyan
tartalmazza ezeket a komponenseket.
Select User Interface Components
A teleptnek megmondhatjuk, hogy milyen dialgus-ablakok jelenjenek meg a telepts folyamn. Itt
helyezhetjk el a felhasznli licenszszerzdst (Software Licence Agreement), valamint az olvass el
dokumentumot (Readme Information), stb.
Specify Folders and Icons
Itt parancsikonokat hozhatunk ltre a programunk klnbz fjljairl, amit a telept a megadott helyre
ltrehoz majd.
Ha mindent belltottunk, a Disk Builder segtsgvel ltrehozhatjuk a teleptt. Ha ksz, nincs ms
htra, mint lemezre msolni.

Az InstallShield

29

Ksztsnk CD-t!
Manapsg egy teleptt CD-n illik kiadni. Emellett egyre nagyobb teret hdt az automatikus CD,
amelyet a meghajtba helyezve elindul egy hjprogram, amivel elindthatjuk a CD-n lv teleptket. Ilyet
termszetesen mi is kszthetnk. Egy megfelel telept-indt hjprogram megrsa nem jelenthet gondot.
Nhny felirat s gomb. De hogyan futtatunk programot? Sajnos a Delphi-ben nincs egyszer programfuttat
rutin, ellenben a Delphi Demos\Doc\Filemanex knyvtrban tallhat egy fmxutils.pas nev unit, melyet a Bin
knyvtrba msolva, a programunk uses-listjba rva hasznlatba is vehetnk. Ebben tallunk egy ExecuteFile
fggvnyt, amellyel mr knnyedn futtathatunk brmit (egybknt hasznlhatnnk a ShellExecute API
fggvnyt is, de ez egyszerbb). Egy dologra viszont nagyon oda kell figyelni: ha automatikusan indul a CD-n
lv hjprogram, nem biztos, hogy a Windows a CD gykrknyvtrbl futtatja. Ezrt a futtatni kvnt telept
fjlnevt clszer a hjprogram fjlnevbl kiszmtani. Kivl eszkz erre a nulladik paramter (ParamStr(0)).
Ez ugyanis mindig a teljes fjlnv. Ebbl az ExtractFilePath fggvnnyel kivesszk a knyvtrnevet, gy
megkapjuk a hjprogram knyvrt (a hjprogramot a CD gykrknyvtrban rdemes elhelyezni). Ebbl mr
knnyen megvan a futtatni kvnt telept teljes fjlneve.
ExecuteFile(ExtractFilePath(ParamStr(0))+ 'Telept\Setup.exe',
'', ExtractFilePath(ParamStr(0)),0);
gy ez a kvetkez fjlt futtatja (ha a program helye D:\): D:\Telept\Setup.exe.
Most mr csak azt kell megoldani, hogy a hjprogramunk automatikusan induljon. A CD
gykrknyvtrban ltre kell hozni egy autorun.inf nev llomnyt, amelynek a kvetkez sorokat kell
tartalmaznia:
[autorun]
OPEN=Program.exe
Ha pedig ikont is szeretnnk (amit szintn a CD gykerben helyezhetnk el):
ICON=Ikon.ico
vagy hasznlhatjuk a programunk ikonjt is:
ICON=Program.exe,0
A lertak alapjn mr brki elkezdhet teleptt kszteni. Egy j tancs azonban elkl: Mindig prbld ki
a teleptt, mieltt kiadod a kezedbl!

VI.

Lezrs

Az adatbzis-kezel alkalmazsok fejlesztsnek rgs tjn knny elbukni. Az ember mindig a sajt
tapasztalataibl (s fleg krbl) tanul a legjobban. Nincs olyan knyv vagy kiadvny, ami minden specilis
problmval foglalkozna. Korunkban viszont egyre inkbb a specilis, lokalizlt, a felhasznl ignyeire szabott
rendszerekre van szksg. Az ltalnos szoftverek ideje lejrt. Azokat mr megrtk msok (tbbek is). A mai
programozknak kt lehetsgk van: vagy beolvadnak egy szoftvercgbe, s ott fejlesztik sokadmagukkal a
klnbz ltalnosabbnak mondhat alkalmazsokat, vagy egyni vllalkozsba fognak, s specilis, egyedi
problmk megoldsra szakosodnak.
Zrsknt nem ll szndkomban okoskodni, s elmondani, mirt j ez a dolgozat s milyen
tanulsgai vannak. Ezt az Olvasra bzom. n csupn azt remlem, sikerlt tadnom azt, amit szerettem volna.
Remlem dolgozatom elrte cljt, s a Kedves Olvas tallt benne olyat, ami a hasznra vlt.
Ksznm.

30

Irodalomjegyzk
1.
2.
3.
4.
5.
6.
7.

Borland Delphi 5.0 Online Help (belertve a BDE Help-et s a Win32 Programmers Reference-et is)
Szelezsn Jnos: Adatbzisok, LSI Oktatkzpont, Budapest
Halassy Bla: Az adatbzistervezs alapjai s titkai, IDG Magyarorszgi Lapkiad Kft., Budapest, 1994
Thomas Binzinger: Delphi, Kossuth Kiad, 1998
Dr. Szab Lszl: A Delphi 2.0-rl rviden, oktatsi segdlet, Miskolc, 2000
Marco Cant: Delphi 3 mesteri szinten, I-II. ktet, Kiskapu Kiad, Budapest, 1998
Gray Cornell: Delphi tippek s trkkk, Panem Kft., Budapest, 1997

Ajnlott Internet-cmek:
- Delphi Software Online: www.animare.hu/dso
- Magyar Delphi levelezlista: www.szechenyi-nkzsa.sulinet.hu/delphi
- Borland Magyarorszg: www.borland.hu
- Borland Home Page: www.borland.com
- Deplhi HomePage: www.borland.com/delphi/index.html
- Deplhi Developer Support: www.borland.com/devsupport/delphi/

31

You might also like