HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Kereső adatbeviteli mező adatbázisokhoz


Példaprogram letöltése

10616 bájt

Ebben a példában egy olyan komponenst készítünk, amely egy TEdit-hez hasonlít, de egy adatkészlethez van kapcsolva. Ez egy kereső mező lesz, tehát amikor a felhasználó adatokat gépel be, akkor a beállított property-knek megfelelően a beírt adatra rákeres az adatkészletben, és ha megtalálta, akkor rápozícionál.
A mellékelt példaprogram megnyitása előtt a DBFindEdit.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Az új komponenst a TCustomEdit osztályból származtatjuk. Ezt az osztályt fogjuk egészítjük ki a szükséges property-kkel és eseményekkel.
Az adatkészletet a szokásos DataSource property-n keresztül kapcsolhatjuk a komponenshez. Ehhez kapcsolódik szorosan a FieldName property, amelyben a komponenshez kapcsolt adatkészlet mezőinek nevét lehet beállítani. Ehhez érdemes egy property editor-t is készíteni. Ezt az osztályt a TStringProperty osztályból származtatjuk, lévén a FieldName property string típusú. A GetValues eljárásban feltöltjük a property editor legördülő listáját a komponens által támogatott típusú mezők neveivel. Ez egy ciklusban történik, aminek a lényegi része az alábbi sor:
if DataSource.DataSet.FieldDefs[i].DataType in SUPPORTED_TYPES then
  proc(DataSource.DataSet.FieldDefs[i].Name);
Mint a fenti kódból látható, a mezők típusát a FieldDefs tömb property-n keresztül kérdezhetjük le, és ellenőrizzük, hogy a SUPPORTED_TYPES tömbben az adott típus megtalálható-e. Ez egy konstans tömb, amely a komponens által támogatott mező típusokat tartalmazza.

A komponens Change eljárását felül kell írnunk, hogy a keresést már rögtön a beírás pillanatában meg tudjuk kezdeni. Ez viszont csak akkor történik meg, ha a FindOnChange logikai típusú property értéke igaz.

A keresést a Search függvény végzi el. A függvény visszatérési értéke egy logikai érték, amelyből megtudható, hogy a keresés sikeres volt-e. A komponens ezt az értéket nem használja, viszont mivel a függvény a public részben lett deklarálva, ezért kívülről is meghívható.
A Search függvényben első lépésben ellenőrizzük, hogy a DataSource property be van-e állítva, és a megadott DataSource komponens hozzá van-e kapcsolva egy adatkészlethez. Ha minden feltétel adott, akkor a Locate függvénnyel rákeresünk a rekordra. Ha volt találat, akkor az AutoComplete property, és az FChanged globális változó értékétől függően módosítjuk a Text property értékét. Ha az AutoComplete property értéke igaz, akkor sikeres keresés esetén a keresett töredék szót kiegészíti a megtalált adatra, és a felhasználó által nem beírt részt kijelöltté teszi.
        result:=FDataSource.DataSet.Locate(FFieldName, Text, FOptions);
        if result then begin
          if FAutoComplete and (FChanged) then begin
            l:=Length(Text);
            Text:=FDataSource.DataSet.FieldByName(FFieldName).AsString;
            SelStart:=l;
            SelLength:=Length(Text)-l;
          end;
Az FChanged egy globális logikai típusú változó. Erre a következő dolgok miatt van szükség. Amikor a FindOnChange és AutoComplete property-k értéke igaz, akkor a következő történik, amikor a felhasználó elkezdi begépelni a keresett szót. Már az első betű megadása után arra a rekordra pozícionál, amelynek az első betűje megegyezik a beírt betűvel. Ekkor viszont az adatbeviteli mezőben kiegészíti a keresett szót a megtalált szóra, de a felhasználó által még be nem írt részt kijelöli. Ha tehát a felhasználó begépeli a következő betűt, akkor a kijelölt rész törlődik, és az újonnan begépelt betű hozzáadódik a már előzőleg begépelthez. Ekkor megint megtörténik a keresés és sikeres találat esetén szó kiegészítés. Ez eddig rendben is van, működik, viszont mi van akkor, ha a kijelölt részt törli a felhasználó, például a Delete gombbal. Ekkor a következő történik. A kijelölt rész törlődik, viszont lefut a Change eljárás és megtörténik a keresés és szó kiegészítés, tehát ugyanott leszünk, ahol a Delete gomb lenyomása előtt voltunk. A BackSpace billentyűnél sem jobb a helyzet. Éppen ezért felülírjuk a KeyDown eljárást, amiben ellenőrizzük az éppen lenyomott billentyűt. Ha ez a Delete vagy a BackSpace billentyű, akkor az FChanged változó értékét hamisra, minden más esetben igazra állítjuk. Így elkerüljük a fenti problémát. Ugyanebben az eljárásban ellenőrizzük az Enter billentyű leütését is. Ha ez megtörténik, akkor meghívjuk a Search függvényt, vagyis végrehajtjuk a keresést. Ennek akkor van jelentősége, ha a FindOnChange property értéke hamis.

Ahhoz, hogy a komponens minél jobban felhasználható legyen, létrehoztunk néhány eseményt is. Ezek a következők:
  • OnBeforeSearch: közvetlenül a keresés előtt jön létre akkor is, ha a keresés nem történhet meg, mert a DataSource komponens nem lett a komponenshez kapcsolva, vagy a DataSource komponenshez nincs adatkészlet (pl. Table vagy Query komponens) kapcsolva.
  • OnAfterSearch: a keresés végén jön létre.
  • OnFound: ez az esemény akkor következik be, amikor a keresés sikeres volt.
  • OnNotFound: az előző esemény ellentéte, vagyis akkor következik be, ha a keresés nem járt eredménnyel.
  • OnError: akkor következik be, amikor a keresés közben hiba (kivétel) lépett fel.


Cikksorozat

#IDKategóriaCikk címeSorozat
1166DelphiOsztály hierarchia lekérdezése1. rész
1180DelphiOsztály hierarchia lekérdezése2. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 520. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |