Standard komponenscsalád használata

Ebben a leckében pár példa segítségével be fogom mutatni a fent megnevezett komponenscsalád használatát. Minden példa után részletes magyarázatot adok a működésre.

Akkor lássuk is az első példát. Nyissunk egy új alkalmazást. Ezt a File menü New/Application paranccsal tudjuk megtenni, majd nevezzük is el a formot. Én frm_main nevet adok neki. Célszerű minden formot, komponenst elnevezni, mert ha később is hozzá kell nyúlnunk a forrásunkhoz, az elnevezett formok és komponensek beszédesek lehetnek. Beállítok 1 tulajdonságot a formnak. Ez a Position lesz, s poScreenCenter-re állítom. Aki még nem tudja, hogy ez mit jelent, az olvassa el figyelmesen az „Új projekt létrehozása, és a form tulajdonságai, eseményei” című első cikkemet.

Tegyük rá a formra a MainMenu komponenst. Ezt úgy tudjuk megtenni, ha megnyomjuk a Standard fülön ezt a komponenst, majd kattintsunk a formra egyet. Ekkor a formon megjelenik ez. De még nincs vége! Kattintsunk a komponensre, majd állítsuk be a nevét. Én ezt „menu”-nek nevezem el. Most állítsuk be a menüpontokat. Ezt úgy tudjuk megtenni, hogy vagy a komponensre kattintunk kétszer, vagy a MainMenu Items tulajdonságára kattintunk egyszer.

Vegyük fel a File menüpontot, majd alá a Kilépés almenüt. Ezt úgy tudjuk megtenni, hogy például a komponensre való kétszeri kattintás után megjelenik egy kis ablak, s a Caption tulajdonságba írjuk bele a menü nevét. Legyen ez most először a File. Úgy adjuk meg a Captionba, hogy &File. Ekkor az ALT+F billentyűkombináció hatására ebbe a menübe jutunk.

Ha ez megtörtént, kattintsunk ismét a kis ablak már felvett File menüpontjára, majd nyomjuk meg a lefele nyilat (kurzort). Most beállíthatjuk az ehhez a menüponthoz tartozó almenüt. Itt vegyük fel a Kilépés almenüt. Vegyünk fel még egy főmenüt az előbb ismertetett módszer alapján, ez legyen a Help. Most akkor programozzunk egy kicsit. Hogy az egyes menüpontok mit csináljanak, többféleképpen tudjuk megadni. Én most két megoldást ismertetek. Az első verzió az, ha a MainMenu komponens szerkesztő ablakában vagyunk, kattintsunk kétszer valamely menüpontra. Ekkor megjelenik a kódszerkesztőben az ehhez a menüponthoz tartozó esemény. A második megoldás az, hogy az Object Treeview panelen a kívánt menüpontra kattintsunk kétszer, s ugyanazt kapjuk eredményül. Már el is kezdhetjük a programozást, viszont a File menüponthoz nem akarunk most semmilyen eseményt hozzáfűzni, ezért inkább fűzzünk eseményt a Kilépés menüponthoz. Itt a kódszerkesztőben írjuk be azt a parancsot, hogy Close. Ez a parancs bezárja a lefuttatott alkalmazásunkat.

procedure TForm1.Kilps1Click(Sender: TObject);
begin
 Close;
end;

Fontos megjegyeznem 2 dolgot. Az egyik, hogy a Delphiben nem kell törődnünk a komponensekhez tartozó események eljárásainak (procedure) a deklarálásával, mert a Delphi ezt megteszi helyettünk. Természetesen mi is deklarálhatunk különböző eljárásokat, függvényeket, de ennek használatáról majd később esik szó. A másik, hogy a kódszerkesztő és a form között lépkedni az F12 gombbal tudunk.

Lefordítani és futtatni az alkalmazásunkat az F9 gombbal vagy a Run menüben a Run parancs egyszeri kattintásával, vagy a zöld háromszög ikonra való kattintásával lehet.

Ha felvettük a főmenüben a Help menüt, akkor ehhez is fűzzünk hozzá egy eseményt. Kattintsunk kétszer a menü szerkesztő ablakában erre a menüpontra, vagy a komponens Items tulajdonságára. Most azt szeretnénk, ha ennek a menüpontnak a megnyomása után feljönne egy másik form, s ott jelenjen meg a program neve, verziószáma, készítőjének neve. De ezt hogyan is tudjuk megtenni?!
Nagyon egyszerűen. Vegyünk fel először is egy új formot. A zöld háromszögtől (Run) közvetlen egyel balra található egy kék ablak ikon. Nyomjuk meg egyszer, s megjelenik az új formunk, melyet méretezhetünk, stb. Én ezt egy kicsit összehúzom, mert nem szeretnék nagy formot látni, amikor kevés információ van rajta. Elneveztem az így létrejött formot frm_help-nek. Itt két tulajdonságot állítok be a formnak. Az egyik, hogy a BorderStyle-t bsDialog-ra állítom. A másik, hogy a Positiont poScreenCenter-re. Ahhoz, hogy ez a form meg is jelenjen, a következő kódot kell beírnunk a Help menü onClick eseményébe:

procedure Tfrm_main.Help1Click(Sender: TObject);
begin
 frm_help.ShowModal;
end;

Ebben a kódban azt csináltuk, hogy az újonnan létrehozott formunkat modálisan meghívtuk. Mit jelent az, hogy modális? Azt jelenti, hogy addig nem tudjuk a fő formunkra visszatérni, míg ezt az ablakot be nem zárjuk. Létezik egy másik hívási módszer, ez a Show. Itt viszont vissza tudunk térni a főformunkra a help form bezárása nélkül. Így a kódunk frm_help.Show; lesz. Fontos, hogy a formok és a komponensek tulajdonságait futásidőben a „.” karakter megadása után tudjuk megadni.

Ezután tegyünk a help formunkra szöveget. Ezt a legegyszerűbben a Label komponens segítségével tudjuk megtenni. Tegyük rá a formra ezt a komponenst, majd állítsuk be a tulajdonságait. A caption tulajdonságába mindenki beírhat bármit. Majd adjuk meg a Font tulajdonságát is. Állítsuk be a szöveget félkövérre, majd nyomjuk meg az Enter gombot. Ezután adjuk meg a komponens nevét. Én lbl_cim nevet adtam neki.

Tegyünk a formra még egy gombot is, amelynek megnyomásával a form bezáródik, majd adjuk meg a tulajdonságait. Először is a Caption tulajdonságnak „&Bezár”nevet adtam. Állítsuk be a Default tulajdonságot true-ra, ezáltal a gombon lesz a fókusz, s ha nyomunk egy Enter billentyűt, akkor a gomb OnClick eseménye hajtódik végre, ha be van állítva. Más tulajdonságot most nem adunk meg.

Nyomjuk meg a gombot 2-szer vagy a gomb Events fülén kattintsunk 2-szer az OnClick eseményére. Az eredmény ugyanaz lesz. Ide írjuk be hogy Close;. Ezáltal a formunk bezáródik.

Fontos 2 dolgot megjegyeznem! Az első, hogy az összes komponens tulajdonságát futásidőben is beállíthatjuk. A második pedig, hogy ugye az első formunk fogja meghívni a Help formot, ezért a forrásba az implementation rész után mindenképpen meg kell hívni a unitot. Ha ezt nem tesszük meg, a Delphi fordítás közben rákérdez, hogy szeretnénk-e, ha igen, automatikusan beillesztődik a kód. Ha a nem gombot nyomjuk meg, a program addig nem fog elindulni, míg ez a bejegyzés oda nem kerül.

Most térjünk vissza a fő formunkhoz, s tegyünk fel egy popup menüt. Ezt a menüt ugyanúgy kell szerkeszteni, mint a MainMenu komponenst. Vegyünk fel 2 pontot. Az egyik legyen a Help form hívása, a másik pedig a Kilépés menüpontok. Ezután kattintsunk 2-szer mind a kettő elemre. Most én a Help formot a következőképpen hívom meg:

procedure Tfrm_main.Helpformhvsa1Click(Sender: TObject);
begin
 Help1Click( Sender );
end;

Mi az a Sender?! Minden eseménykezelő kap legalább egy paramétert (a Sender-t), mely az eseményt okozó objektum (kevés kivétellel, például a drag&drop technikában a Sender mást jelent, de erről majd később). Így egyértelműen el tudjuk dönteni, hogy az eseményt melyik gomb kezdeményezte. A Sender paraméter TObject típusú, hiszen bárki lehet az esemény okozója: egy gomb, egy szerkesztődoboz, egy menüpont, stb. TObject: minden osztálynak van egy közös őse, ez
a TObject osztály.

Fontos, hogy a Popup menü csak akkor fog működni, ha a form PopupMenu tulajdonáságba beállítjuk a menü nevét!
Ezután a Kilépés menü OnClick eseményébe írjuk be a Close parancsot, s ezzel készen vagyunk a popupmenu beállításával is.

Most térjünk vissza a fő formunkra. Csináljunk egy olyan alkalmazást, mely bekéri a felhasználó nevét, munkahelye nevét, megkérjük, hogy írjon magáról valamit, megkérdezzük a nevét, érdeklődési körét. Majd a legvégén betöltünk egy txt fájlt.
Mivel a főformról nem vettem le az ablak nagyítása gombot, ezért be kell állítani a komponensek anchors tulajdonságát, s megadjuk, hogy hová ragadjanak a komponensek. Az érdeklődési kört csak akkor lehet majd megadni, ha az „Érdeklődési kör megadása” CheckBox ki van pipálva. Az „Ellenőrzés” gombra kattintva pedig leellenőrizzük, hogy a felhasználó minden adatot kitöltött-e vagy sem.
A komponensek alatt egy GroupBox található. Azért tettem oda - mivel semmilyen működésbeli szerepe nincs - , hogy a formon található fő részek (azaz a főmenü, adatok megadása, ellenőrzés gomb) jól elkülönüljenek egymástól.

Az egyszerűség kedvéért kimásolom az alkalmazás képét, aztán megnézzük, mit hogyan kell csinálni.

Először is állítsuk be a komponensek anchors tulajdonságait azért, hogyha kinagyítjuk az ablakot, ne legyen csúnya a megjelenés. A képen látható 2 felső beviteli mezőnek azt kell megadni, hogy az ablak felső, bal és jobb pontjához ragadjon nagyítás után. Ahol megkérjük a felhasználót, hogy írjon magáról valamit, az a komponens bal oldalra, felfelé és lefelé kell hogy ragadjon. Az érdeklődési körnek bal oldalra, lefelé és felfelé, a TXT fájl betöltése listbox-nak minden irányba, a két checkbox-nak lefelé, felfelé, balra, az „Ellenőrzés” gombnak lefelé és jobbra, és az életkor nevű comboboxnak balra, jobbra, felfelé kell ragadnia.

Először is állítsuk be, hogyha megnyomjuk az „Érdeklődési kör megadása” Checkbox-ot, akkor lehessen választani valamilyen érdeklődési terület közül egyet. Ha kivesszük a pipát, akkor ismét legyen ez a terület inaktív.

procedure Tfrm_main.chk_korClick(Sender: TObject);
begin
 if chk_kor.Checked then
  rdg_erd.Enabled := true
 else rdg_erd.Enabled := false
end;

Látható, hogy a checkbox onclick eseményénél adtam meg a kódot. Az Object Pascalból már jól ismert szintaktikát alkalmazhatjuk itt is. Megvizsgálom, hogy az „Érdeklődési kör megadása” Checkbox ki van-e pipálva (ez a Checked tulajdonság), ha igen, akkor a RadioGroup komponenst engedélyezem. Ha nincs kipipálva, akkor ennek a komponensnek az Enabled tulajdonságát false-ra állítom, azaz inaktív lesz ismét.

A form készítésekor feltöltöttem az életkor megadása combobox-ot adatokkal. Ezeket a komponens Items tulajdonságában adtam meg.

A form készítésekor a 2 felső beviteli mező maxlength tulajonságát 100-ra állítottam. Ezzel meghatároztam a maximálisan bevihető karakterek számát a beviteli mezőbe.

Most csináljuk meg azt, hogyha bepipáljuk a „Fájl betöltése” CheckBox-ot, akkor töltsön be a program egy előre megadott TXT fájlt. De csak akkor, ha a fájl létezik.

procedure Tfrm_main.chk_betoltClick(Sender: TObject);
begin
 if chk_betolt.Checked then
  begin
   if FileExists( 'standard.txt' ) then
    lsb_betolt.Items.LoadFromFile( 'standard.txt' );
  end
 else lsb_betolt.Items.Clear;
end;

Mi is történik itt?! Először megvizsgáljuk, hogy a betöltés Checkbox ki van-e pipálva. Ha igen, akkor megvizsgáljuk, hogy a betöltendő fájl létezik-e. Ha létezik, akkor betöltjük a fájlt. Hogyan is?! A ListBox komponens Items tulajdonságába lehet felvenni adatokat. De az Items tulajdonság egy TSrings osztály, aminek további tulajdonságai vannak. A TStrings osztály egy olyan osztály, mely többsoros szöveges információk tárolását és karbantartását teszi lehetővé. Elhelyezhetünk benne szövegeket külön sorokban (minden sor maximum 255 karakterből állhat), törölni tudunk belőle, sorait fel tudjuk cserélni stb., a szövegeket állományba is lementhetjük, illetve onnan betölthetjük.
Ha nincs kipipálva a betöltés CheckBox vagy kivesszük a pipát belőle, akkor töröljük a ListBox teljes tartalmát.

Most következik az adatok vizsgálata. Ez ugye akkor következik be, ha megnyomjuk az „Ellenőrzés” gombot. Megvizsgáljuk, hogy a felhasználó minden adatot kitöltött-e. Egy egyszerű megoldást választok a hibakezelés szemléltetésére. Azért teszem ezt így, mert be szeretném mutatni a komponensek tulajdonságainak használatát. Akkor lássuk a lényeget:

procedure Tfrm_main.btn_checkClick(Sender: TObject);
begin
 if edt_name.Text = '' then
  begin
   MessageDlg( 'Nincs kitöltve a név mező!', mtError, [mbOk], 0 );
   edt_name.SetFocus;
   exit;
  end
 else if edt_compname.Text = '' then
  begin
   MessageDlg( 'Nincs kitöltve a cégnév mező!', mtError, [mbOk], 0 );
   edt_compname.SetFocus;
   exit;
  end
 else if mem_self.Lines.Count = 0 then
  begin
   MessageDlg( 'Nincs kitöltve a magamról mező!', mtError, [mbOk], 0 );
   mem_self.SetFocus;
   exit;
  end
 else if rdg_nem.ItemIndex = -1 then
  begin
   MessageDlg( 'Nincs megadva a felhasználó neme!', mtError, [mbOk], 0 );
   rdg_nem.SetFocus;
   exit;
  end
 else if rdg_erd.ItemIndex = -1 then
  begin
   MessageDlg( 'Nincs megadva az érdeklődési kör!', mtError, [mbOk], 0 );
   if rdg_erd.Enabled then
    rdg_erd.SetFocus;
   exit;
  end
 else if cmb_age.ItemIndex = -1 then
  begin
   MessageDlg( 'Nincs kiválasztva életkor!', mtError, [mbOk], 0 );
   cmb_age.SetFocus;
   exit;
  end
 else MessageDlg( 'Az adatok rendben ki lettek töltve!', mtInformation, [mbOk], 0 );
end;

Lássuk a magyarázatot is. Először megvizsgáljuk, hogy a név mező ki lett-e töltve. Ha ez a mező ki van töltve, az értéke a Text tulajdonságában fog eltárolódni, ezért azt nézzük meg, hogy üres-e. Ha üres, akkor kap egy hibaüzenetet a felhasználó a MessageDlg párbeszédpanel segítségével, és beállítjuk a kurzor fókuszát a komponensre, majd kilépünk az exit paranccsal az eljárásból. A SetFocus egy kényelmi megoldás, mert így nem kell állandóan visszakattintgatni a kérdéses mezőre, ha elveszti a komponens a fókuszt. Ha nem üres, akkor továbbmegyünk a következő vizsgálatra. Itt lényegében ugyanaz a vizsgálat következik, csak a következő mezőt vizsgáljuk meg. A harmadik vizsgálat már egy picit érdekesebb. Mivel a memo komponens a Lines tulajdonságában tárolja el a benne lévő információt, s ez a tulajdonság TStrings típusú, ezért másképp kell vizsgálni, hogy kitöltötték-e vagy sem. Ebben a vizsgálatban annyi történik, megszámoljuk, hogy a mezőben mennyi karakter van. Ha 0, akkor nem lett kitöltve. (Persze be lehet csapni ezt a vizsgálatot például az Enter vagy a Space gomb megnyomásával, de a stringkezelő függvényekről majd csak később esik szó.)

A következő 3 vizsgálatban úgy nézzük meg, hogy ki lett-e töltve a mező vagy valamely radiobutton meg lett-e nyomva, hogy ezeknek a komponenseknek van egy ItemIndex tulajdonsága. Ha az 1. elem lett kiválasztva, akkor ItemIndex := 0, ha a 2., akkor ItemIndex := 1, és így tovább. Ha pedig nem lett kiválasztva semmi sem, akkor ItemIndex := -1. Ez a default érték is. Ha pedig minden mező ki lett töltve, akkor ezt is tudatjuk a felhasználóval.

A következő anyagban az Additional komponenscsaládot mutatom be példákkal illusztrálva. Mindenkinek további jó tanulást és gyakorlást kíván a Delphiforum.hu csapata!

CsatolmányMéret
Standard.zip240.77 KB

Könyvajánló

Programozzunk Turbo Delphi Rendszerben