molnár roland - adatbázis-kezelő rendszerek fejlesztése delphi nyelven (2002, 32 oldal)

32
Molnár Roland Adatbázis-kezel ő rendszerek fejlesztése Delphi nyelven Bevezetés a Delphi-s adatbázis-kezelés rejtelmeibe

Upload: kovacslaszlo

Post on 10-Jan-2016

17 views

Category:

Documents


1 download

DESCRIPTION

Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

TRANSCRIPT

Page 1: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 1/32

Molnár Roland

Adatbázis-kezelő rendszerek fejlesztése Delphinyelven

Bevezetés a Delphi-s adatbázis-kezelés rejtelmeibe

Page 2: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 2/32

1

Tartalomjegyzék

Bevezetés.....................................................................................................................................3A munkához kapcsolódó gyakorlati feladatok .................................................... ................3

I.Az adatbázisokról......................................................................................................................4

Alapfogalmak, elvek ........................................................ ................................................... 4Adatbázis ............................................................... ..................................................... 4Adatbázis-kezel

ő 

  rendszer..........................................................................................4Adatmodellek alapelemei ...........................................................................................4

Az egyed..........................................................................................................4A rekordtípus...................................................................................................4A tulajdonság...................................................................................................4A kulcs.............................................................................................................4A kapcsolat......................................................................................................5

Adatmodell .................................................................................................................5A normálformák .........................................................................................................5

Első 

  normálforma (1NF) ............................................................ .....................5Második normálforma (2NF)...........................................................................5

Harmadik normálforma (3NF).........................................................................6Magasabb normálformák.................................................................................7

A lookup ................................................ ......................................................... ............7Törzsadattábla.............................................................................................................7SQL.............................................................................................................................7

Adatbázis-tervezés ..............................................................................................................7II.A Delphi adatbázis-kezel

ő 

  rendszere.......................................................................................8Alapok, BDE.......................................................................................................................8

Alias létrehozása, szerkesztése ............................................................................. ......9Tábla létrehozása, szerkesztése...................................................................................9SQL lekérdezés készítése .........................................................................................10

Komponensek....................................................................................................................10III.A Delphi adatbázis-kezel

ő 

  komponensei..............................................................................10

TDataSet, mindennek az alapja.........................................................................................10Data Access komponensek................................................................................................10

TDataSource.............................................................................................10

TTable ............................................................ ..........................................10

TQuery ................................................. .................................................... 11

TUpdateSQL ......................................................... ...................................12

TBatchMove.............................................................................................12Data Controls komponensek ..................................................... ........................................12

TDBGrid ..................................................................................................12

TDBNavigator..........................................................................................13

TDBText ..................................................................................................13

TDBEdit...................................................................................................13

TDBMemo ...............................................................................................13

TDBImage................................................................................................13

TDBListBox.............................................................................................13

TDBComboBox .......................................................................................13

Page 3: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 3/32

2

TDBCheckBox.........................................................................................13

TDBRadioGroup .................................................... ..................................13

TDBLookupListBox.................................................................................13

TDBLookupComboBox...........................................................................14TDBRichEdit............................................................................................14

TDBCtrlGrid ......................................................... ...................................14

TDBChart.................................................................................................14Nyelvi problémák..............................................................................................................14TDataModule ..................................................... ............................................................. ..14

IV.Egy adatbázis-kezelő 

  alkalmazás elkészítése ............................................................. ..........15Tervezés .................................................... ............................................................. ...........15A DataModule...................................................................................................................15Az ablakok .......................................................... ............................................................. .16

Ablaktípusok.............................................................................................................17A f ő 

  képernyő 

  ............................................................................................................18Táblamegjelenít

ő 

  ablakok.........................................................................................18Adatlapok..................................................................................................................20M

ű 

  veletvégző 

  ablakok..............................................................................................21Kimutatások..............................................................................................................22Folyamatkijelz

ő 

  k (ProgressBar -ok).........................................................................23Nyomtatás, riport......................................................................................................23Project.......................................................................................................................24

V.Egyéb problémák...................................................................................................................25Hibakezelés ................................................................. ...................................................... 25Hálózat használata Paradox rendszerrel............................................................................26Biztonsági problémák........................................................................................................27

Biztonsági mentés.....................................................................................................27Adatsérülések kezelése ................................................................. ............................27Telepít

ő 

  készítése..............................................................................................................28Készítsünk CD-t! ........................................................ .............................................. 30

VI.Lezárás .................................................................................................................................30Irodalomjegyzék........................................................................................................................31

Page 4: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 4/32

3

Bevezetés

A Borland Delphi napjaink egyik legfejlettebb alkalmazás-fejlesztő 

  rendszere. Első 

  sorban adatbázis-rendszerek készítésére szánják, de gyakorlatilag bármilyen szoftvert el lehet készíteni vele. Mivel mindig isérdekelt a programozás és a modern technológia, autodidakta módon foglalkozni kezdtem vele (a f 

ő 

  iskolaitanórákon az 1992-es dátumú  Turbo Pascal 7.0   volt a „legújabb” fejleszt

ő 

  környezet, amellyel találkoztam).Kés

ő 

 bb már komolyabb alkalmazásokat is fejlesztettem Delphi-vel, így a számítástechnikának ez a területe lettaz, amivel a legtöbbet foglalkoztam. Rengeteg tapasztalatot gy

ű 

  jtöttem, amelyet mindig is szerettem volnamegosztani olyanokkal, akiknek szükségük van rá. Ezért választottam ezt a témát dolgozati témának. Én személyszerint a Delphi-vel való ismerkedésem idején szívesen forgattam volna egy ilyen munkát, elkerülve ezzelrengeteg bosszúságot és kísérletezést. Ezt a témát választva remélem, hogy ez a munka másokhoz is eljut, és

segítő 

  kezet nyújt mindazoknak, akik közelebbrő 

  l is meg szeretnének ismerkedni a Delphi-vel.Ez a dolgozat azoknak szól, akik most ismerkednek a Borland Delphi fejlesztő 

  eszközzel, és szeretnékmegtenni az els

ő 

  lépéseket az adatbázis-kezelő 

  rendszerek fejlesztése felé. Ez a dolgozat egy rövid, de lényegretör

ő 

  kalauz, mely végigvezet a kezdetektő 

 l egészen a telepítő 

  készítéséig minden nagyobb állomáson, amelyenegy adatbázis-kezel

ő 

  szoftver fejlesztése során át kell haladni. Célja nem az, hogy megmutassa, hogyan  kellfejleszteni, hanem az, hogy megmutassa,  hogyan lehet elkezdeni. „Minden kezdet nehéz” – hangzik a kopottmondás. Ezen a nehéz kezdeten igyekszik átsegíteni olvasóját. Végigolvasva, követve a tanácsokat már bátranhozzákezdhet a Kedves Olvasó a fejlesztéshez. Ne várjon azonban teljes kör

ű 

  leírást vagy magyarázatot, hiszenmindenr

ő 

 l részletes információ található a Delphi súgójában ( Help), és én nem azt kívántam magyarítani. Sokkalinkább egy átfogó segítséget szeretnék nyújtani, mindenhol utalva a  Delphi Help-re.

Ahhoz, hogy e munka tanulmányozása eredményes legyen, a következő 

  dolgok szükségesek:- Id

ő 

  , hiszen ez nem megy egyik pillanatról a másikra.- Kísérletez

ő 

  kedv, mert programozni tanulni csak úgy lehet, ha kísérletezgetünk.

- Angoltudás, mivel a Delphi és a hozzá tartozó súgó angol nyelvű 

 , így a helyes használat érdekében legalábbminimális angoltudással és egy jó szótárral kell rendelkezni.- Számítógép és egy telepített Delphi 3, 4 vagy 5

A dolgozat írásakor Delphi 5-öt használtam, így elő 

 fordulhat, hogy a többi verzióban egy-két dologmáshogy és máshol van, de a lényeg mindegyiknél megegyezik.

A dolgozat felépítését tekintve az elmélettő 

  l halad a gyakorlat felé. Elő 

  ször adatbázis-kezelésialapfogalmakat ismertet, majd a Borland adatbázis-kezelésének elvi m

ű 

 ködését magyarázza, azután pedig rátéraz adatbázis-kezel

ő 

  rendszerek fejlesztésének lépéseire. Végül különböző 

  gyakorlati problémák megoldásáranyújt hasznos tanácsokat.

A dolgozatban sokat fogok hivatkozni a Delphi súgójára, a következő 

 képpen: ( Delphi Help: Témakör).Az itt megadott témakört beírva a   Tárgymutató  ablak keres

ő 

  sorába, megtaláljuk az oda vonatkozó bő 

  vebbleírást. Az irodalomjegyzékben szerepl

ő 

  irodalmakra a következő 

  képpen utalok: [jegyzékszám/oldalszám] (pl.:

[2/213] = Szelezsán János Adatbázisok  c. könyvének 213. oldala).

A munkához kapcsolódó gyakorlati feladatok 

Jelen munka készítése elő 

  tt már volt szerencsém adatbázis-kezelő 

  alkalmazásokat fejleszteni, így kellő 

tapasztalatot szereztem a Delphi-s Paradox rendszerek mű 

  ködtetésérő 

 l, programozásáról. A dolgozatomban ezenmunkákról készült képerny

ő 

 képek (és egy-két helyen ezekbő 

 l kimásolt kódrészletek) találhatóak. Ezek a munkákazonban nem kapcsolódnak konkrétan a dolgozat tárgyához, hiszen általánosságban beszélek a feladatokról.Nem láttam tehát sok értelmét annak, hogy ezekkel b

ő 

  vebben foglalkozzak. A pontosság kedvéért azértszeretném közölni, milyen munkák ezek.

Az egyik feladat egy helyi rádió reklámadminisztrációjának számítógépesítése volt. Az adatbázisrendkívül egyszer

ű 

  , mindössze három f ő 

 - és négy altáblából áll. A három f ő 

  tábla közül az egyik a reklámokadatait tárolja (felvétel id

ő 

  pontja, hirdető 

  partner, hirdetésszervező 

  , futás kezdete, vége, darabszám, fizetés

dátuma, módja, a reklám szövege, típusa, stb.). A második táblában a hirdető 

  partnerek, a harmadikban ahirdetésszervező 

 k adatai vannak (név, cím, telefonszám, stb.). A négy altábla közül egy a reklámtípusokat, egy afizetésmódokat, egy a felhasználókat, egy pedig a felhasználói típusokat tárolja. A táblák között egyszer

ű 

  1:Nrelációk vannak.

Page 5: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 5/32

4

A másik feladat ennél lényegesen bonyolultabb: egy étterem rendelés-, számla-, és raktárnyilvántartásátkellett megoldani. A rendszer két részb

ő 

 l áll: az éttermi program a rendelésekkel és a számlákkal foglalkozik, araktár program pedig a raktárkészlettel, és az éttermi program által regisztrált rendelések alapján (a sajátösszetev

ő 

 -adatbázist használva) a raktári tételek mennyiségének automatikus aktualizálásával. A rendszer kétadatbázist (étterem és raktár), és összesen 29 Paradox táblát tartalmaz. Az éttermi program az általa tárolthatalmas adatmennyiség (rendelések és számlák) ellenére megfelel

ő 

  sebességgel dolgozza fel az adatokat,köszönhet

ő 

 en annak, hogy a rendelések és számlák adatait két-két táblában is tárolja. Egyikben az aktuálisakat, amásikban a régebbieket, melyekkel a program csak zárás esetén foglalkozik. Érdekes feladat volt még aszámlanyomtatók kezelése, melyet úgy oldottam meg, hogy meghajtóprogram (driver ) nélkül m

ű 

  ködjön.Mindkét szoftver lehet

ő 

 vé teszi a hálózati használatot, mely igazán az étterem programnál volt nagykihívás, hiszen nagyobb forgalom idején egyszerre több számítógépen veszik föl a rendeléseket és adják ki aszámlákat, így rendkívül s

ű 

  rű 

  és nagy az adatmozgás.Az említett munkák készítése alatt szerzett tapasztalataim próbálom átadni ezen dolgozat keretein belül.

I. Az adatbázisokról

Alapfogalmak, elvek 

Ebben a részben az adatbázisokkal kapcsolatos általános fogalmakkal ismerkedünk meg.

AdatbázisAmikor az ember adatbázis-kezel

ő 

  szoftverrel dolgozik, hajlamos azt hinni, hogy minden, amit azzalvégez, az adatbázis és adatbázis-kezelés. Ez azért van, mert nagyon sokan nincsenek tisztában az adatbázisfogalmával. Néhány adatfájl még önmagában nem adatbázis, csupán adattáblák halmaza. Ahhoz, hogyadatbázissá váljon, a táblák közötti kapcsolatokat is definiálni kell.

Gondoljunk például arra, hogy van két táblánk, az egyikben nevek, a másikban címek. Mindkettő 

  nekvan egy kód nev

ű 

  mező 

 je is. Ez a leírás önmagában még nem egy adatbázist határoz meg, csupán két, egymástólfüggetlen adattáblát írtunk le. A dolog akkor válik adatbázissá, ha kikötjük a következ

ő 

 t: a neveket és a címeket

tartalmazó táblában lév ő    kód összekapcsolja a két táblát úgy, hogy egy, a neveket tároló táblában lév ő    névhez azazonos kódú, a címeket tároló táblában lév

ő 

  cím tartozik. Ezzel definiáltuk az adatkapcsolatot.Az adatbázison tehát voltaképpen adatoknak kapcsolataikkal együtt való ábrázolását, tárolását

értjük. [2/13]

Adatbázis-kezelő rendszerAz adatbázis önmagában semmit nem ér. A felhasználó számára akkor válik értékké, ha megadunk

hozzá egy olyan szoftvert, amellyel az adatbázist kezelni tudja. Az ilyen szoftvert adatbázis-kezelő 

  rendszerneknevezzük. Az adatbázis-kezel

ő 

  rendszereknek két f ő 

  funkciója van: az adatdefiníció (az adatbázis szerkezeténekdefiniálása, a szerkezet feltöltése konkrét adatokkal, illetve ezek módosítása, törlése), valamint a  lekérdezés(adatok visszakeresése, kimutatások készítése). [2/21]

Adatmodellek alapelemeiAz egyed

„Egyednek hívunk minden olyan dolgot (objektumot), ami minden más dologtól (objektumtól)megkülönböztethet

ő 

 , és amirő 

 l adatokat tárolunk.” [2/33]

A rekordtípus„Az adatbázis-kezel

ő 

  rendszerekben (…) az egyedtípust rekordtípusnak hívjuk. Ez a legkisebbcímezhet

ő 

  egység (ennél kisebb részeire nem lehet hivatkozni az adatbázisnak).” [2/34]

A tulajdonság„Az egyedeket tulajdonságokkal (attribútumokkal) írjuk le. A tulajdonság az egyed egy jellemz

ő 

  je, amimegadja, meghatározza az egyed egy részletét.” [2/35] A tulajdonság és az attribútum azonos jelentés

ű 

fogalmak, és a továbbiakban felváltva használjukő 

  ket.

A kulcs

Page 6: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 6/32

5

„Amennyiben egy tulajdonság vagy tulajdonságok egy csoportja egyértelmű 

 en meghatározza, hogy egyegyed melyik értékér

ő 

  l, elő 

 fordulásáról van szó (vagyis az egyedhalmaz melyik elemérő 

  l), akkor ezeketa tulajdonságokat együtt kulcsnak nevezzük” [2/36]

A kapcsolat„Kapcsolatnak nevezzük az egyedek közötti viszonyt.” [2/38] A kapcsolat fajtái:Egy-egy típusú kapcsolat (1:1 kapcsolat): olyan kapcsolat, ahol „az egyik egyedhalmaz mindegyikeleméhez a másik egyedhalmaznak pontosan egy eleme kapcsolódik (tehát a két egyedhalmaz

egymásba kölcsönösen egyértelmű   en képezhet ő    le).” [2/40]Egy-több típusú kapcsolat (1:N kapcsolat): „Azt mondjuk, hogy az A egyed és a B egyed között egy-több (1:N) kapcsolat van, ha az A egyedhalmaz mindegyik eleméhez a B egyedhalmaz több eleme istartozhat.” [2/40]Több-több típusú kapcsolat (N:M kapcsolat):   „Több-több (jelben N:M) típusú kapcsolatnaknevezzük az A egyed és a B egyed közötti kapcsolatot, ha az A egyedhalmaz minden eleméhez a Begyedhalmaz több eleme tartozhat, és fordítva egy B-beli elemhez is több A-beli elemet rendelhetünkhozzá.”[2/41]

AdatmodellEzek után már definiálhatjuk, mi is az adatmodell: „Az adatmodell egyedek, tulajdonságok és

kapcsolatok halmaza, amely absztrakt módon tükrözi a valós objektumoknak, azok jellemző 

  inek

(tulajdonságainak) és viszonyainak (kapcsolatainak) elvont kategóriáit.” [2/48]

A normálformákAz adatbázisok bels

ő 

  szerkezetét ún. normálformák jellemzik. Ha egy adatbázis eleget tesz bizonyosfeltételeknek, akkor azt mondjuk, hogy egy adott normálformában van.

Első    normálforma (1NF)„Egy R relációról azt mondjuk, hogy els

ő 

  normálformában van, ha minden sorában pontosan egyattribútumérték áll.” [2/87]Ez els

ő 

  hallásra lehet, hogy bonyolultnak hangzik, annál is inkább, hogy az adatbázis-kezelő 

  k csakolyan adatbázist fogadnak el, amely 1NF-ben van.Egy példával lehet a legjobban érzékeltetni, mit is jelent ez valójában:

NÉV SZAKKÉPZETTSÉGNagy Géza gépészmérnök, közgazdász, mű 

  szerészKiss János lakatosBíró Ödön fodrász, lakatos

A fenti táblázat nincs 1NF-ben, mert a SZAKKÉPZETTSÉG mező 

  ben néhol több érték is szerepelhet.Ezt úgy is lehetne ábrázolni, hogy minden egyes szakképzettséget külön sorba teszünk:

NÉV SZAKKÉPZETTSÉGNagy Géza gépészmérnök

közgazdászm

ű 

  szerészKiss János lakatosBíró Ödön fodrász

lakatos

Amennyiben ezt első 

  normálformára szeretnénk hozni, a legegyszerű 

  bb, ha a több attribútumértékettartalmazó sort annyi sorra bontjuk, amennyi az attribútumértékek száma:

NÉV SZAKKÉPZETTSÉGNagy Géza gépészmérnökNagy Géza közgazdászNagy Géza mű    szerészKiss János lakatosBíró Ödön fodrászBíró Ödön lakatos

Így a táblázat már 1NF-ben van.

Második normálforma (2NF)

Page 7: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 7/32

6

Egy reláció akkor van második normálformában, ha első 

  normálformában van, és minden nem-kulcstulajdonsága teljesen függ a kulcstól. [2/93]Nézzük pl. a következ

ő 

  , az elő 

  ző 

  nél kissé bonyolultabb, 1NF-ben lévő 

  táblát, ahol számlák adataittároljuk. A SZSZ  a számlaszám, a TKOD a tételkód, a TNÉV  a tételnév, az EÁR az egységár rövidítése.

ELADÁSSZSZ    DÁTUM VEV Ő    VEV Ő    CÍM   TKOD   TNÉV DB EÁR ÁR234 2000.02.11. XYZ Kft Bp. Nagy út 10. 142 Kifli 5 20 100234 2000.02.11. XYZ Kft Bp. Nagy út 10. 264 Tej 3 40 120235 2000.02.20. UVT Kft Ózd, Híd út 3. 245 Kakaó 6 10 60235 2000.02.20. UVT Kft Ózd, Híd út 3. 142 Kifli 4 20 80

A kulcsot a számlaszám (SZSZ ) és a tételkód (TKOD) alkotják, hiszen ketten együtt egyértelmű 

  enmeghatároznak egy rekordot (ezeket d

ő 

  lt betű 

  vel jelöljük). A táblázat nincs 2NF-ben, mert vannakbenne olyan másodlagos attribútumok, amelyek nem az egész kulcstól, csak az azt alkotó egyesattribútumoktól függnek.A DÁTUM függ az  SZSZ -t

ő 

 l, mert egy számlához egyazon dátum tartozik. Ez igaz a  VEV Ő 

  -re, és aVEV 

Ő 

  CÍM -re is. Hasonlóképpen belátható, hogy a  TKOD   is rendelkezik azzal a tulajdonsággal, hogytöbb másodlagos attribútumot egyedül is meghatároz (TNÉV , EÁR).A 2NF-re hozás egyszer

ű 

  mű 

 velet: a relációt több, 2NF-ben lévő 

  táblázatra bontjuk. A mi esetünkben ezkét táblát (ELADÁS1   és   TÉTELEK ) fog eredményezni, és azoknak a kulcsai az   ELADÁS   táblánkkulcsának két attribútuma lesz:

ELADÁS1SZSZ    DÁTUM VEV Ő    VEV Ő    CÍM TKOD DB ÁR234 2000.02.11. XYZ Kft Bp. Nagy út 10. 142 5 100234 2000.02.11. XYZ Kft Bp. Nagy út 10. 264 3 120235 2000.02.20. UVT Kft Ózd, Híd út 3. 245 6 60235 2000.02.20. UVT Kft Ózd, Híd út 3. 142 4 80

TÉTELEKTKOD   TNÉV EÁR142 Kifli 20264 Tej 40

245 Kakaó 10

A két tábla közötti kapcsolatot a TKOD valósítja meg. Ezzel a relációt második normálformára hoztuk.

Harmadik normálforma (3NF)Egy reláció harmadik normálformában van, ha második normálformában van és egyetlen másodlagosattribútuma sem függ tranzitívan a kulcstól. [2/100]Egy C tulajdonság akkor függ tranzitívan az A kulcstól, ha meghatározza a kulcstól szintén függ

ő 

  Btulajdonság is. [3/224]Vegyük alapul az el

ő 

  bbi ELADÁS1, 2NF-ben lévő 

  táblát. A SZSZ  meghatározza a VEV Ő 

  attribútumot,az pedig meghatározza a   VEV 

Ő 

  CÍM -et. Ez azt jelenti, hogy a   VEV Ő 

  CÍM   tranzitívan függ a   SZSZ kulcstól, mivel azt meghatározza a nem kulcs VEV 

Ő 

  tulajdonság is. A tábla tehát nincs 3NF-ben.Ahhoz, hogy 3NF-ben legyen, ugyanazt a m

ű 

 veletet kell elvégezni, mit az imént: föl kell bontanunk a

táblát. Itt azonban fel kell ismerni egy másodlagos kulcsot is:  VEV Ő 

  . Ez lesz a két új tábla közöttikapcsolat.

ELADÁS2SZSZ    DÁTUM VEV

Ő 

  TKOD DB ÁR234 2000.02.11. XYZ Kft 142 5 100234 2000.02.11. XYZ Kft 264 3 120235 2000.02.20. UVT Kft 245 6 60235 2000.02.20. UVT Kft 142 4 80

VEVŐ 

  KVEV Ő    VEVŐ    CÍMXYZ Kft Bp. Nagy út 10.UVT Kft Ózd, Híd út 3.

Page 8: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 8/32

7

Így kiküszöböltük a tranzitív függő 

  sséget, a reláció 3NF-ben van. Természetesen a modellhez tartozikmég a TÉTELEK  tábla is, de azt az el

ő 

  ző 

  példához képest változatlanul hagyjuk, hiszen az megfelel a3NF feltételeinek is.

Magasabb normálformákA harmadik normálforma a minimum, amit egy adatbázis tervezésnél be kell tartani. Ne gondoljuktehát, hogy ez a normalizálás csúcsa. Léteznek magasabb szint

ű 

  normálformák is (BCNF, 4. és 5. NF),ezek tárgyalása azonban kimerítené ezen dolgozat kereteit, ezért nem foglalkozunk velük.

A lookupEzzel a szóval sokat fogunk még találkozni a dolgozat folyamán. Angolul  keresést , utánanézést  jelent.Az adatbázis-kezel

ő 

 kben a táblák közötti kapcsolat megvalósítására használják. Segítségével az iméntipéldáinkban szerepl

ő 

  ELADÁS1   és   TÉTELEK   táblát összekapcsolhatjuk úgy, hogy a megjelenítettvégeredmény egy   ELADÁS -hoz hasonló táblázat lesz, ahol a   TNÉV   és az   EÁR   ún.   lookup   mez

ő 

  k,amelyek valójában nincsenek a táblázatban, csupán az adatbázis-kezel

ő 

  helyezi odaő 

  ket, az általunkdefiniált kapcsolat alapján. Ez a kapcsolat a következ

ő 

  képpen néz ki:   ELADÁS1.TKOD   <==>TÉTELEK.TKÓD. Így a program a   TKÓD   alapján a   TÉTELEK   táblából gyakorlatilag „behúzza” azadatokat az ELADÁS1 táblába.Ezzel azonban korántsem merülnek ki a  lookup által nyújtott lehet

ő 

 ségek. Táblázatunkban ugyanis nemmuszáj megjeleníteni a   TKÓD  mez

ő 

  t, így a felhasználó azt látja, hogy ha felvesz egy új számlát, a

VEV Ő 

  mező 

 nek ad értéket, holott valójában a  TKÓD-ot manipulálja. Ezt azonban a rendszer ügyesenelrejti elő 

  le.Hasonlóképpen állíthatunk lookup kapcsolatot az ELADÁS2 és a VEV 

Ő 

  K  táblázatok között is, a VEV Ő 

mező 

  alapján.Így az ELADÁS2, a VEV 

Ő 

  K  és a  TÉTELEK  (3NF-ben lévő 

 ) táblák használatával megjeleníthetjük úgyaz adatbázist, hogy az   ELADÁS   (csupán 1NF-ben lév

ő 

  ) táblát lássuk. Így nem veszítjük el anormalizálás által biztosított el

ő 

 nyöket, a felhasználó viszont egy helyen lát mindent, így neki nem kelltudnia, mi is az a normalizálás.

TörzsadattáblaA normalizálás folyamán keletkeznek olyan táblák, amelyek a többihez képest viszonylag állandónak

mondhatók (példánkban ilyen a TÉTELEK , ill. a VEV Ő 

  K  tábla). Ezeket a táblák mindig valamilyen f ő 

 bb táblávalvannak kapcsolatban (itt:   ELADÁS1, ill.   ELADÁS2). Az ilyen táblákat törzsadattábláknak nevezzük. Atörzsadattáblák (értelemszerű    en) törzsadatokat tartalmaznak. A törzsadatok manipulációját általában a programkarbantartó egységében vagy automatikusan szokták megoldani.

SQLAz SQL (Structured Query Language = Strukturált lekérdez

ő 

  nyelv) egy szabványosított (ISO 9075)adatbázis-kezel

ő 

  nyelv. Alapvető 

  en két része van: adatdefiníciós nyelv (DDL, Data Definition Language) ésadatmanipuláló nyelv (DML, Data Manipulation Language). A DDL segítségével táblákat hozhatunk létre,törölhetünk, stb., míg a DML-lel beszúrhatunk, szerkeszthetünk, törölhetünk, illetve lekérdezhetünk adatokat egyvagy több táblából.

A Delphi természetesen támogatja az SQL-t. Komponensein keresztül könnyen építhetünk bealkalmazásunkba SQL-utasításokat. Mivel ebben a munkában a Paradox rendszerekr

ő 

  l van első 

  sorban szó, azSQL-t b

ő 

 vebben nem tárgyaljuk.

Adatbázis-tervezés 

Az elő 

  ző 

  részben megtudhattuk, hogyan kell az adatbázist egyszerű 

 síteni, normalizálni. A szabály tehátaz, hogy úgy kell megtervezni az adatbázist, hogy az legalább a harmadik normálforma követelményeinek elegettegyen. A gyakorlatban azonban ez nem mindig m

ű 

  ködik.Az általam készített éttermi alkalmazásban található például olyan eset, amikor a rendelés fejlécét és a

törzsét tartalmazó táblákban egyaránt szerepel az asztal kódja, holott elég lenne csupán a fejlécben tárolni, hiszenegy rendelés tételeihez csupán egy asztalkód tartozhat. Azért volt szükség ennek ellenére erre a megoldásra, merta számlázásnál asztalok szerint kell sz

ű 

 rni (mindig csak egy asztalhoz tartozó rendeléseket kell megjeleníteni), és jelent

ő 

  sen felgyorsította a mű 

 ködést az eredeti tervben nem szereplő 

  asztalkód mező 

  a rendelések törzsét tárolótáblában. A másik eset, amikor hasonló problémával találkoztam, a számlák rész- és végösszegének tárolása volt.Kénytelen voltam ugyanis eltárolni a bruttó árát is a számla tételeinek, illetve a számla bruttó végösszegét, pedig

ezeket egyértelmű   en meg lehet határozni, mivel az adatbázis tartalmazza a tételek nettó árait és ÁFA-kulcsait, dekiszámításuk jelent

ő 

 sen lassította volna a mű 

  ködést. Mondhatnánk azt is, hogy a nettó árat sem kellene tárolni,hiszen azt is egyértelm

ű 

 en meghatározhatjuk, de gondolni kellett arra, mi történik, ha valaminek megváltozik azára. Ekkor ugyanis az eredeti modell szerint (amelyben még nem tároltam a számlák összegeit) a régebben

Page 9: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 9/32

8

kiadott számlák összege is megváltozott, így hamis adatokat kaptunk. A végleges megoldással már nem jelentkezhet ez a probléma, hiszen a számla a kiadásának id

ő 

 pontjában aktuális árakat tartalmazza.Egy szó, mint száz, nem lehet agyon optimalizálni az adatbázist. Megfogalmazhatjuk tehát az adatbázis-

tervezés egyik legfontosabb titkát (amelyben Halassy Béla könyve is megerő 

  sített):   „Sohasem szabad azadatszerkezetet egyszer

ű 

 síteni a programbonyolultság rovására.” [3/207]Azt természetesen mondani sem kell, hogy az adatbázis-tervezés két fontos szabálya: mindennek benne

kell lennie, amire szükség van, és semminek nem szabad benne lennie, amire nincs szükség. Hogy ismét HalassyBéla szavait idézzem: „Az a jó adatféle, ami nincs.” [3/155]. Mert ami nincs, azzal nem kell foglalkozni, nemfoglal helyet, nem vesz igénybe processzorid

ő 

  t, és nem kell fáradozni vele. Tehát fölösleges adatokatsemmiképpen ne tároljunk. Ami viszont kell, az kell. Ezek a kijelentések lehet, hogy triviálisnak hangzanak, defontosnak tartom leszögezni

ő 

  ket, mert sokszor nem tartjuk be ezeket, és késő 

 n ébredünk rá, hogy hibáztunk.Az adatbázis-tervezés bonyolult dolog. Rengeteget lehet hibázni, de a leggyakoribb hiba, ha nem

ismerjük eléggé a mű 

 ködési mechanizmusokat, azaz nem tudjuk, mire lesz szükség. Ezért nagyon fontos, hogyel

ő 

  tte tájékozódjunk, és a feladatot nagyon pontosan határozzuk meg. Ha megkérnek, hogy készítsünk egybizonyos alkalmazást, ne elégedjünk meg ennyivel, kérdezzük meg, hogyan kell m

ű 

  ködnie. Ezzel rengetegvesz

ő 

  dséget megspórolhatunk. Elmondható tehát az is, hogy az adatbázis-tervezés (de igaz ez aprogramtervezésre is) másik legfontosabb szabálya a minél pontosabb feladat-meghatározás.

II. A Delphi adatbázis-kezelő rendszere

Eddig az adatbázisokról általánosságban beszéltünk. Most áttérünk igazi témánkra, a Delphi-srendszerek fejlesztésére. Ehhez ismernünk kell a Delphi adatbázis-kezel

ő 

  rendszerének mű 

 ködési alapjait.

Alapok, BDE 

A BDE a  Borland Database Engine  rövidítése, amely egy Windows alapú 32 bites adatbázis-motor.Feladata, hogy kapcsolatot teremtsen a fizikai adatbázis és az azt kezel

ő 

  alkalmazások között, és ezzelmegkönnyítse a Borland fejleszt

ő 

  rendszereit használó programozók munkáját. Leveszi vállunkról atáblaformátumok kezelését, és alapvet

ő 

  adatbázis-kezelő 

  rutinokat tartalmaz. A BDE a következő 

  adatbázisokattámogatja: dBASE, Paradox, Text, FoxPro, Access, InterBase, Oracle, Sybase, Microsoft SQL, ODBC(Microsoft Open Database Connectivity). A programozó ezek közül szabadon választhat, anélkül, hogymódosítaná programját. Minden formátumnak saját, független meghajtója (drivere) van. Ezeken kívül azonbanvannak megosztott szolgáltatások is, amelyeket minden  driver  használhat. Ilyen pl. a  Buffer Manager  (bufferkezel

ő 

  ), a Sort Engine (rendező 

  motor), stb.A Delphi adatbázis-kezelése teljes mértékben a BDE motorra épül, a Delphi minden DB komponense

ezt használja az adatok közvetlen vagy közvetett eléréséhez. A komponensek a BDE API ( Application Program Interface) függvényeken keresztül m

ű 

  ködtetik a  Database Engine-t. A BDE függvényei objektum-orientáltanépülnek fel, így azok elérése egyszer

ű 

  és strukturált.A Database Engine f 

ő 

 bb részei a következő 

  k:- BDE mag ( BDE core): a rendszer magját képez

ő 

  .DLL fájlok tartoznak ide.- BDE API függvények: alapvet

ő 

  adatbázis-mű 

 veleteket tartalmazó függvénytár, mely tartalmaz adatbáziskezelésre, konfigurálásra, hibakezelésre, lekérdezésre, tranzakciókra használható függvényeket.

- Adatbázis meghajtók ( Database Drivers

): ide tartozik az öt standard meghajtó (Paradox, dBASE, FoxPro,Access, és Text).- Opcionális meghajtók (Optional Drivers): egyéb meghajtókat tartalmaz (InterBase, DB2, Informix, Oracle,

Sybase, Microsoft SQL Server).- Query motorok (Query Engines): az SQL (Structured Query Language – Strukturált lekérdez

ő 

  nyelv)motorok.

- BDE Administrator: a BDE beállításait végző 

  program ( BDEADMIN.EXE ).- Database Desktop: adatbázis fájlok kezelését végz

ő 

  segédprogram, mellyel egyszerű 

  en hozhatunk létre,tölthetünk ki, vagy módosíthatunk különféle formátumú táblákat. Ezen kívül SQL lekérdezéseket iskészíthetünk segítségével.

A BDE fontos szolgáltatása még az ún. alias-ok kezelése. Az alias-ok segítségével elnevezhetjükadatbázisunkat, hogy kés

ő 

  bb ezen a néven hivatkozzunk rá, annak fizikai helyétő 

  l függetlenül. Standardadatbázisoknál az alias gyakorlatilag egy egyszer

ű 

  mutató, ami egy adott könyvtárra mutat. SQL adatbázisoknál

viszont már egyéb információkat is tartalmaz (felhasználónév, jelszó, stb.).A BDE-nek rengeteg beállítási lehető 

 sége van, és általában az alapértelmezett beállítások nem felelnekmeg az igényeinknek. Telepítéskor ezért mindig célszer

ű 

  végignézni ezeket a beállításokat. Ezt a BDEAdministrator ( DBEADMIN.EXE ) programmal tehetjük meg. A beállítások közül megemlítünk néhány

Page 10: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 10/32

9

fontosabbat. Ilyen pl. a Langdriver , amivel a nyelvet állíthatjuk be. Ilyet minden egyes driver beállításai közötttalálunk, mivel a driverekhez egyenként adhatjuk meg, milyen nyelvvel dolgozzanak. Ez a változóalapértelmezetten   'ascii' ANSI   értékre van állítva. Ha magyar, ékezetes szövegeket is tárolunk azadatbázisunkban, célszer

ű 

  ezt   HUN 852 DC   értékre állítani. Mivel mi első 

  sorban a paradox rendszerekkelfoglalkozunk, ezért a Paradox driver beállításait nézzük meg. Itt a  Langdriver  változónak a Paradox HUN 852 DC  értéket kell adni.

Ha hálózaton keresztül használunk paradox táblákat, két dologra kell odafigyelnünk. Az egyik a  Net  Dir . Ez a paradox hálózati kontroll fájl (PDOXUSRS.NET ) helyét határozza meg. Ez a fájl hangolja össze atáblákat hálózaton keresztül elér

ő 

  programokat. Fontos, hogy ha több számítógéprő 

  l használunk hálózatonkeresztül egy adatbázist, ezt a változót minden számítógépen be kell állítani úgy, hogy az ugyanoda mutasson.Célszer

ű 

  az adatbázist tároló számítógép egyik könyvtárát megadni. Csak akkor tudjuk egyszerre többszámítógépr

ő 

  l használni az adatbázisunkat, ha ezt a változót helyesen állítjuk be. A változónak mindigvalamelyik meghajtó, vagy megosztott könyvtár gyökerére kell mutatnia.

Másik fontos beállítás hálózati használat esetén a  Local Share. Ezt a  System/INIT   beállítások közötttaláljuk. Ha egyszerre több programból szeretnénk elérni egy adatbázist, ezt igazra (TRUE ) kell állítani. Ha eztnem tesszük meg, az adatbázist a hálózaton keresztül elér

ő 

  programok nem tudják frissíteni az adatbázispillanatnyi változásait.

Alias létrehozása, szerkesztéseHa létrehozunk egy adatbázist, els

ő 

  dolgunk, hogy létrehozunk számára egy alias-t. Ezt többféleképpen

is megtehetjük: használhatjuk erre a BDE Administrator -t, a Database Desktop-ot, és az SQL Explorer -t is. Én azels

ő 

  t ajánlom, mert kezelése egyszerű 

  bb: az  Object/New  menüpontot kiválasztva meg kell adni az adatbázistípusát (mi   Standard   adatbázisokkal foglalkozunk), majd be kell írni az alias nevét, és ki kell tölteni a jobboldalon a Path mez

ő 

 t. Ezzel kész is az alias. Ha az  SQL Explorer -t használjuk, az eljárás ugyanez. A  Database Desktop esetében már másként kell eljárni:  Tools/Alias Manager  menüpont, az ablakon  New  gomb, megadjuk anevet és utat, majd a Keep New gombra kattintva elmentjük.

Ha ezek után ezzel az alias-szal szeretnénk dolgozni, egy valamit még érdemes megtenni: beállítani a Database Desktop   munkakönyvtárának ezt az alias-t (File/Working Directory). Ez azért célszer

ű 

  , mert a Database Desktop mindig a munkakönyvtárát nyitja meg, ha a megnyitó vagy a ment

ő 

  ablakot használjuk.

Tábla létrehozása, szerkesztéseEzeket a m

ű 

  veleteket a   Database Desktop-pal tudjuk elvégezni. Kattintsunk a   File/New/Table…

menüpontra. Válasszuk ki a tábla típusát. Mivel ebben a munkában Paradox rendszerekkel foglalkozunk,válasszuk a  Paradox 7 -et. A táblázat kitöltése nem bonyolult, viszont jobb oldalon találunk néhány opciót (alenyíló listából választhatjuk ki

ő 

  ket).A  Validity Checks  segítségével a kijelölt mez

ő 

  értékére vonatkozó beállításokat tehetjük meg. Ezekértelemszer

ű 

 en kitöltendő 

 k. Figyeljünk arra, hogy melyik mező 

 kre használjuk, illetve nem használjuk a Required Field  opciót. Ha ez be van kapcsolva, a táblázatba nem lehet elmenteni rekordokat úgy, hogy ez a mez

ő 

  nincskitöltve. Ez akkor hasznos, ha a mez

ő 

 re mindenképp szükség van. Ha ugyanis elfelejtjük a programban kitölteni,azonnal hibaüzenetet kapunk. Az esetleges lefagyások miatti üresen való elmentést is megakadályozhatjuk enneksegítségével.

A   Secondary Indexes   segítségével manipulálhatjuk a másodlagos indexeket. Jó tudni, hogy akkorm

ű 

 ködik rendesen egy index, ha tulajdonságaiban be van jelölve a  Maintained   jelölő 

  négyzet. Ezt viszont csakakkor tudjuk bejelölni, ha van legalább egy els

ő 

 dleges indexünk (a mező 

  -táblázatban a  Key   oszlopban csillaglátható). A  Maintained  opció egyébként arra vonatkozik, hogy a BDE automatikusan frissítse-e a másodlagos

indexeket. Ha ez nincs bejelölve, manuálisan kell megoldanunk az újraindexelést.Ha valamilyen adatbázis-rendszert készítünk, elő 

  fordulhat, hogy ügyelnünk kell a biztonságra. Ezértajánlatos az adatbázis tábláit jelszóval védeni. Egy adatbázison belül célszer

ű 

  ugyanazt a jelszót használni. Ezt a jelszót nem szükséges a felhasználóknak tudni, mivel beépíthetjük a programunkba. Így csak azok a programoktudnak hozzáférni az adatbázishoz, amelyek ismerik ezt a jelszót. Az egyéb biztonsági intézkedéseket(felhasználók kezelése, azok eltér

ő 

  jogai, stb.) már a programunkon belül intézhetjük. A Paradox tábláklehet

ő 

 séget nyújtanak arra is, hogy több jelszót adjunk meg, és azokhoz különböző 

  jogokat rendeljünk ( AuxilaryPassword ). Ezt akkor érdemes csak használni, ha több program is hozzáférhet egy adatbázishoz, de mindegyikükmás-más jogosultságokkal. Ezt a problémát így a legegyszer

ű 

 bb lekezelni.Mint azt az imént említettem, fontos az is, hogy milyen nyelv

ű 

  a tábla. Ezt táblánként megadhatjuk(Table Language). A   Database Desktop  el

ő 

 ször mindig az alapértelmezett nyelvet állítja be a táblának (ezt a BDE Administrator -ban definiálhatjuk, lásd föntebb), de meg is változtathatjuk kedvünk szerint.

Ha már mindent beállítottunk, a Save As gombbal menthetjük a táblát.

Page 11: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 11/32

10

SQL lekérdezés készítéseSQL lekérdezést a legegyszer

ű 

  bben a   Database Desktop-pal készíthetünk (File/New/SQL file). Eztszerkeszthetjük, menthetjük, futtathatjuk. Ha egy Delphi programba szeretnénk SQL-t építeni, a lekérdezéstmindig célszer

ű 

  itt megírni és kipróbálni (az SQL-rő 

  l bő 

  vebben:   Program files\Common files\Borland Shared\BDE\localsql.hlp).

Komponensek 

A Delphi-ben az adatbázis-kezelést komponenseken keresztül valósíthatjuk meg. A komponenseketmozaikként egymáshoz illesztve alakítjuk ki a programunk szerkezetét. A komponensek biztosítják aprogramozó és a BDE közötti kapcsolatot. Alapvet

ő 

  mű 

  veleteket tartalmaznak, melyek felhasználásával könnyenvalósíthatjuk meg elképzeléseinket. Komponensek nélkül szinte elképzelhetetlen a munka, használatukkal nemkell tör

ő 

  dnünk a kezelt adatbázis típusával, formátumával, lényegesen emberközelibb programozást biztosítanak.

III. A Delphi adatbázis-kezelő komponensei

A Delphi adatbázis-kezelő 

  komponensei közül azokat a standard komponenseket vesszük sorra,amelyek a native táblák kezeléséhez szükségesek. Ezeket a standard komponenseket két részre osztva találjukmeg a Delphi eszköztárán:   Data Access  (adathozzáférés), és   Data Controls  (adatkontroll, adatvezérlés). Akomponensek leírásában nem a teljességre törekszem, hanem a lényegesebb dolgok kiemelésére. B

ő 

  vebbeketezekr

ő 

  l a Delphi Help-ben olvashatunk.

TDataSet, mindennek az alapja 

A TDataSet  osztály minden olyan komponens alap osztálya, amely sorokban és oszlopokban megjelenő 

adatot reprezentál. Ez az osztály tartalmazza az alapvető 

  táblamanipulációs metódusokat, tulajdonságokat, stb.Munkánk során sokszor fogunk ezzel az osztállyal találkozni.

Data Access komponensek 

Ide azok a komponensek tartoznak, amelyek segítségével megvalósítjuk az adathozzáférést, az adatbázisfájljaival való kapcsolatot, ezek a komponensek kapcsolják össze az adatokat az adatmegjelenít

ő 

  , manipulálóobjektumokkal.

TDataSourceEz a komponens teremt kapcsolatot az ún.   DataSet   komponensek és a vizuális adatmegjelenít

ő 

(manipuláló) komponensek között. A   DataSet   komponensek azok a komponensek, amelyek valamilyenadathalmazt biztosítanak (TTable,  TQurey). A komponens Dataset  tulajdonságát kell a megfelel

ő 

  komponensre(Table-re vagy Query-re) állítani.

TTableA TTable segítségével beépíthetünk egy táblát a programba. A komponens a BDE-t használva

hozzáférést biztosít egy adatbázis-táblához. Ennek segítségével kezelhető 

 ek az adatok (navigáció, hozzáf ű 

  zés,módosítás, törlés, stb.).

Ha felhelyezünk egy ilyen komponenset a   form-ra, az első 

  dolog, amit tennünk kell, a táblázatfájlnevének megadása. Ehhez el

ő 

  ször a   DatabaseName-et kell megadnunk, amennyiben létrehoztunk azadatbázisunk részére alias-t. Ezt a TableName tulajdonság beállítása követi. A lenyíló listában megtalálhatjuk azadatbázisunk fájljait, vagy ha nem használunk alias-t, a program könyvtárában lév

ő 

  fájlokat.Az   IndexName  beállításával megadhatjuk az index nevét, de használhatjuk erre a célra az   IndexDefs

vagy az IndexFieldNames tulajdonságokat is (bő 

 vebbekért ld. a súgót). Az indexeket természetesen futásidő 

  benis változtathatjuk, kivéve ha a CachedUpdates be van kapcsolva.

A   CachedUpdates   módot akkor használjuk, ha gyorsabb adathozzáférést szeretnénk megvalósítani,

illetve minimalizálni szeretnénk a hálózati forgalmat. Ha ez be van kapcsolva, a BDE a memóriában tárolja azadatokat, és azokat nem menti lemezre, egészen addig, amíg meg nem hívjuk az  ApplyUpdates metódust. Tehátha ezt nem tesszük meg, a módosítások elvesznek. A  CachedUpdates  mód akkor is hasznos lehet, ha olyanalkalmazást készítünk, amiben fontos, hogy akár nagy mennyiség

ű 

  adatmódosítás is visszavonható legyen, ez a

Page 12: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 12/32

11

legegyszerű 

  bb módja: ha vissza szeretnénk vonni a változásokat, csupán a   CancelUpdates   metódust kellmeghívnunk.

A tulajdonságok között találunk egy  Active nevű 

 t. Ezzel már akár szerkesztő 

  módban is bekapcsolhatjuka táblát, de használhatjuk futásid

ő 

 ben az Open ill. a Close helyett is. Célszerű 

  azonban szerkesztő 

  módban nembekapcsolni, mert bizonyos esetekben megnehezítheti a munkánkat, hiszen ilyenkor lefoglalja az adatbázist, ígymás program (pl. Database Desktop) nem biztos, hogy hozzá tud férni.

A TTable eseményei között megtaláljuk a navigáció és az adathozzáférés összes eseményét, ezen kívülpedig hibakezelést is végezhetünk velük. Érdemes

ő 

  ket végignézni.Segítségükkel például egyszer

ű 

  en megoldhatjuk a törlésre való rákérdezést, illetve a törlésmegakadályozását bizonyos esetekben, stb.

A  TTable  metódusai (az egyszerű 

  bbek) már csekély angoltudással rendelkező 

 k számára is egyszerű 

  enmegjegyezhet

ő 

 k: törölni a Delete-tel, hozzáf ű 

 zni az Append -del kell, stb. (bő 

 vebbeket ld. Delphi Help: TTable).Fontos lehet, hogy a Table mez

ő 

 it magunk is megadhatjuk. Ha akarjuk, nem kerül bele minden mező 

  afizikai fájlból, de mi is adhatunk hozzá mez

ő 

  ket. Ezt a komponensre való dupla kattintással tehetjük meg alegegyszer

ű 

  bben. A megjelenő 

  ablak mű 

  veleteit a jobb gombbal való kattintással érhetjük el. Az Add all fieldsminden mez

ő 

  t behelyez, ami a fájlban található. Új mező 

  létrehozása esetén ( New field ) meg kell adnunk, hogyaz adatmez

ő 

  ( Data field ), számolt mező 

  (Calculated field ), vagy   Lookup   (kereső 

  ) mező 

  legyen. Számítottmez

ő 

 nél a tábla OnCalcFields eseményébe írhatjuk be a végzendő 

  számításokat (figyeljünk arra, hogy be legyenkapcsolva az   AutoCalcFields, mely biztosítja, hogy a számolt mez

ő 

 ket automatikusan számoljuk). A  Lookupmez

ő 

  arra szolgál, hogy más táblából ( DataSet ) keressünk ki egy rekord egy mező 

  jét ( Result field ), amelynek

valamely mező 

  je ( Lookup Keys) megegyezik a jelen tábla egy mező 

  jének aktuális értékével (Key field ). Ennekmegértéséhez itt egy egyszerű 

  példa:

Van két táblánk:Nevek (szemelykod, nev)Lakas (szkod, lakhely)A Table1-ben szeretnénk látni a neveket és a hozzá tartozó lakhelyet is.A Table1 forrása legyen a Nevek. A Table2 a Lakas táblát biztosítja.A hozzájuk tartozó DataSet-ek értelemszer

ű 

 en DataSet1, DataSet2.Adjuk hozzá a Table1 mez

ő 

 ihez mindet ( Add all fields). Majd hozzunk létre egy új mező 

 t. Válasszuk a Lookup field  rádiógombot, majd töltsük ki a Lookup definition-t: Key Fields=szemelykod , DataSet=DataSet2, Lookup Keys=szkod , Result Field=lakhely.Az eredmény magáért beszél.

Ha a tábla mező 

  it hozzáadtuk a mező 

  listához, azokat kiválasztva szerkeszthetjükő 

  ket az   Object  Inspector  segítségével. A rengeteg lehet

ő 

  ség közül egy hasznos dolgot emelnék ki, ez pedig a  DisplayName,melyben azt a szöveget adhatjuk meg, amivel meg szeretnénk jeleníteni a rekordot. Ez azért hasznos, mertmez

ő 

  neveknek általában rövidítéseket használunk, de ezeket a felhasználónak nem kell tudnia. Ha ezt atulajdonságot beállítjuk, ezen túl az adatokat megjelenít

ő 

  komponensek ezt a nevet fogják kiírni.A táblában található adatokat a  Filter   tulajdonság segítségével sz

ű 

  rhetjük is (amennyiben a  Filtered tulajdonság true). Ennek megvan a megfelel

ő 

  szintaktikája, amelyet a Help-ben a TBDEDataSet.Filter  témaköralatt találjuk meg. Sz

ű 

 rés esetén a táblázatban csak a szű 

  rő 

 feltételnek eleget tevő 

  rekordok jelennek meg.

TQueryEz a komponens egy olyan   DataSet -et épít be a programba, ami SQL kifejezésen alapul. Arra

használjuk, hogy SQL lekérdezéseket hajtsunk végre a segítségével. Azért hasznos ez a komponens, mert ezzelegyszerre több táblát is elérhetünk, illetve összekapcsolhatunk, valamint számításokat, rendezéseket,leválogatásokat is nagyon könnyen végezhetünk vele (az SQL nyelvb

ő 

  l adódóan).Itt is találunk a  Table-höz hasonló tulajdonságokat és eseményeket. Ebb

ő 

 l is látszik, hogy csak abbankülönbözik a   TTable-t

ő 

  l, hogy az adatforrása egy SQL lekérdezés. Természetesen a   Query   által visszaadottadatokat módosítani nem tudjuk, de magával a  Query-vel végezhet

ő 

 k adatmódosító mű 

 veletek (Update, Delete,stb.), mivel ezeket az SQL nyelv lehet

ő 

 vé teszi. Ekkor a komponens nem ad vissza táblát. Az SQL lekérdezést akomponens SQL  nev

ű 

  tulajdonságában adhatjuk meg. Ha lekérdezést írunk, és még nem érezzük magunkat eléggyakorlottnak, célszer

ű 

  a lekérdezést elő 

  ször a  Database Desktop-pal elkészíteni, lefuttatni, és ha mű 

  ködik,utána átvinni a programunkba, így ugyanis egyszer

ű 

  bb a hibaellenő 

  rzés. Ha pedig valakinek nem tetszik a Delphi   string-szerkeszt

ő 

  ablaka, a   Code Editor  gomb megnyomásával használhatja a normál kódszerkesztő 

ablakot is. Ennek azért van elő 

  nye, mert itt az SQL parancsokat a Delphi felismeri, és kiemeli.A TTable-höz hasonlóan ennél a komponensnél is m

ű 

 ködik a filter .

Metódusai közül az   ExecSQL   nevű    t említeném meg, mellyel lefuttathatjuk a lekérdezésünket.Természetesen a TTable-höz hasonlóan itt is m

ű 

 ködik az Open és a Close is.

Page 13: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 13/32

12

TUpdateSQLHa már a   Query-nél tartunk, érdemes megemlíteni a   TUpdateSQL   komponenset, amely kifejezetten

adatmódosításra szolgál. Itt külön törlő 

  ( DeleteSQL), módosító ( ModifySQL) és hozzáf ű 

  ző 

  ( InsertSQL) SQL-tadhatunk meg. Ezeket is az ExecSQL metódussal tudjuk futtatni, csak itt meg kell adnunk, hogy milyen módbanindítjuk el (törl

ő 

 , módosító, beszúró).

TBatchMoveEl

ő 

  fordulhat, hogy szükségünk van arra, hogy egy táblából bizonyos adatokat egy másik táblábamásoljunk. Erre kit

ű 

  nő 

  eszköz ez a komponens. Fontos, hogy forrásnak (Source) és célnak ( Destination) TTabletípust kell megadni, tehát az adott táblának léteznie kell a programban.

Minden ilyen esetben ajánlatos ezt a komponenset használni, mivel ezzel lehet a leggyorsabbanadatokat mozgatni. Még ha SQL-ben egyszer

ű 

  bbnek is tű 

  nik egy ilyen mű 

  velet (mondjuk egy   Insert   vagyUpdate), a gyakorlat azt mutatja, egy  query   lefuttatása nagyságrendekkel több id

ő 

  t vesz igénybe – ami kevésadatnál még nem érzékelhet

ő 

  , de minél több adat van, annál lassabb lehet egy ilyen lekérdezés. Ezzel akomponenssel ráadásul nem csak másolni, hanem törölni is lehet (a céltáblából törli azokat az adatokat, amelyekmegvannak a forrásban is).

Data Controls komponensek Ide az adatokat megjelenít

ő 

  , kontroláló vizuális komponensek tartoznak.

TDBGridEgyszer

ű 

  táblamegjelenítő 

  komponens. Egy   TTable   (vagy   TQuery)objektum tartalmát jeleníti meg,standard formában (a táblázat oszlopai a mez

ő 

 k, sorai a rekordok). A tábla tartalmát szerkeszteni is tudjuk asegítségével (amennyiben a   ReadOnly   tulajdonsága   false). A szerkesztés a standard táblázatkezel

ő 

programokhoz hasonlóan történik (érdemes vele kísérletezni). Szerkesztésre való használatát azonban csakmódjával javaslom, mert amilyen kevés dolga van vele a programozónak, annál több bosszúságot okozhat ez akomponens. Ennek több oka is van. Egyrészt a felhasználók számára bizonyos esetekben bonyolultnak t

ű 

 nhet ezaz adatszerkesztési mód, másrészt a szerkesztést teljes egészében a komponens oldja meg, azaz nekünk nehezebb

dolgunk van, ha egyénileg szeretnénk megvalósítani ezeket. Használata ezért csak egyszerű 

  bb táblázatokszerkesztésére ajánlott. Kitű 

  nő 

  viszont arra, hogy összesített adatokat, lekérdezéseket (SQL), valamint listákat jelenítsünk meg vele. Ha szerkeszteni szeretnénk a tartalmát, célszer

ű 

  erre a célra külön ablakot (adatlapot)gyártani, ami megkönnyíti a szerkesztést (lásd: V. fejezet).

A komponens   Options   tulajdonságát kinyitva rengeteg beállítási lehető 

  séget találunk. Ezek közülnéhányat emelnék csak ki. A  dgEditing tulajdonságot false-ra állítva kikapcsolhatjuk a szerkeszt

ő 

  módot, így azadatokat nem lehet módosítani. A   dgRowSelect   bekapcsolásával egyrészt automatikusan kikapcsoljuk aszerkesztést, másrészt engedélyezzük, hogy a táblázatnak mindig egy teljes sora legyen kijelölve. Ezzel azonbancsínján kell bánni, mert ha nem fér ki egyszerre a táblázat összes oszlopa, és tovább lapozunk a gördít

ő 

  sávon,hogy láthatóvá tegyük a többi oszlopot is, majd valamelyik sorra kattintunk, a táblázat automatikusan visszaállúgy, hogy az els

ő 

  oszlop lesz látható. Ez a jelenség csak a dgRowSelect  bekapcsolt állapotánál jelentkezik, éssokszor kellemetlenségeket okoz. Figyeljünk arra is, hogy amennyiben a   dbRowSelect   be van kapcsolva, adbEditing-et nem tudjuk  true-ra állítani. A  dgIndicator  a táblázat bal oldalán lév

ő 

  indikátor-oszlopot kapcsolja

be, illetve ki. Ez az indikátor sokszor hasznos, mert látjuk az aktuális rekordot, és annak állapotát (szerkesztett,beszúrt, stb.).Sokszor lehet arra szükség, hogy a táblázatból csak meghatározott mez

ő 

 ket jelenítsünk meg, illetvehogy csak meghatározottakat tudjunk szerkeszteni. Erre szolgál a  DBGrid  oszlopszerkeszt

ő 

  je (Column Editor ),amit a   Columns   tulajdonság gombjára kattintva érhetünk el (ezen kívül megnyithatjuk ezt az ablakot akomponensre való dupla kattintással, illetve a helyi menüjéb

ő 

 l is). Alapértelmezésben ez az ablak üres, tehát atáblázat minden mez

ő 

 t megjelenít, amit a hozzá tartozó  Table tartalmaz. A helyi menübő 

 l (jobb gomb), illetve azablak eszköztárából is elérhet

ő 

  Add All Fields paranccsal azonban hozzáadhatjuk az összes mező 

 t, hogy aztánsaját kedvünk szerint szerkeszthessük azokat. Az ablak egy sorára kattintva az   Object Inspector -banmegjelennek annak tulajdonságai, amelyek segítségével minden lényegi jellemz

ő 

 t beállíthatunk. Nagy táblázatokesetén például ajánlatos különböz

ő 

  színű 

  oszlopokat használni. Ha pedig valamelyik mező 

  re nincs szükségünk,egyszer

ű 

 en kitörölhetjük ebbő 

 l a listából.Van a komponensnek egy apró, ám néha elég zavaró hibája: a görget

ő 

 sávot nem hagyományos módon

kezeli. A csúszka mérete ugyanis mindig állandó, és nem követi a görgetést, mivel ha az első 

  elem az aktív, acsúszka legfelül van, ha az utolsó elemen állunk, akkor legalul, minden egyéb esetben pedig a sáv kellő 

  sközepén. S

ő 

  t, ha föl-le görgetünk, és az aljára illetve a tetejére lapozunk a táblázatban, a csúszka csak akkormozdul el a sáv aljára ill. tetejére, ha az els

ő 

  ill. utolsó elem az aktív, és észreveszi, hogy nem tud tovább

Page 14: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 14/32

13

görgetni (EOF  vagy BOF ). Ez a hiba jelentő 

 sen megnehezítheti a táblázatban való navigálást, mivel nem látjuk,hogy hol járunk benne.

TDBNavigatorEz egy egyszer

ű 

  komponens, mely csupán az alapvető 

  tábla-navigációs parancsok kiadására szolgál:lapozhatjuk vele adatainkat, szerkeszthetjük, elmenthetjük, törölhetjük (stb.)

ő 

  ket. A VisibleButtons tulajdonság

segítségével megadhatjuk, mely gombok legyenek láthatóak.

A következő 

  kben olyan komponensekrő 

  l lesz szó, amelyekhez hasonlók megtalálhatók a   Standard komponensek között is. Ezért ezek használatát nem részletezem, csupán a standard változattól való eltérésekre ésaz adatbázis-kezel

ő 

  vonatkozásaira térek ki.

TDBTextA standard   TLabel-höz hasonló statikus adatmegjelenít

ő 

  komponens, mely egy adatforrás egymez

ő 

  jének aktuális értékét jeleníti meg. Szerkesztésre nem használható. A  DataSet  és a  DataField  tulajdonságsegítségével adható meg a megjeleníteni kívánt mez

ő 

  forrása és neve.

TDBEditEnnek is megvan a standard párja, a  TEdit , melyt

ő 

 l csupán annyiban tér el, hogy szövegét egy tábla egymez

ő 

 jének aktuális értékébő 

 l veszi, illetve szerkesztésénél ezt a mező 

 értéket módosítja. Hasonló a TDBText -hez.

TDBMemoMemo típusú mez

ő 

  k megjelenítésére szolgáló komponens. Használata ennek is triviális.

TDBImageSzintén egyszer

ű 

  komponens, amely a képeket tartalmazó mező 

 k megjelenítésére szolgál.

TDBListBoxEz egy olyan speciális   ListBox, melynek elemei ( Items) egy adott tábla adott mez

ő 

  jének lehetségesértékeit tartalmazhatja. Az aktuális értéket – amennyiben az megtalálható a listában – automatikusan kijelöli. Azadott mez

ő 

  értékének szerkesztése úgy történik, hogy a listából (kattintással) kiválasztunk egy elemet, és az kerülbe új értékként a mez

ő 

 be. A lehetséges elemeket a TStrings típusú Items tulajdonságában adhatjuk meg.Akkor használjuk, ha egy mez

ő 

 nek csak adott értékei lehetnek, így a felhasználó semmiképpen nem tudmás értéket beállítani (pl. neme: férfi/n

ő 

  ).

TDBComboBoxOlyan a   TComboBox   nev

ű 

  standard komponensbő 

  l készült lenyíló lista, mely az imént említettTDBListBox-hoz hasonlóan mű    ködik, csak itt a lista a lenyitó gomb megnyomása után jelenik meg.

TDBCheckBoxLogikai (boolean) típusú adatmez

ő 

  k megjelenítésére és szerkesztésére szolgáló jelölő 

  négyzet.Használata ugyancsak triviális.

TDBRadioGroupA TDBListBox-al megegyez

ő 

  funkciókat lát el, rádiógombok használatával.

TDBLookupListBoxOlyan   ListBox, amely   lookup   (keres

ő 

  , lásd: II. fejezet) mező 

  mű 

  ködtetésére szolgál. Egy tábla egymez

ő 

 jének értékét jeleníti, illetve szerkeszti. A lista elemeit a  ListSource (TDataSet ) forrás ListField  mező 

  jének

Page 15: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 15/32

14

rekordjai alkotják. A   KeyField   tulajdonságba a   ListSource   azon mező 

  jét állítjuk be, amely alapján keresniakarunk a ListSource-ban. Természetesen a DataSource és a DataField  a manipulálandó adat forrását és mez

ő 

  jétadja meg.

TDBLookupComboBoxA TDBLookupListBox-hoz hasonló, csak ennél lenyíló listából választhatunk értéket.

TDBRichEdit RichText   szerkeszt

ő 

  , amely tartalmát memo típusú mező 

  ben tárolja. Olyan helyzetekben célszerű 

használni, amikor szükség van a szövegek formázott tárolására (például ha olyan szövegeket tárolunk, melyeketesetleg nyomtatni is fogunk, és szükségünk van alapvet

ő 

  formázási lehető 

  ségekre), ugyanis ez a komponens (aszabvány   RichText   formátumot használva) formázással együtt kezeli a mez

ő 

  tartalmát (így hagyományosTDBMemo-val megjelenítve nem a kész szöveget, hanem annak forráskódját kapjuk).

TDBCtrlGridOlyan táblázat, amely egy adatforrás rekordjait jeleníti meg, szabad formájú elrendezésben. Ez azt

 jelenti, hogy különböző 

  adatmanipuláló objektumokat helyezünk el a táblázat legfelső 

  sorába, amiket a programfutásakor a komponens megsokszoroz, és minden egyes sorban ugyanazzal a kiosztással megjeleníti a rekordokadatait. A táblázatra azonban csak bizonyos adatmanipuláló komponenseket helyezhetünk föl (például  TDBEdit ,TDBListBox, stb.). a   DataSource   tulajdonságot a   DBCtrlGrid -nek kell beállítani, a rajta lév

ő 

  objektumok DataSource nev

ű 

  tulajdonsága nem állítható.

TDBChartAdatbázison alapuló grafikon készítésére szánt komponens. Mivel használata, m

ű 

  ködése olyanszerteágazó, és sokrét

ű 

 , hogy talán egy külön munkát is megérne, nem foglalkozunk vele. Érdemes megtekintenidemóját, a Delphi könyvtárában a Demos\Teechart\teedemo.dpr  fájlt megnyitva és futtatva.

Nyelvi problémák A Delphi adatbázis-kezelő 

  komponenseit használva hamar rábukkanunk az angol nyelvű 

  szövegekre,melyeket a komponensek m

ű 

  ködés közben jelenítenek meg. Például ha egy   DBGrid -et vagy   DBNavigator -thasználunk, és bekapcsolva hagyjuk a  ConfirmDelete tulajdonságot, majd törölni próbálunk egy adatot, azonnalelénk ugrik a következ

ő 

  kérdés:  „Delete Record?”. Ha tovább játszadozunk a komponensekkel, az esetlegeshibajelzéseket is angolul fogjuk megkapni. Ez egy magyaroknak szánt, magyar nyelv

ű 

  program esetében nemmutat jól, és – amennyiben a felhasználó nem tud angolul – különösen zavaró lehet.

„Mit tehetünk?” – hangzik a kérdés. A válasz egyszerű 

  , de nem kézenfekvő 

  : át kell írni az angolszövegeket magyarra. Hogy hol? A Delphi könyvtárában a  Source\Vcl  könyvtárban található egy dbconsts.pasnev

ű 

  fájl. Ebben csak a Db-komponensekkel kapcsolatos szövegek vannak definiálva, mint konstansok. Ezeketegyszer

ű 

 en át kell írni, és a nyelvi problémáink nagy része megoldódik, méghozzá örökre. (Célszerű 

  utána ezt azátszerkesztett fájlt biztonságos helyre is elmenteni.) Amennyiben még mindig van angol szöveg a programban, aDelphi 5-öt használóknak van még egy lehet

ő 

 sége: a  Project\Languages menüpont, ahol némi ügyeskedés után

lefordíthatjuk a programban található összes   string-et (b ő    vebbeket ld.  Delphi Help:   languages: adding to a project ).

TDataModule 

Ha már próbálkoztunk néhány bonyolultabb ablak összeállításával, láthatjuk, hogy a nem vizuálisadatkomponensek (mint például a  TTable  és társai) sok helyet foglalhatnak el a   form-on. Ezt kiküszöbölend

ő 

született a  TDataModule  komponens, mely egy olyan ablak, amelyen csak nem vizuális komponenseket lehetelhelyezni. El

ő 

 nye, hogy áttekinthető 

 bbé tudjuk tenni a programunkat, mivel ezen az ablakon bárhová tehetjük akomponenseket, és az ablak is bármekkora lehet, hiszen nem jelenik meg futás közben. Másik el

ő 

 nye, hogy haegy ablakra kiteszünk egy komponenset, annak lenyitjuk a DataSource tulajdonságát, a Delphi az aktuális  form-on lév

ő 

  kön kívül felkínálja azokat az objektumokat is, amelyek a DataModule-on vannak.Delphi 5-öt használók még adat-diagrammot is készíthetnek a DataModule segítségével.

Page 16: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 16/32

15

IV. Egy adatbázis-kezelő alkalmazás elkészítése

A továbbiakban arról lesz szó, milyen módszerekkel és feltételekkel készíthetünk adatbázis-kezelő 

alkalmazásokat Delphi-ben.

Tervezés 

A programok készítésének els ő    és legfontosabb fázisa ez. Gondos tervezés nélkül nem szabad (ésigazán nem is lehet) elkezdeni egy fejlesztést. A program el

ő 

 ször mindig a fejlesztő 

  agyában születik meg, éscsak aztán kezd

ő 

 dik a kódolás. Félreértés azonban ne essék! A program gondos megtervezése nem azt jelenti,hogy sorról sorra megírjuk el

ő 

  re a kódot, hanem hogy átgondoljuk mű 

 ködési elvét, rendszerét. A gyakorlatimegvalósításon elég kódolás közben gondolkodni, mert ha jó a tervezés, nincs probléma vele. Csak akkorkezdjünk el programot tervezni, ha az adatbázis már gondosan megterveztük és elkészítettük. Annak ugyanisfüggetlennek kell lennie a programtól.

Fontos szempont programtervezésnél, hogy rendszere átlátható és könnyen bő 

  víthető 

  legyen. Mivel aDelphi objektumorientált fejleszt

ő 

  rendszer, nekünk is objektumorientáltan kell gondolkodnunk. Aprogramunknak jól kell illeszkednie az általa használt adatbázis felépítéséhez. Minden feladatot az elvárt módonkell megoldania. Fel kell készülni arra is, hogy az „éles” használat során hatalmas adatmennyiségekhalmozódhatnak föl, így mindenre meg kell keresnünk a legoptimálisabb megoldást. Gyakori hiba, ha a fejleszt

ő 

nem gondol arra, hogy jóval több adat kerül majd az adatbázisba, mint amennyivel tesztelte. Az nem elég, ha a

tesztek során a program szép eredményeket produkál. Mindig el kell gondolkozni azon, nem lehet-e még jobban,még egyszer

ű 

  bben, még gyorsabban megoldani a feladatokat.Az ablakokat is érdemes el

ő 

  re megtervezni, így áttekinthető 

  bb lesz a programterv, és késő 

  bb isgyorsabban halad a munka. És persze a megrendel

ő 

 nek meg lehet mutatni ezeket a terveket, ami nem egy utolsószempont.

Ez a fejezet nem programot tervezni tanít, inkább segítő 

  kezet nyújt a tervezéshez és a kódoláshoz.

A DataModule 

Ha túl vagyunk a tervezésen és az adatbázis létrehozásán, az új  Project  megnyitása után első 

  dolgunkegy új  Data Module  megnyitása (File/New/Data Module). Ebbe kerülnek bele aztán a táblák (TTable), és azSQL-ek (TQuery). Mindegyiknek be kell állítani a  DatabaseName  tulajdonságát, illetve a forrását (TableNameés SQL). Ha ezeket meg is szeretnénk jeleníteni, csatlakoztatnunk kell hozzájuk egy-egy  DataSource-t (ki kell

helyezni ő   ket, majd a DataSet  tulajdonságukat a megfelelő    értékre állítani).Ezek után be kell állítanunk a lookup kapcsolatokat.El kell döntenünk, hogy egy-egy táblát vagy  Query-t mikor szeretnénk használni. Ha a program futása

során állandóan (vagy elég gyakran) szükségünk van rá, célszerű 

  ezt a program futásának kezdetén megnyitni(nem ajánlatos már szerkeszt

ő 

  módban megtenni ezt, az   Active   tulajdonság   true-ra állításával, mert ez akés

ő 

  bbiekben problémákat okozhat). Ehhez érdemes a táblákat tartalmazó   DataModule OnCreate   eseményébehelyezni a megnyitási blokkot. A megnyitást mindig ajánlatos  Try-blokkba tenni (ld.  Delphi Help:  Try...except statements; VI. fejezet). Így ha nem sikerül megnyitni valamelyik táblát, az esetleges hibákat az  Except  részbenle tudjuk kezelni. A legegyszer

ű 

  bb ilyen megnyitási blokk így néz ki:

Try

Table1.Open;

Table2.Open;

Query1.Open;//stb…

Except

ShowMessage(’Hiba! A táblák megnyitása meghiúsult.’);

Halt;

End ;

Használhatunk persze olyan táblákat és lekérdezéseket is, amelyeket csak néha, vagy egy adott modulmegnyitásakor kell megnyitnunk. Ekkor értelemszer

ű 

  en járjunk el, és a megfelelő 

  helyre helyezzük az Open-eket, hogy elkerüljük a fölösleges er

ő 

  forrás-pazarlást.Ha a táblákhoz jelszó is tartozik, a jelszavakat a  Session.AddPassword  metódus segítségével tárolhatjuk

el. Így a programunk tudni fogja a jelszót (vagy jelszavakat), és nem fog külön rákérdezni. Az  AddPassword metódust mindig a megnyitás el

ő 

 tt kell meghívnunk.Ha még csak most kapizsgáljuk a Delphi adatbázis-kezelését, még nincs rá szükségünk, de kés

ő 

  bbfelmerül a kérdés: „Mi lesz, ha törl ő   dik az alias, vagy olyan gépen indítjuk el a programunkat, ahol van BDE,elérhet

ő 

  az adatbázis is, de még nincs hozzá alias?” Ebben az esetben vagy kézzel hozzuk létre, vagy (és ez aszebb megoldás, hiszen ehhez a felhasználónak nem kell ismernie   BDE Administrator -t) a programunkkal

Page 17: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 17/32

16

végeztetjük el ezt a munkát. A megoldás alapesetben egyszerű 

 , le kell kérdezni, hogy létezik-e az adott alias, ésha nem, létre kell hozni. Ez addig jó, amíg a programunk indítási könyvtárához képest fix helyen található azadatbázis könyvtára (mondjuk a program könyvtárában van egy  Database könyvtár). Használhatjuk azonban azadatbázist hálózaton keresztül is. Ekkor nem tudhatjuk, hol lapul az adatbázisunk. Ekkor bizony a vétlenfelhasználóval kell megkerestetnünk azt.

Ilyen problémák megoldására a következő 

  módszert ajánlom. Ha a programot és az adatbázist egyazonszámítógépre telepítjük, az adatbázis mindig legyen a program könyvtárában, például egy   Database   nev

ű 

alkönyvtárban. Így ha nem létezik az alias, egyszerű 

  en létrehozzuk, és beállítjuk neki könyvtárként ezt akönyvtárat. Arra is fel kell azonban készülni, hogy az adatbázist egy másik számítógépen szeretnénk tárolni.Ilyenkor a programnak célszer

ű 

  megnéznie, létezik-e ez a bizonyos   Database   könyvtár. Ha nincs, akkorbizonyára valahol máshol kell lennie. Ekkor a legjobb, ha közöljük a felhasználóval, hogy nem tudjuk, hol azadatbázisa, és legyen szíves, mutassa meg nekünk. Ezt egy egyszer

ű 

  fájlmegnyitó ablakkal is megtehetjük. Ha ezmegvan, már létrehozhatjuk az alias-t. A figyelmes programozó az ekkor megadott könyvtár nevét eltárolhatjaegy fájlban, így ha legközelebb „elt

ű 

  nik” az alias, csak onnan kell kiolvasni annak helyét, nem kell afelhasználót nyaggatni ezzel.

Egyébként aggodalomra semmi ok, az alias-ok nem szoktak „csak úgy eltű 

  nni”. Ez a problémaáltalában a program els

ő 

  indításakor jelentkezik. Persze a program telepítő 

 jével (ld.: VI. fejezet) is létrehozhatjukaz alias-t, de tapasztalatom azt mutatja, hogy az ékezetes könyvtárnevekkel (ha az adatbázis elérési útjában vanékezet) vigyázni kell.

A probléma programon belüli megoldására itt egy egyszerű 

  példa (a   DataModule OnCreate

eseményében):var   ActDir:string;   {az aktuális könyvtárat fogjuk ebben tárolni}

DBDir:string;   {az adatbázis könyvtárát tároljuk ebben}

{…}

if not   Session.IsAlias('En_Aliasom')   then

 begin

GetDir(0,ActDir); {Lekérjük az aktuális könyvtár nevét}

if   DirectoryExists(ActDir+'\Database')

then   DBDir:=ActDir+'\Database'

else

 begin

Showmessage('_Hibaüzenet_');

Form1.OpenDialog1.Directory:=ActDir; {Az OpenDialog valamely 

létező    form-on kell, hogy legyen!}if not   Form1.OpenDialog1.Execute   then   Halt   {ha a felhasználó

mégsem-mel lépett ki, megszakítjuk a program futását}

DbDir:=Form1.OpenDialog1.Directory;

end ;

try

{Létrehozzuk az alias-t:}

Session.AddStandardAlias('EN_Aliasom', DbDir, 'PARADOX');

{Mentjük a BDE beállításait:}

Session.SaveConfigFile;

finally

Showmessage('Az adatbázis inicializálása befejező    dött.');

end ;

ChDir(ActDir); {visszaállítjuk az aktuális könyvtárat}end ;

{…}

//Itt jöhet a táblák megnyitása...

Ha ezzel is kész vagyunk, a táblák egyes eseményeihez hozzá kell rendelnünk a saját eljárásainkat. Megkell adnunk, mi történjen, ha a felhasználó ki akar törölni egy adatot, vagy újat akar beszúrni, stb., azaz ki kelldolgozni a táblák eseményeit. F

ő 

 ként érinti ez a számított mező 

 ket, hiszen azok számítási algoritmusát a táblákOnCalcFields eseményében kell kifejteni. Hogy ezen felül mire van még szükség, azt a program milyensége és aprogramozó ízlése határozza meg.

Az ablakok 

Az alkalmazások fejlesztése során nagy hangsúlyt kell fektetnünk az ablakok kialakítására, hiszen aprogramot a felhasználónak készítjük, és a felhasználók számára fontos a jó megjelenés és a könnyű 

kezelhető 

  ség. Első 

 dleges szempont mindig a funkció. Mindennek a helyén kell lennie, és megfelelő 

 en, logikusankell m

ű 

  ködnie. Emellett azonban figyelnünk kell arra is, hogy fölösleges, zavaró dolgok ne kerüljenek a

Page 18: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 18/32

17

képernyő 

  re. Csak azt jelenítsük meg, ami információ-tartalommal bír. A redundanciát lehető 

  leg kerüljük.Ablakunkat továbbá minél átláthatóbbá kell tennünk. A felhasználók azt szeretik, ha egy általuk is követhet

ő 

  ,egyszer

ű 

  logika alapján épülnek fel a kezelő 

  felületek. Ez sokszor okoz fejtörést a fejlesztő 

 nek, mivelő 

  a belső 

mű 

  ködése felő 

  l szemléli a programját. Akkor jó egy program, ha a felhasználónak nem szükséges tisztábanlennie a bels

ő 

  mű 

  ködéssel.Ha az ablak funkcionálisan megfelel

ő 

  felépítésű 

  , még nem biztos, hogy könnyen kezelhető 

  . Ehhezel

ő 

 ször is mindent jól láthatóvá és használható méretű 

 vé kell tennünk. Ez alatt első 

 sorban a betű 

 típust és méretet,valamint a gombok és egyéb objektumok nagyságát értem. A Windows által használt alapértelmezettbet

ű 

  típusnál ( MS Sans Serif 8 ) a 10-es méretű 

  Arial  olvashatóbb, ezért célszerű 

  a form-unk létrehozása utánrögtön erre beállítani a form   Font   tulajdonságát. Ez a beállított érték lesz érvényes a form-ra kerül

ő 

objektumokra is. Ha van a képernyő 

  n hely, a gombokat érdemes az alapértelmezetthez képest egy kissémegnagyítani.

Programunkat átláthatóbbá tehetjük továbbá azzal, ha a szabványos gombok (TButton) helyett TBitBtn-thasználunk, amelyre kis képeket lehet helyezni (Glyph), ezzel megkönnyítve a felismerésüket. Elegend

ő 

képecskét találunk a Delphi képtárában, amelyet telepítéstő 

 l és verziótól függő 

 en a Delphi könyvtárán belül az Images\Buttons, vagy a Program files\Common Files\Borland Shared\Images\Buttons könyvárban keressük.

Találkozhatunk olyan esettel is, amikor a programot a megrendelő 

  érintő 

  képernyő 

  s monitoron szeretnéhasználni. Ekkor már tervezéskor figyelnünk kell az ablakokon található kezel

ő 

  k méretére, mert egy mármeglév

ő 

  ablakot átszabni úgy, hogy minden megfelelő 

  méretű 

  legyen, sokszor nagy vesző 

 dségekkel jár. Ha nemfér el minden szükséges funkció egy ablakban, akkor célszer

ű 

  azokat egymás után megjelenő 

párbeszédablakokba helyezni. Ekkor figyeljünk arra, hogy logikusan, lépésrő 

  l lépésre haladjunk. Itt említemmeg, hogy azok az objektumok, amelyek rendelkezhetnek gördítő 

  sávval, a Windows gördítő 

  sáv-beállításaithasználják. Ez gyakran kicsinek bizonyul. Ebben az esetben célszer

ű 

  a felhasználót felszólítani, hogy amegfelel

ő 

  helyen tegye meg a szükséges beállításokat a Windows-ban. Ha erre felkészülünk, a programunkatcélszer

ű 

  nagy gördítő 

  sáv-mérettel is kipróbálnunk, hogy ne késő 

 bb érjen meglepetés.Létezik még egy er

ő 

 s buktató az ablakok tervezésében és kivitelezésében. Ez pedig a felbontás kérdése.Nem mindegy ugyanis, hogy milyen felbontásban tervezzük meg az ablakot, és hogy azt milyen felbontásbanfogják használni. Gyakori hiba, hogy valaki egy 1024x768 méret

ű 

  képernyő 

 n tervezi meg az ablakjait, de azt egy800x600-as képerny

ő 

  n fogják futtatni, és azon bizonyos dolgok kilógnak a képbő 

  l. De az ellenkező 

  je isel

ő 

 fordulhat, amikor egy kisebb felbontásra tervezett programot nagyobb felbontásban futtatunk, és hatalmasüres helyek jelennek meg az ablakok jobb szélén és alján. A problémára több megoldás is van. El

ő 

  ször iscélszer

ű 

  skálázható ablakokat készítenünk. Ekkor azt kell meghatározni, hogy melyik komponens melyikirányba legyen mozdítható. Erre rendelkezésünkre áll a komponensek Anchors tulajdonsága. Ennek négy logikai

típusú eleme van ( Left, Top, Right, Bottom), amelyekkel meghatározhatjuk, hogy a komponens az ablak melyikszéléhez legyen rögzített távolságra (célszerű 

  kísérletezni vele). Jól skálázhatóvá tehetjük alkalmazásunkat, hamegfelel

ő 

  en használjuk a komponensek   Align   tulajdonságát (ez nem minden komponensnek van, és nemösszekeverend

ő 

  az  Alignment -tel). Ha pl.  alClient -re állítjuk, a komponens kitölti a teljes területét az ablaknakvagy annak a panelnek, amelyre helyeztük. Érdemes egyébként   TPanel-eket használni, objektumok egycsoportjának megjelenítésére, mert a segítségükkel csoportosíthatjuk a komponenseket, és a  TPanel-nek is van Align   tulajdonsága. Az   Align   tulajdonságot   alLeft -re,   alTop-ra,   alBottom-ra vagy   alRight -ra állítvaértelemszer

ű 

 en a megfelelő 

  oldalra zárva jelenik meg a komponens.Csúnya, de sokszor elkerülhetetlen megoldás, ha az ablak (form) automatikus görgetését ( AutoScroll)

használjuk ki. Bizonyos speciális szoftvereknél azonban nem érdemes ilyenekkel vesző 

  dni, hanem egyszerű 

  enmeg kell határozni egy felbontást, amelyben a program m

ű 

  ködik. Ha pedig a program elindításakor nemmegfelel

ő 

  a felbontás, figyelmeztetni kell errő 

 l a felhasználót (a kép méretét a  Screen.Height, ill. a Screen.Widthtulajdonságok segítségével kérdezhetjük le a legegyszer

ű 

  bben).

AblaktípusokAlkalmazásunk tervezésénél figyelembe kell vennünk, hogy hogyan fogják használni. Két elrendezési

típus közül választhatunk. Az egyik a hagyományos (SDI) ablakok, amikor egy újonnan megnyíló ablak a többifölé rajzolódik, és esetleg váltogathatunk a megnyíló ablakok között. Ha ezt a megoldást használjuk, oda kellfigyelnünk arra, hogy a párbeszédablakok mögötti ablak ne legyen elérhet

ő 

  (az  Enabled   tulajdonsága legyen false, vagy nem a Show, hanem a ShowModal metódussal jelenítjük meg a párbeszédablakot).

Használhatjuk azonban az ún. MDI ablakokat is. Ezek elő 

 nye, hogy a gyermekablakok a szülő 

  ablakonbelül nyílnak meg (ezt a megoldást használják pl. a szövegszerkeszt

ő 

 k is). Ehhez állítsuk a f ő 

  ablak  FormStyletulajdonságát  fsMDIForm-ra, a gyermekablakokét pedig   fsMDIChild -ra. MDI ablakokat használva a Windowsrengeteg lehet

ő 

  séget nyújt, így egyszerű 

  en készíthetünk ilyen alkalmazásokat (ld.:   Delphi Help: MDI applications).

Szintén érdemes megfontolni, hogy az általunk készített program az egyedüli alkalmazás-e, amithasználni fognak a számítógépen. Ha igen, akkor hasznos lehet, ha a programot teljes képerny ő   n futtatjuk,eltakarva ezzel a Windows tálcáját is (ehhez a  WindowsState-et wsMaximized -re, a BorderStyle-t pedig bsNone-ra kell állítani). Így a felhasználó nem tud véletlenül rossz helyre kattintani, elindítva ezzel valamilyen nem

Page 19: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 19/32

18

kívánatos alkalmazást. Ha viszont más szoftvereket is használnak egy idő 

  ben az általunk készítettel,mindenképpen adjunk arra lehet

ő 

 séget, hogy a programot minimalizálni lehessen, és futásakor el lehessen érni aStart menüt és a tálcát.

A főképernyőA szoftverek egyik legfontosabb eleme (vizuális szempontból), a programmodulok közötti összeköt

ő 

kapocs, a f ő 

  képernyő 

 . Nem szabad tehát elhanyagolnunk ezt sem, a modulokhoz hasonlóan, körültekintő 

  en kell

bánnunk vele. A f ő    képernyő    milyensége első   sorban attól függ, hogy alkalmazásunk hagyományos SDI, vagyMDI ablakokat használ.

Hagyományos ablakok esetén a hagyományos f ő 

  képernyő 

 -struktúra használata ajánlott. Ez azt jelenti,hogy a program különböz

ő 

  funkcióit a f ő 

  képernyő 

 n elhelyezett nyomógombokhoz rendeljük (ha túl sok ilyenfunkció van, használhatjuk azt a megoldást, amikor egy gombot lenyomva egy legördül

ő 

  menü [Popup Menu] jelenik meg). A gombok elhelyezkedése esztétikailag és logikailag is fontos, de lényegében a fejleszt

ő 

  ízlésehatározza meg milyenségét.

Ha MDI ablakokat használunk, a program funkcióit az ablak tetején, menüsorban, illetve eszköztár-sorban érdemes elhelyezni. Mindkett

ő 

 höz teljes támogatást nyújt a Windows. Megadhatunk pl. egy menüpontot(WindowMenu), amelybe a Windows automatikusan beírja a nyitva lév

ő 

  gyermekablakok listáját, és segítségévelkönnyedén át is válthatunk egy másikra.

Igényes fejlesztő 

  k szépíthetik az alkalmazásukat úgy is, hogy a f ő 

  képernyő 

  hátterébe valamilyen képethelyeznek el (ilyenkor a  TImage nyújtja a segít

ő 

  kezet). Internetrő 

  l letölthető 

  komponensekkel a gombok teljes

átalakítását („textúrázását”) is meg lehet oldani. Minden csak ötletek kérdése. A felhasználók pedig szívesebbendolgoznak szép programokkal.

A többi ablak szépítését azonban nem kell túlzásba vinni, mert ez sokszor a használhatóság káráraválhat.

Egy hagyományos f ő 

  képernyő 

 , textúrázott gombokkal és háttérrel…

…és egy egyszer ű 

 bb elrendezésű 

 , lenyíló menüvel

Táblamegjelenítő ablakokMegszokott dolog, hogy ha adatbázisról beszélünk, rögtön összekapcsolt táblázatok sokaságáragondolunk. Adatbázis-kezel

ő 

  programok sokasága jeleníti meg táblázatban adatait. Ez azonban nem jelenti azt,hogy ez minden esetben jó. Csak akkor szükséges ilyen ablakokat alkalmazni, ha szükség van a rögzített adatok

Page 20: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 20/32

19

sokaságának áttekintésére, összehasonlítására. (Tehát egy jegykiadó-nyomtató programban fölösleges az eddigfölvett jegyek listájának megjelenítése, hiszen visszamen

ő 

  leg csak bizonyos kimutatásokat, lekérdezéseketvégzünk, de a konkrét adathalmazra nincs szükségünk.)

Ezek után, ha úgy gondoljuk, hogy mégis szükségünk van táblázatra, azt inkább csakadatmegjelenítésre, és nem szerkesztésre ajánlatos használni. A táblázattal történ

ő 

  adatmegjelenítésnek van egynagy el

ő 

 nye: ha ügyesen csináljuk, a felhasználó egyszerű 

 en és gyorsan navigálhat, kereshet, rendezhet, szű 

  rhetbenne.

Egy általános táblázat-ablaknak a következő 

  részei lehetnek: (1) maga a táblázat, (2) a navigációs panel,(3) m

ű 

 veletvégző 

  panel, (4) szű 

  rő 

  panel, (5) információs sáv (státuszsor). Ezek közül természetesen nemkötelez

ő 

  mindnek szerepelni, és egyéb dolgot is megjeleníthetünk, igény szerint.A táblázatot (1) természetesen  DBGrid -del valósítjuk meg (err

ő 

 l a komponensrő 

 l már szót ejtettünk aIV. fejezetben). Az els

ő 

  , amit meg kell tennünk vele, hogy testre szabjuk a megjelenítését az   Options   és aColumns tulajdonságok segítségével. Beállítjuk a megjelenítend

ő 

  mező 

 ket, esetleg azok színét, méretét, stb. ezekután gondolnunk kell az eseményeire. Gyorsbillenty

ű 

  ket definiálhatunk az   OnKeyPress   és az   OnKeyDownesemény segítségével, és itt tudjuk megoldani a rendezés kérdését is. A leggyakoribb megoldás ugyanis egytáblázatban a rendezés beállítására, hogy amelyik oszlop fejlécére kattint a felhasználó, a szerint az oszlopszerint rendezzük az adatokat. Ehhez azonban tudni kell, hogy rendezni csak akkor tudunk, ha azt az adatokatbiztosító   Table   lehet

ő 

  vé teszi, azaz a definíciójában szerepel az adott mező 

  szerinti index (Query  használataesetén a rendezési sorrendet csak a lekérdezés módosításával és újrafuttatással változtathatjuk meg).Amennyiben erre lehet

ő 

 ségünk van, a megoldás egyszerű 

  : a DBGrid OnTitleClick  eseményében figyeljük, hogy

melyik oszlopra történt a kattintás, és az annak megfelelő 

  értékre állítjuk a tábla indexét. Érdemes még ilyenkora fejléc betű 

 típusát megváltoztatni (pl. félkövérre, vagy aláhúzottra), hogy könnyen látható legyen az aktuálisrendezés. Arra figyeljünk, hogy a lookup mez

ő 

 k szerint nem lehet rendezni. Így csak a kapcsolatot megvalósítókulcs szerint rendezhetünk (ami általában szám), és egyáltalán nem garantált, hogy ez meg fog felelni azízlésünknek. Megoldás lehet az, hogy SQL lekérdezéseket használunk, illetve ezeket vegyítjük a táblákkal.(Találkoztam már olyan megoldással, hogy a két legfontosabb   lookup-mez

ő 

  höz tartozott egy-egy  Query, és haazon mez

ő 

 k fejlécére kattintott a felhasználó, a tábla helyett a   Query-t kapcsolta be a program a táblázatadatforrásául, a Query-t pedig minden adatmódosításnál újrafuttatta. Ez kissé lassúnak t

ű 

 nhet, de mindenképpencélravezet

ő 

  .).A navigációs panel (2) a másik dolog, amire szinte mindig szükség van. Szerepe akkor nagy, ha már

nagyon sok adatunk van a táblázatban, és gyorsan el szeretnénk jutni egy adott rekordhoz. Ami biztosan kell, aza táblázat els

ő 

  és utolsó rekordjára mozgató gomb (segítségünkre van a   TDBNavigator ). A másik egy, akulcsmez

ő 

 khöz rendelt ugró-sáv. Ezt egy egyszerű 

  TEdit -tel és egy gombbal tudjuk megvalósítani. Ha a gombra

kattint a felhasználó, az adatbázisban megkeressük a begépelt szöveghez legközelebb eső 

  adatot(Table.FindNearest ). Fontos, hogy ezt csak kulcsmező 

  kkel tudjuk elvégezni. Nehezebb a dolgunk, ha egylookup-mez

ő 

  értékeit is bevesszük. Ekkor abban a táblában kell keresni, amelyikbő 

  l a  lookup szedi a rekordokat,és a talált rekord kulcsértékét kell megkeresni a táblázatunkban.

Külön panelen illik elhelyezni azokat a gombokat, amelyekkel mű 

 veleteket végezhetünk (3). A háromalapvet

ő 

  mű 

 veletnek mindenképpen ott kell lennie (beszúrás, módosítás, törlés), de ide kerülhetnek a nyomtatás,sz

ű 

 rés és egyéb lekérdezések gombjai. Ha lehet, használjunk  BitButton-okat (TBitBtn), és helyezzünk ki rájukkülönböz

ő 

  kis képeket. Bizonyos esetekben használhatunk szerkesztő 

  objektumokat is ( DBEdit, DBComboBox,stb.), ment 

ő 

  és elvet ő 

  gombokkal kísérve.A sz

ű 

  rő 

  panelnek (4) nem muszáj mindig látszania, inkább egy gombbal ki-be kapcsolgathatjuk. Asz

ű 

  rő 

  t úgy kell elkészítenünk, hogy a lehető 

  legtöbb adatra tudjunk vele szű 

  rni. Itt is fontosnak tartommegemlíteni, hogy lookup típusú mez

ő 

 kre nem lehet szű 

 rni, ezt máshogy kell megoldanunk, például úgy, hogy alookup  mez

ő 

  forrástáblájából minden adatot kilistázunk egy  ComboBox-ba, és egy adott elem kiválasztásánál

rákeresünk arra a kapcsolt táblában, majd a talált mező 

  kulcsértéke szerint szű 

  rjük a táblázatunkat. AComboBox-ot normál szű 

  rő 

 knél is használhatjuk, de azt minden adatmódosítás esetén újra fel kell tölteni. AComboBox-ba elhelyezhetünk egy   (mind)   elemet is, melyet kiválasztva az adott mez

ő 

  re való szű 

  réstkikapcsoljuk. A  mind -et azért kell zárójelbe tenni, mert a zárójelet rendezésnél a Windows el

ő 

 re helyezi, ígybiztosak lehetünk abban, hogy ez a felirat az els

ő 

  elemek között lesz (a rendezéshez be kell kapcsolni aComboBox-on az AutoSort -ot). Sz

ű 

 réshez ízlés szerint természetesen használhatunk Edit -et is, de vigyázzunk: haaz   Edit OnChange   eseményére (ez az esemény akkor hívódik meg, amikor változtatjuk az   Edit   tartalmát)változtatjuk a sz

ű 

  rő 

  feltételt, erő 

 sen lelassíthatjuk alkalmazásunkat azzal, hogy minden billentyű 

  leütésre hosszasm

ű 

  veleteket végzünk. Használjunk inkább frissítő 

  -gombot.A mai alkalmazásokban teljesen általánosnak mondható a státuszsorok (5) használata. Mi se

ódzkodjunk ilyeneket használni, ha másra nem, hát arra, hogy az egérmutató alatt lévő 

  objektumról adunk bennerövid leírást. Ezt úgy tehetjük meg, hogy az objektumok  Hint  („buborék-súgó”) tulajdonságába egy | jel után egyhosszabb leírást írunk, az   Application.OnHint    eljárásba pedig megadjuk, hogy

StatusBar.SimpleText:=Application.Hint.   (Delphi 5-öt használók ezt az   TApplicationEvents   komponenssegítségével tehetik meg, a régebbi verziókban ezt kézzel kell hozzárendelni az eseményhez úgy, hogy készítünkegy saját eljárást, és egyenl

ő 

  vé tesszük az   Application.OnHint   értékével. Ld:   Delphi Help: Hint, OnHint,

Page 21: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 21/32

20

GetLongHint example.) Természetesen a státuszsorba kiírhatjuk az aktuális rekord állapotát, vagy bármi mást,amit a felhasználóval közölni akarunk (a  TStatusBar  használatáról ld. a Delphi Help: TStatusBar ).

A gyorsabb használhatóság érdekében nagy hangsúlyt kell fektetnünk a billentyű 

 kombinációkalkalmazására. Ide nem csak a gombokon lév

ő 

  aláhúzott karaktereket vehetjük be, hanem használhatjuk afunkcióbillenty

ű 

 ket is. Ebben az esetben az  OnKeyDown eseményt használhatjuk.

Egy táblamegjelenít ő 

  ablak, szű 

  r ő 

  kkel

AdatlapokEgy rekord szerkesztésére legjobb eszköz az adatlap. Itt minden szükséges információ egy helyen van,

de mindig csak az aktuális rekordról kapunk információkat. Adatlapot a legegyszerű 

  bben úgy készíthetünk, hamegnyitjuk a megfelel

ő 

  tábla FieldsEditor  ablakát, kijelöljük a szükséges mező 

 ket, majd egérrel ráhúzzuk az újablakra. A hatás: megjelennek a megfelel

ő 

  típusú, méretű 

  , megfelelő 

  en beállított szerkesztő 

  komponensek, amegfelel

ő 

  címkékkel ellátva. Ha ezek mellé kiteszünk egy   DBNavigator -t, kész is az adatlapunk. Azigényesebbek persze saját gombokat is használhatnak. Néha célszer

ű 

  azt a cselt bevetni, hogy az adatlapmegjelenésekor nem szerkeszthet

ő 

  (hiába próbál a felhasználó valamit is módosítani), csak a szerkesztő 

  gombmegnyomása után. Ehhez az adatlaphoz tartozó DataSet AutoEdit  tulajdonságát kell false-ra állítanunk.

Ennél nagyobb gondosságra is szükség van azonban, ha egy, a program törzsét képező 

  táblázat

adatlapját készítjük. Nem mindegy ugyanis a mez ő   k sorrendje, elhelyezkedése. Ha például az adatlapnak léteziknyomtatott megfelel

ő 

 je is (amit ezen adatlap alapján töltenek ki, vagy fordítva), a számítógépen lévő 

  adatlap jó,ha a papíron lév

ő 

 nek a pontos mása. De ha nem is áll fenn ilyen helyzet, ismét gondoljunk arra, hogy ezt aprogramot a felhasználóknak írjuk, így az

ő 

  kényelmük a legfontosabb. Oda kell figyelni arra, hogy akomponensek sorrendje (Tab Order ) megfelel

ő 

  legyen, azaz a  TAB  billentyű 

  t nyomogatva milyen sorrendbenlépkedhetünk az adatlapon (ennek beállítása: a   form   vagy   label  kijelölése után   Edit/Tab Order  menüpont).Érdemes továbbá a mez

ő 

  khöz gyorsbillentyű 

  ket rendelni, hogy minél könnyebb legyen egy adott mező 

  hözugrani. Ehhez a címkék szerepét betölt

ő 

  label-ek feliratában (Caption) az &  jellel meg kell jelölni a megfelelő 

betű 

  ket (Az & jel utáni karaktert a Windows automatikusan aláhúzza), majd a   FocusControl   nevű 

tulajdonságukban be kell állítani a hozzárendelt mező 

 t. Ha ezt megtettük, a felhasználó az aláhúzott betű 

  ALT billenty

ű 

 vel együtt történő 

  lenyomásával a FocusControl-ban megadott mező 

 be tud ugrani, és azt szerkeszteni.A   lookup  mez

ő 

  kre általában  DBLookupComboBox-okat szokás használni az adatlapokon. Ennek az ahátránya, hogy csak a listában szerepl

ő 

  elemek közül választhatunk. Ez persze egyértelmű 

 en következik a lookup

mező    mű    ködéséb ő    l – mondhatnánk. De a felhasználó nem tudja, mi az a   lookup. Ez nem is róható föl ellene.Inkább a fejleszt

ő 

 nek kell megoldania, hogy ha nem szerepel egy elem a listában (törzsadattáblában), amire éppszükség lenne, akkor valamilyen módon fel lehessen venni úgy, hogy ne kelljen az adatlapot elhagyni. Alegegyszer

ű 

  bb, ha a   lookupcombobox   mellé helyezünk egy nyomógombot, amellyel elérhető 

  az adotttörzsadattábla ablaka, ahol módosíthatjuk a tartalmát. Másik megoldás, ha egy új elemet létrehozó gombothelyezünk ki, amely egy üres adatlapot jelenít meg. Ezt kitöltve a program fölveszi az elemet a törzsadattáblába,majd azt beírja a lookup mez

ő 

  be.Az adatlapok készítésekor gondolnunk kell arra, hogy minél automatikusabban m

ű 

  ködjenek. Egyrésztlétezhetnek alapértékei az egyes mez

ő 

 knek (pl. dátum esetén az aktuális dátum), másrészt elő 

 fordulhat, hogy egymez

ő 

  értékébő 

 l lehet következtetni egy másik mező 

  értékére is. Jó példa erre, hogy ha egy megrendelő 

  adatlapona partner kiválasztása után, ha annak van bankszámlaszáma, a fizetésmódnál a banki átutalást, ha pedig nincs,akkor a készpénzfizetést jelöli ki a program. Az ehhez hasonló módszerek hosszútávon jól beváltják a hozzájukf 

ű 

 zött reményeket.

Egy igen hasznos és egyben látványos megoldás a „színváltós” mez ő   objektumok használata. Ez azt jelenti, hogy a mez

ő 

  k színe az állapotuktól függ: más színe van, ha szerkeszthető 

 , ha csak olvasható; de ami alegfontosabb: más színe van, ha aktív (benne van a kurzor). Ez egy nagyon látványos, de legalább annyirahasznos lehet

ő 

 ség, amit a Delphi komponensek írói még nem fedeztek fel, de már jó pár alkalmazásban lehet

Page 22: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 22/32

21

találkozni vele. Ha valaki ilyet szeretne használni a programjában, két dolgot tehet: vagy ír egy sajátkomponenst, ami tudja ezt a lehet

ő 

  séget, vagy pedig a programon belül kezeli le ezt a problémát. Az első 

megoldás kicsit bonyolultnak tű 

 nik, de csak egyszer kell megtenni. A másodikat egyszerű 

 bb, de minden egyesprogramba külön bele kell építeni. Ha komponenst írunk, el

ő 

  ször tanulmányozzuk át a Delphi Help megfelelő 

fejezeteit (Creating a new component ), csak aztán fogjunk bele. Ha ez már meg van, arra kell figyelni, hogy aszínváltást nem az onEnter , illetve onExit  eljárásokba, hanem a

 procedure   CMEnter(var   Message: TCMGotFocus);   message   CM_ENTER;

illetve a

 procedure   CMExit(var   Message: TCMLostFocus);   message   CM_EXIT;

deklarációjú eljárásokba kell foglalni.Abban az esetben viszont, ha programon belül oldjuk meg, nem kell mást tenni, mint hogy a megfelel

ő 

objektumok onEnter  és onExit  eseményében megadni a megfelelő 

  színeket. Egy eseménykezelő 

  persze egyszerretöbb objektumhoz is tartozhat, ekkor viszont célszer

ű 

  a következő 

 képpen megadni a színeket:

(Sender   as   TControl).Color:=SajatSzin;

Sorolhatnám még azon lehető 

  ségeket, amelyekkel szebbé és használhatóbbá tehető 

  egy alkalmazás.Minden csak a fejleszt

ő 

  fantáziáján és ötletességén múlik.

Egy adatlap, „színváltós” beviteli mező 

  kkelFigyeljük meg, hogy a kapcsolódó táblákba (hirdet 

ő 

  neve, szervező 

  neve) közvetlenül vehetünk fel új rekordot az„Új hirdet ő   ”, ill. az „Új szervez ő   ” feliratú gombokkal. További érdekesség, hogy a reklám szövegét formázni is

lehet (RTF).

Műveletvégző ablakokEbbe a kategóriába sorolom azokat a párbeszédablakokat, amelyek nem egyszer

ű 

  adatbázis-manipulációt, hanem valamilyen összetettebb m

ű 

  veletet végeznek. Ezeket azért kell elkülönítenünk, mertfelépítésükben, m

ű 

 ködésükben teljesen másak, mint mondjuk az adatlapok. Ezeket az ablakokat általában arrakészítjük fel, hogy valamilyen (általában meghatározott) felhasználói m

ű 

  veletsorozatra valamilyenmeghatározott adatbázis-m

ű 

  veletsorozatot hajtson végre. Itt ne egy új név felvételére gondoljunk egytelefonkönyv-program keretein belül, hanem például egy éttermi rendszer fizetés-moduljára, ahol egy számláhoztöbb asztal, tetszés szerinti rendelései tartozhatnak.

Az ilyen feladatok elvégzésére három módszer kínálkozik. Az els ő    , amikor egy ablakra rakjuk ki azösszes szükséges objektumot, melyekkel elvégezhet

ő 

  a mű 

 veletsor. Itt figyelni kell az átláthatóságra, és arra,hogy ne legyen az ablak zsúfolt. Ha nem elég nagy az ablak, és nem fér el rajta minden, akkor jöhet szóba amásodik lehet

ő 

 ség, az egymás után felbukkanó ablakok használata. Ezeknél fontos, hogy mindegyiken legyen

Page 23: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 23/32

22

visszalépési lehető 

 ség ( Mégsem gomb). A harmadik módszer a legszebb, és manapság egyre nagyobb teret hódítmagának: a varázsló. Ennek persze csak akkor van értelme, ha szabadon oda-vissza lépkedhetünk benne, illetvebármikor kiléphetünk bel

ő 

 le. Nagyon fontos, hogy kerüljük a felesleges szövegeket és oldalakat (üdvözlő 

  oldal,elköszön

ő 

  oldal, stb., ld. legtöbb  Microsoft  varázsló), csak a lényegre figyeljünk. Jó, ha minden oldalon vanvalamilyen alapértelmezett beállítás (lehet ez az el

ő 

  ző 

  alkalommal használt érték), mert így még könnyebbenvégig lehet menni a varázslón. A Delphi sajnos varázsló komponenset nem tartalmaz, de nagyon egyszer

ű 

  enkészíthetünk magunknak egyet a  TNotebook  (Win 3.1 fül) segítségével, amely több lapból áll, és lapjaira bármitföltehetünk.

 Rendelés az éttermi rendszerrel (m ű    veletvégző    ablak): a típusokra egyszer kattintva kiválaszthatjuk a baloldalonmegjelenítend 

ő 

  tételeket, azokra egyszer kattintva pedig felvehetjük a rendelésbeő 

  ket.

KimutatásokAz adatbázis-kezel

ő 

  programok fontos részét képezik a kimutatások. Ezek alatt általában valamilyenszempontból csoportosított, valamilyen sz

ű 

  rő 

 vel ellátott, valamilyen rendezési elvet követő 

  adatmegjelenítéstértünk. A feladat bonyolultságától függ, hogy egy kimutatásnak hogyan kell kinéznie, mit kell megmutatnia. Aza jó kimutatás, amellyel minél több szempontból lehet adatokat csoportosítani. Kimutatások készítésénél szinteelkerülhetetlen az SQL-lekérdezések (Select -ek) használata. A lekérdezésekkel természetesen lehet számítottadatokat is megjeleníteni, összevonni, stb. (b

ő 

 vebbeket a Local SQL Guide-ban).Az SQL-lekérdezéseket használó kimutatások fontos jellemz

ő 

  je, hogy menet közben nem tudunk

változtatni a feltételeken (kivéve a szű 

  rő 

  ket), csak ha újrafuttatjuk a lekérdezést. Ezért célszerű 

  a feltételeket akimutatás megjelenítése elő 

  tt bekérni a felhasználótól, majd lefuttatni az SQL-eket, és aztán megjeleníteni azokeredményeit. Ezek után sem szabad azonban elfeledkezni a feltételekr

ő 

  l: érdemes azokat kijelezni a kimutatás-ablakban is. A kimutatás-ablak szerkezete tetsz

ő 

  leges lehet, de ha egyszerre több táblázatot jelenítünk meg, aztmindenképpen érdemes egy  TPageControl megfelel

ő 

 en feliratozott lapjaira helyezni, hogy minél áttekinthető 

  bblegyen.

Gyakran használunk kapcsolt táblákat, amikor egy adat törzse egy táblában, az egyéb adatai (amelybő 

  ltöbb rekord is lehet) pedig egy másik táblában szerepelnek. Ekkor a legszebb megoldás, ha mindkét táblázatotmegjelenítjük, de úgy, hogy az egyik táblában egyszerre csak egy, a másik táblában kiválasztott elem részletei

 jelenjenek meg. Ezt pedig a legegyszerű 

  bben úgy tehetjük meg, ha az egyik tábla   MasterSource-át és MasterFields-ét a másik táblának megfelel

ő 

  DataSource-ra, illetve mező 

  jére állítjuk.

Ha pl. van két táblánk:

TableNevek(személykód, név) (DataSourceNevek)TableLakas(személykód, lakhely) (DataSourceLakas)(Egy személyhez több lakhely is tartozhat.)Ekkor a következ

ő 

 ket kell tennünk:

Page 24: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 24/32

23

TableLakas.MasterSource:=DataSourceNevek;

TableLakas.IndexFields:=’személykód’;

TableLakas.MasterFields:=’személykód’;

Példa a kimutatásra: zárás az Étterem programmal

Folyamatkijelzők (ProgressBar -ok)El

ő 

  fordulhat, hogy a programunk olyan mű 

  veleteket végez, amelyek viszonylag idő 

  igényesek. Ekkornem túl jó, ha ezt csupán egy homokórás egérkurzorral jelezzük (ezt egyébként az   Application.Cursor crHourGlass értékre állításával tehetjük meg), hanem folyamatkijelz

ő 

 ket (ProgressBar -okat) használunk. Így afelhasználó meg tudja ítélni, hogy mennyi van még hátra, és az is nyilvánvalóvá válik számára, hogy a programnem fagyott le, hanem dolgozik.

Erre a feladatra természetesen a   TProgressBar    komponens használható. A dolog egyszerű 

  :megszámoljuk hány m

ű 

 veletet végzünk, és azt megadjuk a  ProgressBar -nak ( Max). Ezután minden mű 

  veletetkövet

ő 

 en léptetjük (StepIt ). Ha tudjuk, hogy a mű 

  veletek nem lesznek folyamatosak (a mű 

 veletek végrehajtásiideje között nagyok a különbségek), célszer

ű 

  a   Smooth   értéket kikapcsolva hagyni, így nem olyan feltű 

  nő 

  .Kalkulálhatunk azzal is, hogy egy hosszabb m

ű 

 velet után esetleg többet léptetünk egyszerre. Ami nagyon fontos,

hogy mindenképpen legyen valóság alapja a folyamatkijelző 

 nknek. Ha tehetjük, célszerű 

  szövegesen is közölni,hogy éppen mit csinál a program (ez hibakeresésnél is jól jöhet).Mindez azonban semmit nem ér, ha nem jelenik meg. Normális esetben ugyanis a Windows nem

dolgozza fel a komponenseknek küldött üzeneteket, miközben mi egy eljáráson belül mű 

 veleteket végzünk. Eztnekünk kell megtenni, az   Application.ProcessMessages   segítségével (ezt minden   StepIt   után be kell írnunk).Ezzel megoldódik a probléma. Természetesen máshol is alkalmazhatjuk a   ProcessMessages  metódust, aholzavaró, hogy sokáig nem frissülnek az ablakok.

Nyomtatás, riportGyakran van arra szükség, hogy amit az adatbázisunkban (vagy esetleg SQL lekérdezésünkben)

tárolunk, papíron is megjelenítsük. Erre a Delphi is lehető 

  séget nyújt a   QuickReport  komponenscsomagsegítségével (QReport   fül). Az új riportot elhelyezhetjük a form-on, de létrehozhatjuk önálló ablakként is

(File/New/Report ). Használata nagyon egyszerű 

  : beállításait a jobb egérgombbal elérhető 

  menübő 

  l és az Object  Inspector  segítségével tehetjük meg. A riportra ezek után rápakolhatjuk a megfelelő 

  komponenseket a  QReport eszköztárból. Használatukat a mellékelt példaprogramok segítségével könnyen megérthetjük (a Delphikönyvtárán belül a Demos/Quickrpt  könyvtárban találjuk

ő 

  ket). A lényege az, hogy Band -eket kell elhelyeznünk,

Page 25: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 25/32

24

amelyeknek különböző 

  típusai lehetnek ( BandType   tulajdonság), majd ezekben helyezzük el az adatokatmegjelenít

ő 

  komponenseket (pl.   QRDBText ). A komponenseket széleskörű 

  en konfigurálhatjuk, kényünk-kedvünk szerint.

Programunkon belül a   QuickReport Preview metódusát meghívva nyomtatási képet mutathatunk meg.Ezt célszer

ű 

  alkalmazni, mert a felhasználók szeretik látni, mi fog a nyomtatott papírra kerülni. A Preview ablakhasználata egyszer

ű 

  , de célszerű 

  magyarítani a Delphi könyvtárán belül a Lib/qrprev.dfm fájl megnyitásával ésátírásával.

Egy QuickReport-tal készített nyomtatási kép

ProjectHa már mindennel kész vagyunk, nem árt, ha végignézzük a  Project  beállításait (Project/Options). A

Forms   lapon beállíthatjuk, hogy melyik form legyen az alkalmazásunk f ő 

  formja ( Main Form), valamint hogymely formokat hozza létre automatikusan a program (amelyeket futásid

ő 

 ben, kézzel kívánunk létrehozni, azokattöröljük a listából). Az  Application lapon megadhatjuk, mi legyen a program neve ( Application.Title, ez jelenikmeg a tálcán) és hogy mi legyen az ikonja ( Application.Icon). Bármennyire is lényegtelennek t

ű 

  nik, nagyhangsúlyt kell fektetnünk az alkalmazás ikonjának kiválasztására. A felhasználók ugyanis az alapján azonosítjáka programunkat, így annak utalnia kell funkciójára, vagy mindenképpen egyedinek, az általában használatosikonoktól eltér

ő 

  nek kell lennie. A  Compiler  oldalon a fordítóra vonatkozó beállításokat tehetjük meg. Végső 

fordítás esetén (ha már teljesen kész vagyunk a programmal, és nem óhajtunk több hibakeresést végezni)célszer

ű 

  a   Runtime errors   és a   Debugging   panelen mindent kikapcsolni, ezzel is csökkentve a programer

ő 

  forrásigényét. Hasonló okokból érdemes bekapcsolni a  Code generation-ban az Optimization-t. Még egy fülvan, ami érdekes számunkra, ez pedig a   Version info. Itt a programnak azon tulajdonságait állíthatjuk be,amelyeket a Windowsban, az exe tulajdonság-lapján is megtekinthetünk. A mez

ő 

  ket kitöltve megadjuk averziószámot (a Build  szám automatikus növelésére is van lehet

ő 

 ségünk), a szerző 

 t, a tulajdonost, stb.Ha már ezeken is túl vagyunk, jöhet az utolsó  Build , majd a használat. Sok sikert!

Page 26: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 26/32

25

V. Egyéb problémák

Hibakezelés 

Ebben a részben a hibák kezelésének alapjaival ismerkedünk meg, hogy itt szerzett tudásunkatfelhasználhassuk az adatbázis-kezel

ő 

  rendszerek készítése során, hiszen egy adatbázis kezelése során rengeteg

hibalehető    ség van, sokuk független attól, hogy a programot hogy írtuk meg.A Windows a hibakezelést ún.   exception-ökkel oldja meg. (Az   exception   jelentése: kifogás, kivétel,

kivételes esemény, megszakítás. A magyar nyelvű 

  Windows-okban   kivételnek fordítják, holott a   kivételesesemény, vagy a   megszakítás   jobban illene rá.) Kivétel akkor jön létre, ha egy hiba, vagy egyéb eseménymegszakítja a program normál futását. A kivétel az irányítást egy kivétel-kezel

ő 

 nek (exception handler ) adja át,ami lehet

ő 

 séget ad arra, hogy elkülönítsük a program normál futását a hibakezeléstő 

 l. A kivétel információt (amiáltalában egy hibaüzenet) tud átvinni attól a ponttól, ahol el

ő 

  idézték, addig a pontig, ahol lekezelik. Ha egyalkalmazás használja a   SysUtils   unitot, minden futtatási hiba (runtime error ) automatikusan kivétellékonvertálódik. Olyan hibák, amelyek más esetben megszakítanák a program futását – mint pl. kevés memória,nullával való osztás, általános védelmi hiba – elfoghatók és kezelhet

ő 

  k. A kivételek is objektumok, ígyhasználatuk könnyen elsajátítható.  (Delphi Help: Exceptions: Owerview)

Saját magunk is létrehozhatunk ilyen kivételeket, a   raise   kulcsszó segítségével. A legegyszerű 

  bben akövetkez

ő 

  példa alapján járhatunk el:

raise   EMathError.Create(‘Hiba történt! Kutykurutty!’);

A hibák kezelése sem sokkal bonyolultabb ennél. A legegyszerű 

 bb, ha a problémás mű 

 veleteket ún. try-blokkba tesszük. Ez a következ

ő 

 képpen néz ki:

Try

X := Y/Z;

except

on   EZeroDivide   do   HandleZeroDivide;

end ;

Az on  után a hiba típusát (pontosabban a kivétel osztályának nevét) írjuk, a  do  után pedig meghívhatjuka kezel

ő 

  eljárásunkat.Ha azt szeretnénk, hogy a kritikus m

ű 

  velet után mindenképpen végrehajtódjanak bizonyos mű 

 veletek,

és csak azután keletkezzen kivétel, használhatjuk a try..finally szerkezetet is:

Reset(F);

try

{...} // fájlmű 

  veletek az F fájllal

finally

CloseFile(F);

end ;

A hibakezelésnek van még egy fontos része, ez pedig a komponensek hibaeseményei. Nevük általában akövetkez

ő 

  képpen néz ki:   On*Error . Nevük utal mivoltukra, pl. a  TTable OnDeleteError   eseménye akkorkeletkezik, ha egy adat törlése meghiúsult. Ezek használatával rengeteg hibalehet

ő 

  séget kiszű 

  rhetünk,kezelhetünk. Ehhez jól kell tudnunk használni az  Exit , az Abort , ill. a Halt  eljárásokat.

Az   Exit   kilép az aktuális eljárásból. Ha a f ő 

 programban van, a program kilép, ha egy meghívotteljárásban van, visszaadja a vezérlést arra a pontra, ahol az eljárást meghívtuk. Akkor használjuk, ha olyan esetáll fenn, amely mellett az eljárás nem folytatható.

Az   Abort  megszakítja az aktuális folyamatot anélkül, hogy hibát generálna. Használatát a következő 

példa jól mutatja:

 procedure   TForm1.Table1BeforePost(DataSet: TDataSet);

 begin

if   DBEdit1.Text = ''   then

Abort;

end ;

Tehát a Table1 tábla mentés (Post ) elő 

 tt meghívott eseményében ( BeforePost ) megnézzük, hogy üresenhagyta-e a felhasználó a DBEdit1 által reprezentált mez

ő 

 t. Ha igen, az  abort -tal megszakítjuk a mű 

 veletet, és ígynem engedélyezzük a mentést.

A Halt  azonnal megállítja a program futását, és a paraméterként megadott hibakóddal kilép. Csak akkorhasználjuk, ha a program futtatása egyáltalán nem folytatható.

A fentiek ismeretében nyugodtan elkezdhetünk hibaelhárító, kezelő 

  programrészeket írni.

Page 27: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 27/32

26

Hálózat használata Paradox rendszerrel 

Gyakori feladat, hogy egy PARADOX adatbázist több számítógéprő 

  l szeretnénk egyszerre használni.Ehhez azonban még nem feltétlenül szükséges kliens-szerver alkalmazást készíteni, ha jól dolgozik az ember,megfelel

ő 

  platform erre a PARADOX is. Úgy kell tehát megtervezni az alkalmazásunkat, hogy ne okozzon nekigondot, ha vele egy id

ő 

 ben egy másik program is dolgozik az adatbázisán. A probléma látszólag ugyanaz, mintamikor egy számítógépen egyszerre futó több program éri el ugyanazt az adatbázis. Az erre való felkészítésazonban nem elég. Az adatbázis ugyanis másként viselkedik, ha a programok nem egyazon számítógépen futnak.

Első   nek arra kell figyelnünk, hogy ha egy program szerkesztésre megnyitott egy adatot, azt egy másikprogram csak olvasásra tudja megnyitni. Ezért le kell kezelnünk azt az esetet, amikor a másik program ismegpróbálja szerkeszteni azt. Ennek a legegyszer

ű 

 bb módja, ha a táblák   OnEditError  eseményébe beírjuk akövetkez

ő 

  t: E.Message:= 'Nem sikerült megnyitni az adatot. Lehet, hogy egy másik felhasználó épp szerkeszti.'; .Ezzel azt érjük el, hogy hiba esetén a Delphi ezt az üzenetet fogja kiírni. A többivel nem kell foglalkoznunk,hiszen a Delphi automatikusan megszakítja a hibát okozó folyamatot.

Gyakori eset, hogy egy adatbázisban egy egyed azonosítására egy számértéket (kódot) használunk, amitminden egyes új egyed felvételekor eggyel növelünk. Ez a növelés pedig úgy történik, hogy az új egyed a kódjátúgy kapja meg, hogy a legnagyobb kódhoz hozzáadunk egyet. Ekkor azonban el

ő 

 fordulhat az, hogy két programegyszerre hoz létre egy-egy új egyedet (vagy az egyik megnyitja, de még nem menti, amikor a másik ismegnyitja). Így mindkét program azonos kóddal szeretné elmenteni az adatot, ami nem túl szerencsés (és nem islehet, ha ez a kód az egyedüli els

ő 

  dleges kulcs). Az ehhez hasonló esetek megoldására az tű 

 nik megfelelő 

  nek,hogy mihelyst létrehozzuk az új egyedet, megkapja a megfelel

ő 

  kulcsot (kódot), és rögvest mentjük is, majd újramegnyitjuk szerkesztésre. Így a felhasználó vagy a program korlátlan ideig „gondolkodhat” az adatok kitöltésén,az egyed helye biztosított az adatbázisban.

Fontos kérdés hálózat használata esetén a frissítés megvalósítása. Minden mű 

  velet elő 

  tt frissíteni, am

ű 

  veleteket követő 

 en pedig rögzíteni kell az adatokat. A programok ugyanis nem veszik „maguktól” észre aváltozásokat, amiket egy másik program okozott. Ezért célszer

ű 

  a táblák  Refresh  metódusát használni, mielő 

  ttvalamilyen m

ű 

 veletbe kezdünk. Mivel a BDE az adatokat a memóriában (bufferekben) tárolja, azok nem íródnakki rögtön a merevlemezre, így a változásokat csak az adott számítógépen futó programok érzékelhetik (mivelegyszerre csak egy BDE futhat, és az szolgálja ki az összes BDE-programot). Gondolnunk kell tehát arra, hogyegy esetleges meghibásodás vagy áramkimaradás esetén, továbbá ha egy másik számítógép szeretné az aktuálisadatokat lekérdezni, ez az elv nem követhet

ő 

 . Ezért minden mű 

 velet elvégzése után érdemes a bufferek tartalmáta merevlemezre írni a   FlushBuffers   metódus segítségével, ha pedig   CacheUpdate   módot használunk, az ApplyUpdates-el (a CacheUpdate üzemmódról a TTable-nél volt szó, a IV. fejzetben).

Ezeket betartani azonban még mindig csak fél siker. Ahhoz, hogy egyszerre több számítógépen futóprogramok (pontosabban BDE-k) megfelelő 

  módon kezelhessék az adatállományokat, a BDE megfelelő 

beállításait is el kell végezni. A BDE ugyanis az adatbázis megnyitásakor annak könyvtárában ún.  lock -fájlokat(paradox táblák használata esetén ez a paradox.lck  és a pdoxusrs.lck ) helyez el. Ezekben tárolja azt, hogy melytábláknak mely rekordjait nyitották meg szerkesztésre, így azokhoz csak olvasási hozzáférést enged. Ahhozviszont, hogy egyszerre több program (BDE) a hálózaton keresztül elérje ezt az adatbázist, össze kell hangolniő 

ket. Erre szolgál a pdoxusrs.net  fájl, amit a BDE a neki beállított  NET DIR változó értékének megfelelő 

  helyrehelyez el, illetve ott keresi. Ezért fontos, hogy az összes BDE egy helyen (a hálózat egyik megosztottkönyvtárában) keresse ezt a fájlt. Tehát minden számítógépen megfelel

ő 

 en kell beállítani a  BDE Administrtator programban a Configuration/Drivers/Native/Paradox elem NET DIR paraméterét (azon a gépen, ahol az adatokvannak, a   C:\ -t érdemes beállítani, a többi gépen pedig értelemszer

ű 

  en ezt a könyvtárat képviselő 

  hálózatimegosztás nevét). Ha a beállítások nem helyesek, a program leállhat azzal, hogy az adatbázist valaki máshasználja.

Ha már a BDE beállításainál tartunk, ismét megemlítem, hogy a sikeres hálózati mű 

 ködés érdekében aConfiguration/System/INIT/LOCAL SHARE   változót   TRUE -ra kell állítani, különben az adatokat nem tudjákfrissíteni a hálózaton keresztül az alkalmazások.

Ha olyan programot írunk, amely hálózaton, több példányban mű 

 ködik, gondolnunk kell arra, hogybizonyos m

ű 

 veletek kizárólagos megnyitást követelnek maguknak (ilyen pl. a tábla ürítése, az EmptyTable), azazekkor csak egy példányban futhat a programunk. A legjobb és legegyszer

ű 

 bb az, hogy a mű 

 velet elvégzése elő 

  ttközöljük a felhasználóval, hogy zárja be a többi alkalmazást. Ha pedig mégis hiba lép föl, még egyszerfigyelmeztetjük err

ő 

  l.A fentiekb

ő 

  l látszik, hogy a Paradox rendszereket nem arra találták ki, hogy egyszerre több százprogram férjen hozzá egy adatbázishoz. Néhány program viszont tökéletesen m

ű 

 ködik hálózatban, ha betartjuk aszabályokat. A tapasztalatom azt mutatja, hogy megfelel

ő 

  odafigyeléssel ezeket a hibalehető 

  ségeket ki lehetiktatni, és végeredményben egy jól használható alkalmazást kapunk.

Page 28: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 28/32

27

Biztonsági problémák 

Elő 

 fordulhat, hogy az adatbázis megsérül. Mit kell, mit lehet ilyenkor tenni? Milyen kilátásaink vannak,hogyan háríthatjuk el a hibát, és hogyan el

ő 

 zhetjük meg? Ezek a kérdések minden fejlesztő 

  t foglalkoztatnak.Ebben a részben megoldást keresünk rájuk.

Biztonsági mentés

A károk megelő    zésének legegyszer ű    bb módja, ha biztonsági másolatot készítünk adatainkról.Egyszer

ű 

 bb fájlsérüléseket kivédhetünk azzal, hogy az adott merevlemezre másoljuk le az adatokat. Biztosraazonban csak akkor mehetünk, ha ezt egy másik adathordozóra tesszük meg (történhetnek ugyanis olyan károk,amelyek a merevlemez adatainak teljes elvesztésével járnak együtt).

Biztonsági másolat készítésére rengeteg módszer kínálkozik. Elő 

 ször is el kell döntenünk, hogy errő 

  l mimagunk kívánunk gondoskodni, vagy rábízzuk a felhasználóra. Ha nem akarjuk a felhasználókat ilyenekkelterhelni, érdemes a programunkba épített automatizmussal megoldani. Persze az is megoldás, ha különprogramot készítünk erre a célra, amit a Windows Feladatütemez

ő 

  jével adott idő 

  szakonként futtatunk. Ehhezazonban már ismerni kell a Feladatütemez

ő 

  vezérlését, vagy a telepítés során kézzel be kell konfigurálni. Ha afelhasználóra bízzuk a dolgot, beépíthetjük a programunk karbantartó moduljába, vagy írhatunk rá különprogramot, amelynek parancsikonjára kattintva automatikusan lefut. A legrosszabb megoldás, ha nem teszünksemmit, hanem a felhasználóra bízzuk, hogy készítsen kézzel (valamilyen fájlkezel

ő 

  vel, Intéző 

 vel) másolatot azadatbázis fájljairól. Ez ugyan nem valami felhasználóbarát, de ha tudjuk, hogy a felhasználó képes erre, minden

további nélkül építhetünk rá.A biztonsági mentés kétféle lehet. Vagy mindig ugyanazokat a fájlokat írjuk felül az aktuális

adatbázissal, vagy minden alkalommal egy külön dátummal ellátott könyvtárba másoljuk azokat, lehető 

  vé téve,hogy egyszerre több biztonsági másolat is elérhet

ő 

  legyen. Arra kell ekkor figyelmet fordítanunk, hogy sokbiztonsági mentés mérete már elég jelent

ő 

  s lehet, és nem túl szerencsés ezzel terhelni a háttértárakat. Meg kelltehát oldanunk az elavult biztonsági mentések törlését is.

Ami nagyon fontos: nem nekünk érdekünk az adatok biztonságos tárolása és mentése, hanem afelhasználónak.

Ha már megoldottuk a biztonsági másolat készítését, már csak a visszatöltéssel kell törő 

  dnünk. Amásolatot ugyanis azért készítjük, hogy probléma esetén könnyen vissza lehessen tölteni azt az eredetiadatfájlokat felülírva.

A feladat programozása nem bonyolult, mindössze az adatbázis fájljait kell másolgatni a   CopyFile(windows unit ) függvény segítségével. A dolog jelent

ő 

 sége ott van, hogy gondoltunk rá, és nem a felhasználónak

kell ezzel tör ő    dnie.Azt, hogy milyen id

ő 

 közönként mentünk, attól tegyük függő 

 vé, hogy mennyire gyakran változik azadatbázis, és ezek a változások mennyire rekonstruálhatók.

Adatsérülések kezeléseAz adatsérülés általában úgy mutatkozik meg, hogy program indításakor, vagy futásakor valamilyen

hibaüzenetet kapunk a BDE-tő 

  l, amelyben hibás adatfájlokról, megnyithatatlan táblákról tájékoztat minket. Azesetek többségében a hiba javítható, mivel nem a táblák, csak a hozzájuk tartozó járulékos fájlok sérülnek.Ezeket a sérüléseket általában a program futásának váratlan megszakadása okozza, amely történhet a mihibánkból, de lehet a Windows hibája is. Hálózati használat esetén egy váratlan kapcsolatszakadás (érintkezésihiba, stb.) is okozhat ilyen hibát, ugyanúgy, mint az áramszünet.

Hogy jobban lássuk a helyzetet, tisztázzuk, milyen fájlok tartoznak egy Paradox alapú adattáblához. Az

első 

  a .db fájl, ami maga a tábla. Ha ez sérül, nem tudunk igazán mit kezdeni vele, a biztonsági mentéshez kellnyúlnunk.A többi, egy táblához tartozó fájlnak a pont el

ő 

  tti neve megegyezik a .db fájl pont elő 

 tti nevével.Ha használjuk a tábla  Validity Checks  (érvényesség vizsgálat) lehet

ő 

  ségét, automatikusan létrejön egy.VAL fájl, ami ezeket a beállításokat tárolja. Ha ez sérül meg, a 12036 kódú,  .VAL file is out of date  (.VAL fájlelavult) hibaüzenetet kapjuk, mikor megpróbáljuk megnyitni az adatállományt. Ezt úgy tudjuk kivédeni, haletöröljük. Ekkor azonban elvesztjük az imént említett lehet

ő 

 ségeket, így inkább újra kell gyártanunk ezt a fájlt(hogy hogyan, azt majd a kés

ő 

 bbiekben tisztázzuk).Az els

ő 

 dleges indexszel kapcsolatos információk a .PX fájlban tárolódnak. A többi, másodlagos index-információk a .GX? és a .GY? fájlokban vannak (a ? helyén szám, illetve bet

ű 

  található, attól függő 

 en, hogyhányadik az index). Ha ezek közül sérül valamelyik, a 8961-es kódú   Corrupt table/index header   (hibástábla/index fejléc) hibaüzenetet kapjuk. Ezen a problémán a tábla újraindexelésével lehet segíteni (ha nemállítunk be indexet a táblának, hibás index-állományokkal is megnyithatjuk).

Ahhoz, hogy az imént felsorolt hibákat ki tudjuk javítani, szükségünk van a táblák definícióira. Ezértazokat el kell tárolnunk a hibajavító programban. Ezt nagyon egyszer

ű 

 en úgy tehetjük meg, hogy létrehozzuk amegfelel

ő 

  táblákat (TTable), majd jobb egérgombbal kattintva, az   Update Table Definition   menüpontsegítségével beállítjuk a mez

ő 

  deklarációkat (amiket a tábla a   FieldDefs   tulajdonságában tárol) és az

Page 29: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 29/32

28

indexdeklarációkat (ezek az  IndexDefs-ben vannak). Ha mindezt elvégeztük, a Table-ök már ismerik a tábláinkstruktúráját, definícióját. Így már bármikor létrehozhatunk egy ennek megfelel

ő 

  , üres táblát, a   CreateTablemetódus segítségével. Ezt a lehet

ő 

  séget használhatjuk fel a sérült fájlok javítására, a következő 

  képpen: hasérültnek találunk egy állományt (a .db fájl kivételével), letöröljük, majd egy SQL lekérdezésben megnyitjuk atáblát (a SELECT * FROM tábla.db  lekérdezést használva), és meghívjuk a táblához tartozó  Table CreateTablemetódusát. Ezzel létrejött egy új, üres tábla, amelynek struktúrája hibátlan, a tábla el

ő 

  ző 

  adatait pedigátmenetileg a   Query-ben tároljuk. A következ

ő 

  lépés az adatok átmásolása a   Query-bő 

  l a   Table-be. Ezt akorábban szintén bemutatott  TBatchMove   segítségével végezhetjük el. Ha ezek után sem tudjuk megnyitni atáblát, sajnos nem tudunk rajta segíteni.

A tábláknak vannak olyan tulajdonságai is, amelyeket nem tudunk a  TTable-ben eltárolni, és ezáltal aCreateTable   metódussal létrehozott tábla sem tartalmazza. A leggyakoribb ilyen tulajdonság, amiveltalálkozunk, a jelszó. Ezért ezt magunknak kell megadni, a tábla létrehozása után. A dolog abból a szempontbólnem egyszer

ű 

 , hogy nincs meg a megfelelő 

  eljárás, amivel egy táblának jelszót állíthatnánk be. Némi keresgetésután azonban találunk egy példát, méghozzá a Borland Database Engine Online Reference-ben (megtalálható aStart menüben is, a Delphi-n belül a   Help/Borland Database Engine  menüben, valamit a BDE könyvtárában).Ha ebben az állományban rákeresünk az   AddMasterPassword  szóra, és a kiadott találatot megnyitva az oldalExample 4: Add a master password to a Paradox table  alcímet visel

ő 

  részbő 

  l az eljárást kimásoljuk, máris vanegy saját jelszóhozzáadó rutinunk (ami egyébként a DbiDoRestructure nev

ű 

  BDE API függvényt használja).Sokszor nem elég az adatokat fizikailag ellen

ő 

  rizni. Hibás mű 

  ködés esetén ugyanis elő 

  fordulhatnakkitöltetlen mez

ő 

 k, amik rengeteg bosszúságot okozhatnak. Érdemes tehát a táblák tartalmát is ellenő 

  rizni, és

lehető 

 ség szerint a kellő 

  helyen beavatkozni. Hogy be lehet-e avatkozni, és ha igen, milyen módon, azt a konkrétfeladat illetve adatbázis határozza meg, ezért részletekbe nem bocsátkozunk.Egy szoftver fejlesztése során gondolnunk kell arra is, szükséges-e naplózni a m

ű 

 veleteket, és ha igen,ezt milyen módon oldjuk meg. A naplózás azért tölt be fontos szerepet egy szoftver m

ű 

 ködésében, mertsegítségével könnyen visszakereshet

ő 

  k a mű 

 veletek, és könnyebben megy a hibakeresés is (f ő 

 leg ha a hiba egyegyszer

ű 

  felhasználó „keze alatt” keletkezett, aki még a hibajelenséget, illetve a hibaüzenetet sem tudjafelidézni). A naplózás legegyszer

ű 

 bb módja, ha minden eseményt beírunk egy naplófájlba, dátummal, idő 

  velellátva. Használhatjuk például a   TListBox-ot, melybe a   Lines.Add   metódussal beszúrhatunk egy sort, a Lines.SaveToFile-lal pedig egyszer

ű 

  en kimenthetjük tartalmát a paraméterben megadott fájlba.A várt adatforgalomtól függ

ő 

 en óránként, esetleg naponta megnyitunk egy újabb naplófájlt, és abbafolytatjuk a naplózást. Ha a fájljainknak txt kiterjesztést adunk, a Jegyzettömbbel könnyen megjeleníthet

ő 

  eklesznek. Ügyelnünk kell azonban arra, hogy az elavult naplófájlokat néha törölni kell, mert az egy könyvtárbantárolható fájlok száma a legtöbb Windows-os rendszerben véges (bármilyen kicsik is ezek a fájlok).

A biztonság kérdése nagyon fontos egy programnál, f ő 

  leg ha azt valaki üzemszerű 

  en használja, ésfontos adatokat tárol és kezel segítségével. A biztonsági intézkedések hosszútávon jelentenek elő 

 nyt, és beváltjáka hozzájuk f 

ű 

  zött reményeket. Ezen védelmi mechanizmusok ellenére azonban nem engedhetjük megmagunknak azt a luxust, hogy kevésbé tör

ő 

  djünk a rendszerünk egyéb részeinek helyes, biztonságosm

ű 

 ködésével, hiszen ezeket a biztonsági intézkedéseket a program által okozott hibáknál nem igazán tudjukkihasználni.

Telepít ő  készítése 

Ha egy általunk készített programot felhasználás céljából más kezébe adjuk, gondoskodnunk kell egytelepít

ő 

  programról. Ez f ő 

  leg igaz azokra a programokra, amelyek használják a   Borland Database Engine-t,mivel azt a számítógépekre külön telepíteni kell (persze ezt megtehetjük a Delphi telepít

ő 

  CD-jérő 

  l is, de az nemaz igazi). A Delphi programcsomag tartalmaz egy   InstallShield Express  nev

ű 

  programot, amellyel könnyen és

gyorsan készíthetünk komplett telepítő 

  készletet. Elő 

  nye a többi, Interneten fellelhető 

  ingyenes vagy olcsóbbtelepítő 

  -készítő 

  kkel szemben, hogy kifejezetten Delphi-hez készült, így támogatja a BDE-t. A program nemtartozik közvetlenül a Delphi-hez, a Delphi telepít

ő 

  CD-jérő 

  l, mint önálló programot tehetjük fölszámítógépünkre.

A programban, ha új telepítő 

  t készítünk, elő 

  ször meg kell adnunk annak nevét és helyét. Ha testreszabható telepít

ő 

  t (Custom Setup) szeretnénk készíteni, jelöljük be az   Include a custom setup type jelöl

ő 

 négyzetet. A  Create gomb megnyomása után megjelenő 

  Setup Checklist -ben különböző 

  opciókat találunk.Ezeken egyenként végig kell mennünk. A teljesség igénye nélkül most végignézzük a lehet

ő 

  ségeket.Set the Visual DesignAz App Info  lapon a program általános jellemz

ő 

 it adhatjuk meg. Itt kell kiválasztanunk, melyik fájl aprogramunk futtatható állománya ( Application Executable). A  Main Widow-ban a telepít

ő 

  hátterét, a  Features-ben pedig az automatikus Uninstall-t kapcsolhatjuk be.

Specify InstallShield Objects for Delphi

Ebben a csoportban állíthatjuk be, milyen Delphi komponenseket telepítsen az általunk készítetttelepítő 

 . Számunkra a BDE a legfontosabb. Ezt meg is találjuk a  General fülön belül. Kiválasztva egy beállítóvarázsló jelenik meg. Els

ő 

  lépésben a telepítendő 

  BDE komponenseket adhatjuk meg. Ha Full BDE Installation-t választunk, a teljes BDE belekerül a készletbe, de a  Partial-lal mi adhatjuk meg ezeket a részeket. Ha Paradox

Page 30: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 30/32

29

rendszerben dolgozunk, elég a   Paradox Driver -t bejelölni. Ha használunk valami mást is (pl. SQL-t),értelemszer

ű 

  en azt is be kell jelölnünk. A következő 

  lapon alias-okat hozhatunk létre. Itt célszerű 

  megadni aprogram által használt alias-okat. Ezeknek a tulajdonságait kett

ő 

  vel arrébb be is állíthatjuk. Érdemes még akomponensek közül kiválasztani a BDE Control Panel File-t, melynek segítségével a Vezérl

ő 

 pultból is elérhető 

a BDE Administrator  program.Specify Components and FilesA telepít

ő 

  ben a fájlokat csoportosítjuk. Vannak programfájlok, adatbázisfájlok, súgófájlok, stb.,melyeket ilyen módon csoportba szervezünk, így telepítéskor könnyen kiválaszthatóak a szükséges részek. AGroups  lapon létre kell hoznunk a használni kívánt csoportokat, és azokhoz hozzáadni a megfelel

ő 

  fájlokat. AComponents-ben megadhatjuk, hogy ezek a csoportok milyen komponenseken belül legyenek, a Setup Types-banpedig azt, hogy mely telepítési típus (Egyéni –   Custom, Tipikus –   Typical, Minimális –   Compact ) hogyantartalmazza ezeket a komponenseket.

Select User Interface ComponentsA telepít

ő 

 nek megmondhatjuk, hogy milyen dialógus-ablakok jelenjenek meg a telepítés folyamán. Itthelyezhetjük el a felhasználói licenszszerz

ő 

  dést (Software Licence Agreement ), valamint az „olvass el”dokumentumot ( Readme Information), stb.

Specify Folders and IconsItt parancsikonokat hozhatunk létre a programunk különböz

ő 

  fájljairól, amit a telepítő 

  a megadott helyrelétrehoz majd.

Ha mindent beállítottunk, a  Disk Builder   segítségével létrehozhatjuk a telepítő 

  t. Ha kész, nincs más

hátra, mint lemezre másolni.

 Az InstallShield 

Page 31: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 31/32

30

Készítsünk CD-t!Manapság egy telepít

ő 

  t CD-n illik kiadni. Emellett egyre nagyobb teret hódít az automatikus CD,amelyet a meghajtóba helyezve elindul egy héjprogram, amivel elindíthatjuk a CD-n lév

ő 

  telepítő 

  ket. Ilyettermészetesen mi is készíthetünk. Egy megfelel

ő 

  telepítő 

  -indító héjprogram megírása nem jelenthet gondot.Néhány felirat és gomb. De hogyan futtatunk programot? Sajnos a Delphi-ben nincs egyszer

ű 

  programfuttatórutin, ellenben a Delphi  Demos\Doc\Filemanex könyvtárában található egy  fmxutils.pas nev

ű 

  unit, melyet a Binkönyvtárba másolva, a programunk  uses-listájába írva használatba is vehetünk. Ebben találunk egy  ExecuteFile

függvényt, amellyel már könnyedén futtathatunk bármit (egyébként használhatnánk a   ShellExecute   APIfüggvényt is, de ez egyszer

ű 

 bb). Egy dologra viszont nagyon oda kell figyelni: ha automatikusan indul a CD-nlév

ő 

  héjprogram, nem biztos, hogy a Windows a CD gyökérkönyvtárából futtatja. Ezért a futtatni kívánt telepítő 

fájlnevét célszerű 

  a héjprogram fájlnevébő 

 l kiszámítani. Kiváló eszköz erre a nulladik paraméter (ParamStr(0)).Ez ugyanis mindig a teljes fájlnév. Ebb

ő 

  l az   ExtractFilePath   függvénnyel kivesszük a könyvtárnevet, ígymegkapjuk a héjprogram könyvárát (a héjprogramot a CD gyökérkönyvtárában érdemes elhelyezni). Ebb

ő 

  l márkönnyen megvan a futtatni kívánt telepít

ő 

  teljes fájlneve.

ExecuteFile(ExtractFilePath(ParamStr(0))+ 'Telepítő 

  \Setup.exe',

'', ExtractFilePath(ParamStr(0)),0);

Így ez a következő 

  fájlt futtatja (ha a program helye D:\ ): D:\Telepít ő 

  \Setup.exe.Most már csak azt kell megoldani, hogy a héjprogramunk automatikusan induljon. A CD

gyökérkönyvtárában létre kell hozni egy   autorun.inf   nevű 

  állományt, amelynek a következő 

  sorokat kell

tartalmaznia:[autorun]

OPEN=Program.exe

Ha pedig ikont is szeretnénk (amit szintén a CD gyökerében helyezhetünk el):

ICON=Ikon.ico

vagy használhatjuk a programunk ikonját is:

ICON=Program.exe,0

A leírtak alapján már bárki elkezdhet telepítő 

 t készíteni. Egy jó tanács azonban elkél:  Mindig próbáld kia telepít 

ő 

  t, mielő 

 tt kiadod a kezedbő 

  l!

VI. Lezárás

Az adatbázis-kezelő 

  alkalmazások fejlesztésének rögös útján könnyű 

  elbukni. Az ember mindig a sajáttapasztalataiból (és f 

ő 

 leg kárából) tanul a legjobban. Nincs olyan könyv vagy kiadvány, ami minden speciálisproblémával foglalkozna. Korunkban viszont egyre inkább a speciális, lokalizált, a felhasználó igényeire szabottrendszerekre van szükség. Az általános szoftverek ideje lejárt. Azokat már megírták mások (többek is). A maiprogramozóknak két lehet

ő 

 ségük van: vagy beolvadnak egy szoftvercégbe, és ott fejlesztik sokadmagukkal akülönböz

ő 

  általánosabbnak mondható alkalmazásokat, vagy egyéni vállalkozásba fognak, és speciális, egyediproblémák megoldására szakosodnak.

Zárásként nem áll szándékomban okoskodni, és elmondani, „miért jó ez a dolgozat” és „milyen

tanulságai vannak”. Ezt az Olvasóra bízom. Én csupán azt remélem, sikerült átadnom azt, amit szerettem volna.Remélem dolgozatom elérte célját, és a Kedves Olvasó talált benne olyat, ami a hasznára vált.

Köszönöm.

Page 32: Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)

http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 32/32

Irodalomjegyzék

1. Borland Delphi 5.0 Online Help (beleértve a BDE Help-et és a Win32 Programmers Reference-et is)2. Szelezsán János: Adatbázisok, LSI Oktatóközpont, Budapest3. Halassy Béla: Az adatbázistervezés alapjai és titkai, IDG Magyarországi Lapkiadó Kft., Budapest, 19944. Thomas Binzinger: Delphi, Kossuth Kiadó, 19985. Dr. Szabó László: A Delphi 2.0-ról röviden, oktatási segédlet, Miskolc, 20006. Marco Cantú: Delphi 3 mesteri szinten, I-II. kötet, Kiskapu Kiadó, Budapest, 19987. Gray Cornell: Delphi tippek és trükkök, Panem Kft., Budapest, 1997

Ajánlott Internet-címek:- Delphi Software Online: www.animare.hu/dso- Magyar Delphi levelez

ő 

  lista: www.szechenyi-nkzsa.sulinet.hu/delphi- Borland Magyarország: 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/