A Delphihez nagy mennyiségű előre megírt unit/modul tartozik. Ezeket
könyvtárakba szervezve kapjuk a fejlesztő környezettel együtt. Ez is
gyorsítja, illetve hatékonyabbá teszi a fejlesztést. A Delphiben korábban
megkülönböztették az RTL-t (futási idejű könyvtár), a VCL-t (vizuális
komponenskönyvtár) és a CLX-et (platformfüggetlen komponenskönyvtár). Az
újabb verziókban a Delphi összes könyvtárát egységesen VCL-nek nevezik.
A szükséges unitokat a uses kulcsszó segítségével
kapcsolhatjuk a programunkhoz. Ez automatikusan bekerül, ha használunk egy
Delphi komponenst.
A Delphi támogatja a DLL (Dynamic Link Library) készítését, valamint
csomagokat is összeállíthatunk, amelyekkel az IDE-t bővíthetjük ki
komponensekkel és egyéb funkciókkal.
A könyvtári egységek
A leggyakrabban használt könyvtári egységek a következők:
System
A System egység speciális, mivel minden egység és főprogram
implicit hivatkozik rá, így a benne levő szolgáltatások mindig elérhetők.
Ebben az egységben találhatók a különleges nyelvi elemek, pl. a TObject
osztály, az IInterface interfész, valamint számos konverziós függvény.
SysUtils
Lehetővé teszi a kivételkezelést.
Tartalmazza az alapvető kivételosztályokat, számos fájlokkal, könyvtárakkal
és dátumokkal kapcsolatos függvényt, valamint a string és más típusok között
konvertáló függvényeket. Az utóbbiak közé tartozik a Format függvény,
amely hasonlít a C-ből ismert printf-re, viszont nem írja ki az eredményt,
hanem stringként visszaadja, így rugalmasabban használható.
Types
Tartalmaz néhány típusdeklarációt, pontokkal és téglalapokkal kapcsolatos
műveleteket.
Windows
A C-ben használatos windows.h-nak felel meg, így tartalmazza a Windows API
függvények deklarációját és a hozzájuk kapcsolódó típusokat.
Messages
Windows-üzenetek kódjait és a hozzájuk tartozó rekordokat tartalmazza,
hasznos lehet üzenetkezelő
metódusok írásakor.
Classes
Hasznos osztályokat tartalmaz: TThread - szál, TList - tömb alapú lista,
TStringList - tömb alapú string+objektum lista, különféle
Stream osztályok, TPersistent - egymás közti értékadást és
sorbafejtést (szerializáció) támogató osztályok alaposztálya,
TComponent - hierarchiát, tulajdonosi viszonyt, értékadást és
sorbafejtést támogató alaposztály.
Fájlkezelés
A fájlok támogatását a Delphiben három pontba lehet szétosztani:
- az Object Pascalból eredő fájltámogatásra. Ennek az alap kulcsszava
a File.
- a vizuális komponenskönyvtár fájltámogatása, amelyben metódusok
segítségével lehet adatokat beolvasni ill. elmenteni (pl. LoadFromFile,
SaveToFile metódusok)
- fájltámogatás adatbázis formátumokhoz. Ez csak a Delphi Professional
változatától érhető el.
Object Pascalból eredő fájltámogatás
Fájlokkal kapcsolatos leggyakrabban használt parancsok:
- AssignFile(fájl, fizikainév) - a fájl változóhoz egy fizikai fájlt kapcsol az adathordozón,
- Reset(fájl) - fájl megnyitása olvasásra (típus nélküli fájl esetén írásra is),
- Rewrite(fájl) - fájl megnyitása írásra (ha már létezik, akkor felülírja),
- Append(fájl) - fájl megnyitása írásra (ha már létezik, akkor a végére áll),
- Read(fájl, változó) - egy adat olvasása fájlból,
- Write(fájl, változó) - egy adat írása fájlba,
- ReadLn(fájl, szöveg) - sor olvasása szöveges (txt) fájlból,
- WriteLn(fájl, szöveg) - sor írása szöveges (txt) fájlba,
- BlockRead(fájl, változó, méret) - blokk olvasása típus nélküli fájlból,
- BlockWrite(fájl, változó, méret) - blokk írása típus nélküli fájlba,
- Seek(fájl, pozíció) - a mutató beállítása a megadott helyre a típusos fájlban. A pozíció értéke 0-tól indul,
- CloseFile(fájl) - állomány bezárása.
Megjegyzés: a
Read, ReadLn, Write, WriteLn fájlparaméter nélkül is
meghívható, ekkor konzol alkalmazás esetén a konzolról olvas vagy oda ír.
Példa:
Hozzunk létre egy ablakot (formot), melyen helyezzünk el egy Button és egy
Memo komponenst. A gomb megnyomásakor az aktuális könyvtárban található
"data.txt" fájl tartalmát beolvassa a program a Memo komponensbe:
procedure TForm1.Button1Click(Sender: TObject);
var
file1: TextFile;
line: String;
begin
AssignFile(file1,'data.txt');
Reset(file1);
while not Eof(file1) do
begin
ReadLn(file1,line);
Memo1.Lines.Add(line);
end;
CloseFile(file1);
end;
A Pascalban használt parancsszavak a Delphiben továbbra is használhatóak,
csak a System modullal kell hivatkozni rájuk. Például az
Assign(F) helyett a System.Assign(F) parancsot használhatjuk.
(Ennek az az oka, hogy a legtöbb komponens rendelkezik Assign
metódussal, amelynek teljesen más a feladata.)
Ha más, nem szöveges fájllal szeretnénk dolgozni, hanem valamilyen
típusos állománnyal, akkor használhatjuk a file of "type"
formát a deklaráláshoz. Például: file of Integer.
További fájltámogatás
Általában rövid és egyszerű megoldást szeretnénk használni a
fájlkezelésre, és nem szeretnénk mindig használni a hosszadalmas Object
Pascalból eredő fájltámogatást. Erre is van lehetőségünk Delphiben. A
legismertebb metódusok a LoadFromFile és a SaveToFile,
melyek adatokat beolvasnak illetve elmentenek egy fájlba. A szövegek tárolására
alkalmas TStringList osztály pl. rendelkezik ezekkel a metódusokkal:
Memo1.Lines.LoadFromFile('data.txt');
További fájlokkal kapcsolatos parancsok
Néhány fájlokkal kapcsolatos függvény a SysUtils
egységből:
- FileExists(név) - értéke true, ha a megadott nevű állomány létezik,
- DeleteFile(név) - kitörli a megadott nevű állományt és true értéket ad vissza, ha sikeres volt,
- RenameFile(réginév, újnév) - átnevezi a fájlt és true értéket ad vissza, ha sikeres volt,
- ChangeFileExt(név, kiterjesztés) - megváltoztatja a fájl kiterjesztését és visszaadja a fájl új nevét,
- ExtractFileName(teljes_név) - A teljes útvonallal együtt megadott fájl nevét adja vissza,
- ExtractFileExt(név) - Az adott fájl kiterjesztését adja vissza.
Komponensek
A Delphi erősen támogatja a komponens alapú szoftverfejlesztést. Ha egy GUI
alkalmazást készítünk, az IDE tervezőjében vizuálisan tervezhetjük meg az
alkalmazás kinézetét. Az Object Inspector segítségével megváltoztathatjuk az
egyes komponensek tulajdonságait, és az eredményt azonnal szemügyre vehetjük.
A komponensek továbbá lehetnek nem vizuálisak, ám ilyenkor
is hasznos, hogy a tervezővel állíthatjuk be a tulajdonságaikat a sok kódsorból
álló inicializálás helyett.
Az ablaknak megfelelő komponens a form. A Delphi IDE segítségével
egyszerűen adhatunk hozzá formokat az alkalmazáshoz, ekkor létrejön egy
forrásfájl, amely egy TForm-ból származtatott osztályt tartalmaz,
valamint egy .dfm kiterjesztésű erőforrás, amely a form komponenseit
írja le. Az Object Inspectorban az eseményekhez is egyszerűen rendelhetünk
eseménykezelőt: listából választhatók ki a megfelelő szignatúrájú metódusok,
valamint a tervező létre is tud hozni üres metódust.
A VCL komponenseit az alábbi kategóriákba sorolhatjuk:
- Vezérlőelemek: feliratok, gombok, keretek, menük stb.
- Képek, grafikus eszközök
- Rendszereszközök: időzítő, DDE elemek, OLE konténerek
- Szabványos párbeszédablakok: fájl megnyitása, mentése, nyomtatás stb.
- Adatelérés: adatforrások és adattranszformátorok
- Adatbázis-alapú vezérlőelemek
- Hálózati szolgáltatások
A Delphi orientációját jelzi, hogy a komponenspaletta nagy része adatbázisokkal
és hálózattal kapcsolatos komponensekből áll. Továbbá beszerezhetők mások által
fejlesztett komponensek (akár pénzért) és beilleszthetők az IDE-be.
Általános komponensek bemutatása
Ebben a részben szeretném bemutatni az általános Delphi komponenseket,
illetve azok fontosabb jellemzőit és eseményeit.
TLabel (címke)
- Helye az osztályhierarchiában: TObject/TComponent/…TLabel
- Szerepe: „passzív”, nem szerkeszthető szövegek megjelenítése
- Fontosabb jellemzői:
- Caption: maga a szöveg
- Transparent: ha Igazra (True) állítjuk, akkor a címke háttere átlátszóvá válik. Ezt abban az esetben lehet tökéletesen használni, ha egy képet szeretnénk feliratozni vele.
TEdit (szerkesztődoboz)
- Helye az osztályhierarchiában: TObject/TComponent/TControl/TWincontrol/...TEdit
- Szerepe: egysoros szöveges információ megjelenítése és szerkesztése
- Fontosabb jellemzői:
- Text: a szerkesztődoboz szövege
- MaxLength: a maximálisan megengedett karakterek száma
- SelText: a kijelölt szöveg
- SelStart, SelLength: a kijelölés kezdete és hossza
- Aligment: taLeftJustify, taCenter, taRightJustify. A szerkesztődobozban lévő szöveg igazítási módja (balra, középre, jobbra zárt).
- Fontosabb metódusai:
- SelectAll: kijelöli a teljes szöveget
- ClearSelection: törli a kijelölt szövegrészt
- SelText: maga a kijelölt szöveg
- SelStart, SelLength: a kijelölés kezdete és hossza
- CutToClipboard, CopyToClipboard, PasteFromClipboard: vágólapra vágja (cut), másolja (copy) ki a kijelölt szöveget, illetve vágólapról illeszt (paste) be
- Fontosabb eseményjellemzői:
- OnChange: amikor megváltozik a szöveg, akkor mindig bekövetkezik. Ez az esemény nem azonos az OnKeyDown-al.
A jobbra-, balra billentyűk nyomogatásakor az OnChange nem hívódik meg, az OnKeyDown
viszont igen. Az OnKeyPress eseménytől abban különbözik, hogy míg az OnKeyPress
meghívásakor a szöveg még a régi (paraméterében az új leütött karakter), addig az OnChange
hívásakor a szöveg már tartalmazza a frissen beütött karaktert (a régi szöveget nem tudjuk elérni már).
TMemo (többsoros szerkesztődoboz)
- Helye az osztályhierarchiában: TObject/TComponent/TControl/TWincontrol/...TMemo
- Szerepe: Többsoros szövegek szerkesztésére, megjelenítésére használható. A Text jellemzővel férhetünk hozzá és állíthatjuk be a teljes szöveget.
Ha soronként szeretnénk a szöveget feldolgozni, akkor erre a Lines jellemzőt használjuk.
A TMemo komponensben mindig csak egy betűtípus, stílus, ... egyféle formátum lehetséges, és ez az egész szövegre érvényes.
TBtton (gomb), TBitBtn (gomb képpel)
- Helyük az osztályhierarchiában: TObject/TComponent/TControl/TWincontrol/...TButton/TBitBtn
- Szerepük: kattintással indított feladat elvégzése
- Fontosabb jellemzőik:
- Caption: a gomb felirata
- Cancel: ha Igazra (True) állítjuk, akkor a gombra épített tevékenység az Esc billentyű megnyomása esetén meghívódik.
- Default: ha Igazra (True) állítjuk, akkor a gombra épített tevékenység az Enter billentyű megnyomása esetén meghívódik, ez lesz az „alapértelmezett” gomb.
- ModalResult: mrNone, mrOk, mrCancel ...
A párbeszédablakok általában modálisak, azaz bezárásukig uralják az alkalmazást.
Ha egy űrlapot modálisan nyitunk meg, akkor mindaddig ő lesz a fókuszban, míg el nem tüntetjük.
Tegyük fel, hogy űrlapunkon van egy OK és egy Cancel gomb. Mindkét gombra való kattintásra eltűnnik az ablak.
Igen ám, de miután eltűnt az ablak, honnan tudjuk meg, hogy melyik gomb miatt lett bezárva?
A válasz a ModalResult jellemzőben rejlik.
btnOK.ModalResult := mrOK;
btnCancel.ModalResult := mrCancel;
Ha a gombok ModalResult jellemzőjét akár tervezéskor, akár futáskor a fennt látható módon beállítottuk,
akkor az űrlap bezárása után lekérdezhető a bezárás oka.
procedure TForm1.CheckBoxChange(Sender: TObject);
If ParbeszedAblak.ShowModal = mrOK Then
ShowMessage(’Az OK gombra kattintottak’)
Else
ShowMessage(’A Cancel gombra kattintottak’);
- A TBitBtn típusú gombok nem csak feliratot, hanem különböző képeket is tartalmazhatnak.
Ezt további három jellemzővel lehet elérni:
- Kind: bkCustom, bkOK ...
Beállítható egy a rendszer által felkínált típus. Ha például bkOK típust állítunk be, akkor a tipikus „zöld pipás” gombot fogjuk látni,
melynek ModalResult tulajdonsága automatikusan mrOK-ra állítodik. Ha viszont saját rajzolású gombokkal szeretnénk dolgozni,
akkor állítsuk a Kind tulajdonságot bkCustom-ra, és a Glyph jellemzőbe adjuk meg a kívánt képet.
- Glyph: TBitmap, NumGlyphs: 1..4:
Egy gomb esetében maximum 4 bittérkép adható meg tervezéskor vagy futáskor. Ezeket a képeket a gomb következő állapotainál tudjuk használni, normál,
elszürkített, lenyomott és beragadt.
- Fontos eseményjellemzőjük:
- OnClick: ebbe írjuk a kattintásra lefutó metódus(ok) nevét.
TCheckBox (jelölőnyégyzet)
- Helye az osztályhierarchiában: TObject/TComponent/TControl/TWinControl/... TCheckBox
- Szerepe: a jelölőnégyzetet általában két állapotú érték jelzésére használjuk: Igen/Nem, Igaz/Hamis, Akarom/Nem akarom, Férfi/Nő... Néha találkozhatunk szürkített jelölőnégyzettel is,
ez a „nem tudom”, „nem egyértelmű” vagy „mindegy” állapotot jelenti.
- Fontosabb jellemzői:
- Checked: ha nincs engedélyezve a szürkítés, akkor ezzel a tulajdonsággal kérdezhetjük le a jelölőnégyzet állapotát. Igaz (True) vagy hamis (False) az értéke, attól függően, hogy ki van-e pipálva vagy sem.
- AllowGrayed: Igazra (True) állításával engedélyezzük a szürkítést. Ilyenkor folyamatos kattintásokra kipipáljuk, töröljük, majd szürkítjük.
A jelölőnégyzetnek három különböző értéke lehet, tehát a Checked tulajdonság már nem mond eleget.
Ilyenkor a State jellemzőt használjuk.
- State: cbChecked, cbUnChecked, cbGrayed.
- Fontos eseményjellemzője:
- OnClick: kattintás eseménye
Ha azt akarjuk, hogy a változtatás azonnal érezhető legyen, akkor a jelölőnégyzet állapotát az OnClick-ben értékeljük ki.
TRadioGroup (választógomb-csoport)
- Helye az osztályhierarchiában: TObject/TComponent/TControl/TWinControl/... TRadioGroup
- Szerepe: egymást kölcsönösen kizáró opciók számára használatos
- Fontosabb jellemzői:
- Items: az opciók szövege külön sorokban
Például: Items[0] = ’Piros’, Items[1] = ’Kék’ ...
- ItemIndex: a kijelölt elem indexe
- Fontos eseményjellemzője:
- OnClick: kattintás eseménye
TListBox (listaboboz)
- Helye az osztályhierarchiában: TObject/TComponent/TControl/TWinControl/...TListBox
- Szerepe: megjelenít egy értéklistát, melyből egyet (esetleg többet) választhatunk. A lista elemei nem szerkeszthetők.
Akkor használjuk, ha korlátozni szeretnénk a bevihető értékeket a lista elemeire.
A kombinált listától (TComboBox) eltérő módon, a listadoboz állandóan látható;
a kiválasztott elemet egy kijelölő sáv jelzi.
- Fontosabb jellemzői:
- Items: a lista elemei (Items[0] = ’Arial’, Items[1] = ’Times New Roman’, ...)
- Itemlndex: a kijelölt elem indexe. Ez csak akkor használható, ha egy elem van kijelölve.
- Multiselect: többszörös kijelölés engedélyezése (True), illetve tiltása (False). Ha egyszerre több sort is ki tudunk jelölni,
akkor a kijelölt sorok lekérdezésére a következő két jellemzőt használjuk.
- SelCount: megadja a kijelölt sorok számát
- Selected: egy logikai tömb, mely segítségével minden elemről sorban lekérdezhető az állapota: ki van-e jelölve vagy sem.
- Fontosabb metódusa:
- ItemAtPos: visszaadja a paraméterként megadott x, y koordinátákban levő sorának indexét
(ha van ott egyáltalán valami). Ezt például akkor használjuk, amikor egy listadoboz elemeit át akarjuk vonszolni (Drag & Drop)
egy másik listadobozba. A vonszolás elkezdésének pillanatában ki kell értékelnünk a helyzetet:
van-e ott valami vonszolandó vagy nincs? Tehát abban a pontban, ahova kattintott a felhasználó,
található-e listaelem vagy sem? Ezt a vizsgálatot az ItemAtPos metódussal tudjuk megvalósítani.
TComboBox (kombinált lista)
- Helye az osztályhierarchiában: TObject/TComponent/TControl/TWinControl/... TComboBox
- Szerepe: egy szöveges adat bevitelére szolgál, olyan adatéra, melyet vagy közvetlenül beírunk, vagy egy lenyíló listából választunk ki.
Állandó jelleggel csak a szerkesztődoboz része látható.
A kombinált lista egy szerkesztődobozból, egy „lenyitó gombból” és egy listadobozból áll.
- Fontosabb jellemzői:
- Text: a kombinált lista szövege.
- Items: a listadoboz elemei. Ha csak néhány konstans értékről van szó,
akkor ezeket tervezési időben szoktuk megadni. Ha viszont a lista hosszú,
és ráadásul tartalma megváltozhat (például mindig a létező betűtípusokat kell tartalmaznia),
akkor a feltöltését futáskor kell megvalósítanunk, valamikor még a lista megjelenése előtt.
Ha azt szeretnénk, hogy elemei automatikusan egy adatbázis egy táblájából származzanak,
akkor ne ezt a komponenst használjuk, hanem az adatbázisos párját,
a TDBComboBox, vagy a TDBLookupComboBox komponenseket.
- Itemlndex: a kiválasztott listaelem indexe
- Sorted: beállítható, hogy a lista elemei növekvő sorrendben legyenek-e vagy sem
- Style: csDropDown, csDropDownList ...
A kombinált lista stílusa. Ha értéke csDropDown, akkor a kombinált lista szerkeszthető.
(Figyelem, a frissen begépelt elem nem válik automatikusan a lista részévé.)
Ha viszont azt szeretnénk, hogy a felhasználó csak a lista elemei közül tudjon válogatni,
ne gépelhessen be semmi mást, akkor stílusát csDropDownList-re állítsuk;
ezzel letiltjuk a szerkesztést, kattintáskor a lista automatikusan le fog nyílni.
A Style jellemző még a csOwnerDrawFixed és a csOwnerDrawVariable értékekkel is rendelkezhet.
Ezek az egyéni rajzolású listadobozok használatát teszik lehetővé
(például, ha minden eleme elé egy kis képet szeretnénk megjeleníteni).
Ilyenkor az elemek rajzolását nekünk kell átvállalnunk, és ezt az OnDrawItem eseményében fogjuk
megvalósítani.
- Fontosabb eseményjellemzője:
- OnDropDown: a lista lenyitásakor következik be.
Ekkor szoktuk frissíteni a lista tartalmát, ha az változik a program futása során.
TSpeedButton (eszköztár gomb)
- Helye az osztályhierarchiában: TObject/TComponent/TControl/...TSpeedButton
- Szerepe: az eszköztárakon megjelenő gombok komponense. (Eszköztárak megvalósítására nem használhatók
a fentebb bemutatott TButton és TBitBtn komponensek mivel ezek nem tudnak „beragadni”.)
A TSpeedButton gombokat általában egy TPanel komponensen helyezzük el.
Többnyire grafikát tartalmaznak, de megjeleníthetünk rajtuk szöveget is. Lehetnek „beragadt”, vagy
„felengedett” állapotban, aktívak vagy beszürkültek. Több TSpeedButton példány csoportosítható;
az egy csoportba tartozó gombok egymást kölcsönösen kizárják.
- Fontosabb jellemzői:
- Caption: a gomb felirata.
- Glyph: a megjelenített kép (maximum 4 képet adhatunk meg a gomb különböző
állapotainak megfelelően).
- Grouplndex: Integer
Jellemző, melynek segítségével az eszköztár gombok csoportosíthatók.
Az egy csoportba tartozó gombok azonos Grouplndex értékkel rendelkeznek.
Ha a Grouplndex = 0, akkor a gomb nem fog kattintáskor „beragadni”,
azaz TBitBtn-ként viselkedik. A csoportosítás csak 0-nál nagyobb Grouplndex értékekkel valósítható meg.
- AllowAllUp:Boolean
Ennek a jellemzőnek az értéke meghatározza,
hogy az egy csoportba tartozó gombok közül lehet-e mind egyszerre „felengedve”
(AllowAllUp=True), vagy pedig egyiküknek kötelező módon „benyomva” kell maradnia
(AllowAllUp = False).
- Down:Boolean
Ha Down=True, akkor a gomb be van nyomva.
Csak a Grouplndex nullától különböző értékei esetén használható.
- Példák:
- Word-ben a bekezdés-igazító négy gomb egymást kölcsönösen kizárja
(azonos Grouplndex értékkel rendelkeznek), és egyikük mindig „be van nyomva”
(AllowAllUp=False).
- A rajzoló eszköztár gombjai is kölcsönösen kizárják egymást (egy csoportba tartoznak),
de amikor nem rajzolunk, akkor egyikük sincs kiválasztva.
- Fontosabb metódusa
- OnClick: azonos a TButton és TBitBtn metódusával.
TMainMenu (főmenü)
- Helye az osztályhierarchiában: TObject/TComponent/...TMainMenu
- Szerepe: Egy menüsor hozzákötése az alkalmazáshoz.
- Fontosabb jellemzői:
- Items: a főmenü menüpontjai. Egy menüpontnak további (al)menüpontjai lehetnek. (Items[0].Items[1])
- Fontosabb eseményjellemzője:
- OnClick: Minden menüpontnak van külön OnClick eseménye.
Ezt az eseményt általában arra használjuk, hogy ha a menüpontra kattintunk,
akkor induljanak el a megfelelő tevékenységek, de arra is használható, hogy az
almenüpontok engedélyezését állítsuk be.
TPopupMenu (gyorsmenü)
- Helye az osztályhierarchiában: TObject/TComponent/...TPopupMenu
- Szerepe: Egy űrlapon általában egy MainMenu komponens található, azonban PopupMenu
komponens akár több található. A gyorsmenüket más komponensek (gombok, szerkesztődobozok, listák...)
PopupMenu tulajdonságához szoktuk kötni, azaz beállítjuk, hogy az egér jobb gombjára kattintva
hol, milyen gyorsmenü jelenjen meg.
- Fontosabb jellemzői:
- Items: menüpontjai, akárcsak a főmenünél.
- AutoPopup: Boolean
Általában a gyorsmenüt az egér jobb gombjával szoktuk előhívni
(ez automatikusan történik, be van építve a rendszerbe).
Delphiben ezt letilthatjuk (AutoPopup := False), ilyenkor viszont nekünk kell valahol a
programban megjelenítenünk a menüt. Ezt a Popup metódusával tehetjük meg.
- Fontosabb eseményjellemzője:
- OnPopup: a menü megjelenésekor hívódik meg.
Ide szoktuk beépítem a menüpontjainak engedélyezését, illetve letiltását.