|
|
Speciális DBComboBox komponens
|
|
Példaprogram letöltése
11850 bájt
|
A DataControls palettán két ComboBox típusú komponenst is találunk. A DBComboBox komponens a kiválasztott elemet írja be a megadott mezőbe, míg a DBLookupComboBox egy másik tábla adott mezőjének tartalmát. Ez a két komponens jól használható bizonyos esetekben, de mi a helyzet akkor, ha nem a lista elemét szeretnénk eltárolni, hanem az elemnek megfelelő tetszőleges értéket. Ebben a példában egy új ComboBox komponenst készítünk, amelyben a legördülő lista elemeihez egy tetszőleges értéket rendelhetünk, amely az elem kiválasztása után eltárolásra kerül.
A mellékelt példaprogram megnyitása előtt a DBComboValues.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Sajnos az nem megoldható, hogy a komponenst a TDBComboBox osztályból származtassuk, pedig ahhoz képest csak néhány módosítást kell elvégeznünk. Éppen ezért a TDBComboBox forráskódját használjuk fel teljes egészében, és ebben végezzük el a szükséges módosításokat.
Egy darab új property-t kell felvennünk, melynek neve Values lesz, a típusa pedig TStringList. Ez a property fogja tartalmazni a lista elemeihez (Items property) rendelt értékeket. Például megoldhatjuk vele azt, hogy a legördülő listában személyek nevei látszódjanak, de a név kiválasztásakor a személy e-mail címe kerüljön be az adatbázis FieldName property-ben megadott mezőjébe.
Az Items property minden eleméhez a Values property azonos indexű property-je tartozik. A két listának azonban nem kell feltétlenül azonos számú elemet tartalmaznia. Előfordulhat például, hogy az Items property több elemet tartalmaz, mint a Values. Ilyenkor az történik, hogy amikor a felhasználó egy olyan elemet választ ki, amelyhez nincs rendelve érték a Values property-ben, akkor a kiválasztott elem kerül tárolásra, ugyanúgy, mint a DBComboBox komponensnél. Ugyanez a helyzet akkor is, ha a felhasználó egy olyan szöveget gépel be, amelynek megfelelő elem nincs a listában.
A másik eset, amikor Values property tartalmaz több értéket. Ebben az esetben csak arra kell figyelni, hogy amikor egy olyan elem van tárolva az adatbázisban, amihez az Items property-ben nincs megfelelő indexű elem, akkor magát az értéket kell megjeleníteni a komponensben (lásd DataChange eljárás).
A komponens konstruktorában illetve destruktorában gondoskodni kell a Values property létrehozásáról, illetve megszüntetéséről. A forráskódban ezen kívül két helyen kell módosításokat végezni. Az első a DataChange eljárás, amelyben a ComboBox-ban megjelenő szöveget kell megadni. Az eredeti forráskód szerint itt az adatbázis mezőből kiolvasott értéknek kell megjelennie. Ez nekünk nem jó, mivel mi az értéknek megfelelő szöveget szeretnénk megjeleníteni. Megkeressük tehát az adatbázisban tárolt értéket a Values property-ben, és az index-ét eltároljuk az i változóban. Ha az Items property-ben van az i változó értékének megfelelő indexű elem, akkor azt jelenítjük meg a komponensben, ellenkező esetben magát az értéket.
i:=FValues.IndexOf(FDataLink.Field.Text);
if (i>=0) and (i<Items.Count) then begin
SetComboText(Items[i]);
end else begin
SetComboText(FDataLink.Field.Text);
end;
A másik hely, ahol módosítanunk kell, az UpdateData eljárás. Ez akkor fut le, amikor a komponensben tárolt érték megváltozik, és azt el kell tárolni az adatbázis megadott mezőjében. Itt azt kell megoldanunk, hogy ne a komponens text property-jében tárolt érték kerüljön az adatbázisba, hanem az annak megfelelő érték a Values property-ből.
var
i: integer;
s: string;
...
s:=GetComboText;
i:=Items.IndexOf(s);
if (i>=0) and (i<FValues.Count) then begin
s := FValues[i];
end;
FDataLink.Field.Text := s;
Az s változóba kiolvassuk a Text property értékét a GetComboText függvénnyel. Ezután megkeressük a beírt érték index-ét az Items property-ben, majd ezt eltároljuk az i változóban. Nem biztos, hogy van ilyen elem az Items property-ben, hiszen azt a felhasználó is begépelhette. Ha van ilyen érték, akkor azt beírjuk az s változóba. Ezután az FDataLink objektum field property-jének text mezőjébe beírjuk az s változó tartalmát.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 532. 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!
|