9. Prßce s polo╛kov²mi komponentami

Tato kapitola popisuje vlastnosti, udßlosti a metody spoleΦnΘ pro objekty TField a jejich potomky. Potomci TField reprezentujφ jednotlivΘ databßzovΘ sloupce v datovΘ mno╛in∞. Tato kapitola takΘ popisuje jak pou╛φvat potomky polo╛kov²ch komponent k °φzenφ zobrazovßnφ a editaci dat v na╣ich aplikacφch.
Komponenty TField nikdy nepou╛φvßme ve sv²ch aplikacφch p°φmo. Implicitn∞, kdy╛ umφstφme datovou mno╛inu do svΘ aplikace a otev°eme ji, pak C++ Builder automaticky dynamicky p°i°adφ potomky TField specifick²ch datov²ch typ∙ k reprezentaci v╣ech sloupc∙ v datovΘ mno╛in∞. B∞hem nßvrhu, m∙╛eme p°epsat implicitnφ dynamickΘ polo╛ky vyvolßnφm Editoru polo╛ek k vytvo°enφ trval²ch polo╛ek, kterΘ nahradφ tyto implicitnφ polo╛ky.
Nßsledujφcφ tabulka uvßdφ seznam v╣ech potomk∙ polo╛kovΘ komponenty, jejich v²znam a p°φpadn∞ p°φpustn² rozsah hodnot.
 
JmΘno komponenty V²znam
TADTField* Polo╛ka abstraktnφho datovΘho typu (ADT).
TAggregateField* Udr╛ovanß agregaΦnφ polo╛ka v klientskΘ datovΘ mno╛in∞.
TArrayField* Polo╛kovΘ pole.
TAutoIncField CelΘ Φφslo z rozsahu -2147483648 a╛ 2147483647. Pou╛φvßno v Paradoxu pro sloupce, jejich╛ hodnoty jsou automaticky inkrementovßny.
TBCDField ReßlnΘ Φφslo s pevn²m poΦtem desetinn²ch mφst s p°esnostφ 18 Φφslic. Rozsah zßvisφ na poΦtu desetinn²ch mφst.
TBooleanField Hodnoty true nebo false.
TBlobField Binßrnφ data - teoreticky omezena 2GB.
TBytesField Binßrnφ data - teoreticky omezena 2GB.
TCurrencyField Reßlnß Φφsla v rozsahu 5.0 * 10-324 a╛ 1.7 * 10308. Pou╛φvßno v Paradoxu pro polo╛ky s dv∞mi desetinn²mi Φφslicemi.
TDataSetField* Polo╛kovß datovß mno╛ina.
TDateField Hodnota datumu.
TDateTimeField Hodnota datumu a Φasu.
TFloatField Reßlnß Φφsla v rozsahu 5.0 * 10-324 a╛ 1.7 * 10308
TIntegerField CelΘ Φφslo v rozsahu -2,147,483,648 a╛ 2,147,483,647.
TLargeintField* CelΘ Φφslo z rozsahu -263 a╛ 263.
TMemoField Textovß data - teoreticky omezena 2GB.
TNumericField Reßlnß Φφsla v rozsahu 3.4 * 10-4932 a╛ 1.1 * 104932.
TReferenceField* Odkazovß polo╛ka na objekt relaΦnφ databßze.
TSmallintField CelΘ Φφslo v rozsahu -32768 a╛ 32767.
TStringField ╪et∞zcovß data. Maximßlnφ poΦet slabik 8192 vΦetn∞ nulovΘho ukonΦujφcφho znaku.
TTimeField ╚asovß hodnota.
TVarBytesField Binßrnφ data - Maximßlnφ poΦet slabik 255.
TWordField CelΘ Φφslo v rozsahu 0 a╛ 65535.
* - OznaΦuje polo╛kovΘ komponenty p°idanΘ ve verzi 4 C++ Builderu.

V tΘto kapitole jsou popsßny vlastnosti a metody v╣ech polo╛kov²ch komponent zd∞d∞n²ch od TField. V mnoha p°φpadech TField deklaruje nebo implementuje standardnφ funkΦnost, kterou potomci p°episujφ. Pokud n∞kolik potomk∙ sdφlφ stejnou funkΦnost, pak jsou zde takΘ popsßny. ┌pln² popis jednotliv²ch polo╛kov²ch komponent najdeme v nßpov∞d∞.
Tato kapitola obsahuje nßsledujφcφ body:

Seznßmenφ s polo╛kov²mi komponentami

Stejn∞ jako v╣echny komponenty databßzovΘho p°φstupu i polo╛kovΘ komponenty jsou nevizußlnφ. Polo╛kovΘ komponenty nejsou takΘ p°φmo viditelnΘ p°i nßvrhu. Jsou p°i°azeny ke komponent∞ datovΘ mno╛iny a poskytujφ datov²m komponentßm jako je TDBEdit nebo TDBGrid p°φstup k databßzov²m sloupc∙m prost°ednictvφm tΘto datovΘ mno╛iny.
Obecn∞ °eΦeno, jedna polo╛kovß komponenta reprezentuje charakteristiky jednoho sloupce databßze (datov² typ a velikost). TakΘ reprezentuje zobrazovacφ charakteristiky polo╛ky, jako je zarovnßvßnφ, zobrazovacφ formßt a editaΦnφ formßt. KoneΦn∞, kdy╛ p°echßzφme ze zßznamu na zßznam v datovΘ mno╛in∞, polo╛kovΘ komponenty takΘ umo╛≥ujφ prohlφ╛enφ a zm∞nu hodnot polo╛ek v souΦasnΘm zßznamu. Komponenta TFloatField mß nap°. Φty°i vlastnosti, kterΘ p°φmo ovliv≥ujφ vzhled jejich dat:
 
Vlastnost V²znam
Alignment Specifikuje zarovnßvßnφ zobrazen²ch dat.
DisplayWidth Specifikuje poΦet Φφslic zobrazovan²ch v ovladaΦi.
DisplayFormat Specifikuje datov² formßt pro zobrazenφ (poΦet desetinn²ch mφst).
EditFormat UrΦuje jak je zobrazovßna hodnota v pr∙b∞hu editace.

Polo╛kovΘ komponenty majφ mnoho vlastnostφ spoleΦn²ch (nap°. DisplayWidth a Alignment) a majφ takΘ vlastnosti specifickΘ pro jejich datov² typ (nap°. Precision pro TFloatField). Ka╛dß z t∞chto vlastnostφ ovliv≥uje jak data budou zobrazena aplikacφ na formulß°i. N∞kterΘ vlastnosti, jako je Precision mohou takΘ ovliv≥ovat, kterΘ datovΘ hodnoty m∙╛e u╛ivatel zapisovat do ovladaΦe p°i modifikaci nebo zadßvßnφ dat.
V╣echny polo╛kovΘ komponenty pro datovou mno╛inu jsou bu∩ dynamickΘ (automaticky generovanΘ na zßklad∞ struktury p°ipojen²ch databßzov²ch tabulek) nebo trvalΘ (generovanΘ na zßklad∞ vlastnostφ nastaven²ch v Editoru polo╛ek). DynamickΘ a trvalΘ polo╛ky majφ r∙znΘ mo╛nosti a jsou urΦeny pro r∙znΘ typy aplikacφ. Rozdφly mezi mimi jsou popsßny v t∞chto bodech:

DynamickΘ polo╛kovΘ komponenty
Implicitn∞ jsou pou╛ity dynamickΘ polo╛kovΘ komponenty. Kdy╛ umφstφme komponentu datovΘ mno╛iny na formulß° nebo do datovΘho modulu, p°i°adφme datovou mno╛inu k databßzi a otev°eme ji, pak jsou pou╛ity dynamickΘ polo╛kovΘ komponenty. Polo╛kovß komponenta je dynamickß, pokud je vytvß°ena automaticky na zßklad∞ fyzick²ch charakteristik sloupce v databßzovΘ tabulce zp°φstupn∞nΘ datovou mno╛inou. C++ Builder generuje po jednΘ polo╛kovΘ komponent∞ pro ka╛d² sloupec v p°ipojenΘ tabulce nebo dotazu. Potomek TField vytvo°en² pro ka╛d² sloupec v p°ipojenΘ databßzovΘ tabulce je urΦen informacφ o typu polo╛ky zφskanou z BDE. Typ polo╛kovΘ komponenty urΦuje svΘ vlastnosti a zp∙sob zobrazenφ p°i°azen²ch dat v datovΘm ovladaΦi na formulß°i. DynamickΘ polo╛ky jsou doΦasnΘ. Existujφ pouze dokud je datovß mno╛ina otev°enß.
Poka╛dΘ, kdy╛ znova otev°eme datovou mno╛inu, kterß pou╛φvß dynamickΘ polo╛ky, pak C++ Builder pro nφ p°ebuduje kompletn∞ mno╛inu dynamick²ch polo╛kov²ch komponent, a to na zßklad∞ souΦasnΘ struktury databßzov²ch tabulek spojen²ch s datovou mno╛inou. Pokud sloupce v t∞chto databßzov²ch tabulkßch jsou zm∞n∞ny, pak p°i dal╣φm otev°enφ datovΘ mno╛iny, kterß pou╛φvß dynamickΘ polo╛kovΘ komponenty, jsou takΘ zm∞n∞ny automaticky generovanΘ polo╛kovΘ komponenty.
DynamickΘ polo╛ky pou╛ijeme v aplikacφch, kterΘ musφ flexibiln∞ zobrazovat a editovat data. Nap°. pro vytvo°enφ databßzovΘho nßstroje jako je Pr∙zkumnφk SQL, musφme pou╛φt dynamickΘ polo╛ky, proto╛e ka╛dß databßzovß tabulka mß jin² poΦet a typy sloupc∙. DynamickΘ polo╛ky m∙╛eme takΘ chtφt pou╛φt v aplikacφch, kde interakce s daty probφhß v komponentßch m°φ╛ky a vφme, ╛e databßzovΘ tabulky pou╛itΘ aplikacφ se Φasto m∞nφ.
K pou╛itφ dynamick²ch polo╛ek v aplikaci:
  1. Umφstφme datovΘ mno╛iny a datovΘ zdroje do datovΘho modulu (nebo na formulß°).
  2. P°i°adφme datovΘ mno╛iny k databßzov²m tabulkßm a dotaz∙m a p°i°adφme datovΘ zdroje k datov²m mno╛inßm.
  3. Umφstφme datovΘ ovladaΦe na formulß° aplikace, p°idßme datov² modul ke ka╛dΘ jednotce formulß°e a p°i°adφme v╣echny datovΘ ovladaΦe k datov²m zdroj∙m v modulu. Dßle p°i°adφme polo╛ky ke ka╛dΘmu datovΘmu ovladaΦi, kter² to vy╛aduje.
  4. Otev°eme datovΘ mno╛iny.
Pou╛φvßnφ dynamick²ch polo╛ek m∙╛e b²t omezeno. Bez zßpisu k≤du nem∙╛eme zm∞nit implicitnφ zobrazovßnφ a editovßnφ dynamick²ch polo╛ek, nem∙╛eme zm∞nit po°adφ, ve kterΘm dynamickΘ polo╛ky jsou zobrazeny a nem∙╛eme zabrßnit v p°φstupu k n∞kter²m polo╛kßm v datovΘ mno╛in∞. Nem∙╛eme takΘ vytvß°et dal╣φ polo╛ky pro datovou mno╛inu jako jsou poΦitatelnΘ nebo vyhledßvacφ polo╛ky a nem∙╛eme p°epsat implicitnφ datov² typ dynamick²ch polo╛ek. Pro zv²╣enφ °φzenφ a flexibility polo╛ek v na╣φ databßzovΘ aplikaci musφme vyvolat Editor polo╛ek pro vytvo°enφ trval²ch polo╛kov²ch komponent pro na╣e datovΘ mno╛iny.
TrvalΘ polo╛kovΘ komponenty
Implicitn∞ polo╛ky datovΘ mno╛iny jsou dynamickΘ. Jejich vlastnosti a mo╛nosti jsou nastavovßny automaticky a nemohou b²t ╛ßdn²m zp∙sobem m∞n∞ny. K zφskßnφ °φzenφ nad vlastnostmi a udßlostmi polo╛ek nebo zobrazovacφmi charakteristikami p°i nßvrhu nebo za b∞hu aplikace, vytvß°enφ nov²ch polo╛ek na zßklad∞ existujφcφch polo╛ek v datovΘ mno╛in∞ nebo ov∞°ovßnφ zadan²ch dat, musφme vytvo°it pro datovou mno╛inu trvalΘ polo╛ky.
B∞hem nßvrhu k vytvo°enφ trval²ch polo╛kov²ch komponent pou╛φvan²ch datov²mi mno╛inami v na╣ich aplikacφch pou╛φvßme Editor polo╛ek. Seznamy trval²ch polo╛kov²ch komponent jsou ulo╛eny v na╣φ aplikaci a nem∞nφ se, i kdy╛ se zm∞nφ struktura databßze p°i°azenΘ k datov²m mno╛inßm.
Vytvß°enφ trval²ch polo╛kov²ch komponent nabφzφ nßsledujφcφ v²hody. M∙╛eme: TrvalΘ polo╛ky jsou polo╛ky, kterΘ C++ Builder generuje na zßklad∞ jmen a vlastnostφ polo╛ek specifikovan²ch v Editoru polo╛ek. Kdy╛ ji╛ pomocφ Editoru polo╛ek vytvo°φme trvalΘ polo╛ky, pak m∙╛eme vytvß°et obsluhy udßlostφ, kterΘ reagujφ na zm∞ny datov²ch hodnot a kterΘ ov∞°ujφ zadanß data.
Poznßmka: Kdy╛ vytvo°φme trvalΘ polo╛ky pro datovou mno╛inu, pak pouze tyto polo╛ky jsou dostupnΘ v na╣φ aplikaci p°i nßvrhu a za b∞hu. P°i nßvrhu m∙╛eme v╛dy zvolit Add Fields v Editoru polo╛ek pro p°idßnφ (nebo odstran∞nφ) trval²ch polo╛ek datovΘ mno╛iny.
V╣echny polo╛ky pou╛itΘ jednou datovou mno╛inou jsou trvalΘ nebo dynamickΘ. Nelze mφchat v jednΘ datovΘ mno╛in∞ typy polo╛ek. Pokud vytvo°φme trvalΘ polo╛ky pro datovou mno╛inu a chceme se vrßtit k dynamick²m polo╛kßm, pak musφme odstranit v╣echny trvalΘ polo╛ky z datovΘ mno╛iny.
Poznßmka: Jednou z hlavnφch v²hod pou╛φvßnφ trval²ch polo╛ek je mo╛nost °φzenφ vzhledu a zobrazovßnφ dat. Vzhled dat m∙╛eme takΘ °φdit jin²m zp∙sobem. Nap°. m∙╛eme pou╛φt Datov² slovnφk k p°i°azenφ atribut∙ polo╛ek k polo╛kov²m komponentßm.

Vytvß°enφ trval²ch polo╛ek

TrvalΘ polo╛kovΘ komponenty vytvo°enΘ pomocφ Editoru polo╛ek poskytujφ efektivnφ, Φiteln² a typov∞ bezpeΦn² programov² p°φstup k p°ipojen²m dat∙m. Pou╛itφ trval²ch polo╛kov²ch komponent zaji╣╗uje p°i ka╛dΘm spu╣t∞nφ aplikace pou╛itφ stejn²ch sloupc∙ ve stejnΘm po°adφ a to i kdy╛ fyzickß struktura p°ipojenΘ databßze je zm∞n∞na. DatovΘ komponenty a k≤d programu s t∞mito polo╛kami pracuje tak, jak je oΦekßvßno. Pokud sloupec na kterΘm je trvalß polo╛kovß komponenta zalo╛ena, je zru╣en nebo zm∞n∞n, pak C++ Builder generuje v²jimku.
K vytvo°enφ trval²ch polo╛ek pro datovou mno╛inu:
  1. Umφstφme datovou mno╛inu do datovΘho modulu.
  2. Nastavφme vlastnost DatabaseName datovΘ mno╛iny.
  3. Nastavφme vlastnost TableName (pro TTable) nebo vlastnost SQL (pro TQuery).
  4. Dvojit∞ klikneme na komponentu datovΘ mno╛iny v datovΘm modulu k vyvolßnφ Editoru polo╛ek. Editor polo╛ek obsahuje titulnφ °ßdek, navigaΦnφ tlaΦφtka a okno seznamu. Titulnφ °ßdek Editoru polo╛ek zobrazuje jmΘno datovΘho modulu nebo formulß°e obsahujφcφho datovou mno╛inu a jmΘno samotnΘ datovΘ mno╛iny. Nap°. pokud otev°eme datovou mno╛inu Customers v datovΘm modulu CustomerData, pak titulnφ °ßdek zobrazuje CustomerData.Customer nebo n∞jak toto jmΘno zkrßcenΘ.

  5. Pod titulnφm °ßdkem je mno╛ina navigaΦnφch tlaΦφtek, kterΘ umo╛≥ujφ prochßzet zßznamy v aktivnφ datovΘ mno╛in∞ p°i nßvrhu. NavigaΦnφ tlaΦφtka jsou zaml╛ena, pokud datovß mno╛ina nenφ aktivnφ nebo je prßzdnß. Okno seznamu zobrazuje jmΘna trval²ch polo╛kov²ch komponent pro datovou mno╛inu. Kdy╛ poprvΘ vyvolßme Editor polo╛ek pro novou datovou mno╛inu, pak seznam je prßzdn², proto╛e polo╛kovΘ komponenty pro datovou mno╛inu jsou dynamickΘ a netrvalΘ. Pokud vyvolßme Editor polo╛ek pro datovou mno╛inu, kterß ji╛ mß trvalΘ polo╛kovΘ komponenty, pak vidφme jmΘna polo╛kov²ch komponent v seznamu.
  6. V mφstnφ nabφdce Editoru polo╛ek zvolφme Add Fields.
  7. V dialogovΘm okn∞ Add Fields vybereme polo╛ky, kterΘ chceme ud∞lat trval²mi. Implicitn∞ p°i otev°enφ dialogovΘho okna jsou vybrßny v╣echny polo╛ky datovΘ mno╛iny. Po uzav°enφ dialogovΘho okna se vybranΘ polo╛ky stanou trval²mi a jsou uvedeny v seznamu trval²ch polo╛ek.
Nynφ p°i dal╣φm otev°enφ datovΘ mno╛iny, C++ Builder ji╛ nevytvß°φ dynamickΘ polo╛kovΘ komponenty a vytvß°φ pouze trvalΘ komponenty pro nßmi specifikovanΘ polo╛ky. P°i ka╛dΘm otev°enφ datovΘ mno╛iny nynφ C++ Builder ov∞°uje, zda v╣echny nepoΦitatelnΘ trvalΘ polo╛ky existujφ nebo zda mohou b²t vytvo°eny z dat v databßzi. Pokud je nelze vytvo°it, pak je generovßna v²jimka varujφcφ, ╛e polo╛ka nenφ p°φpustnß a datovß mno╛ina nenφ otev°ena.

Aran╛ovßnφ trval²ch polo╛ek

Po°adφ, ve kterΘm jsou trvalΘ polo╛kovΘ komponenty uvedeny v seznamu Editoru polo╛ek je implicitnφ po°adφ, ve kterΘm jsou polo╛ky zobrazovßny v datovΘ komponent∞ m°φ╛ky. Po°adφ polo╛ek v tomto seznamu m∙╛eme zm∞nit jejich p°eta╛enφm. Pokud vybereme nesouvislou mno╛inu polo╛ek a tßhneme je na novΘ mφsto, pak jsou vlo╛eny jako souvisl² blok. Po°adφ polo╛ek uvnit° bloku se nem∞nφ. K p°esunu vybranΘ polo╛ky je takΘ mo╛no pou╛φt klßvesy Ctrl+Up a Ctrl+Down.

Definovßnφ nov²ch trval²ch polo╛ek

Mimo zm∞ny existujφcφch polo╛ek datovΘ mno╛iny na trvalΘ polo╛ky, m∙╛eme takΘ vytvß°et specißlnφ trvalΘ polo╛ky p°idanΘ nebo nahrazujφcφ ostatnφ trvalΘ polo╛ky v datovΘ mno╛in∞. Nßsledujφcφ tabulka uvßdφ seznam typ∙ p°idßvan²ch polo╛ek, kterΘ m∙╛eme vytvß°et.
 
Typ polo╛ky V²znam
Data Nahrazuje existujφcφ polo╛ku (nap°. m∞nφ jejφ datov² typ zalo╛en² na sloupci v tabulce nebo dotazu p°ipojenΘ datovΘ mno╛iny).
Calculated Zabrazuje hodnoty vypoΦφtanΘ za b∞hu obsluhou udßlosti OnCalcFields datovΘ mno╛iny.
InternalCalc Zobrazuje hodnoty vypoΦφtanΘ za b∞hu klientskou datovou mno╛inou a ulo╛enΘ v jejich datech.
Lookup Zφskßvß hodnoty ze specifikovanΘ datovΘ mno╛iny na zßklad∞ nßmi specifikovanΘho vyhledßvacφho kritΘria.
Aggregate Zobrazuje souΦtovΘ hodnoty dat v mno╛in∞ zßznam∙. Zavedeno ve verzi 4 C++ Builderu.

Tyto typy trval²ch polo╛ek slou╛φ pouze pro ·Φely zobrazovßnφ. Data, kterß obsahujφ za b∞hu, nez∙stßvajφ, proto╛e ji╛ existujφ n∞kde v na╣i databßzi nebo proto╛e jsou doΦasnΘ. Fyzickß struktura dat p°ipojen²ch k datovΘ mno╛in∞ se ╛ßdn²m zp∙sobem nem∞nφ.
K vytvo°enφ novΘ trvalΘ polo╛kovΘ komponenty zvolφme v mφstnφ nabφdce Editoru polo╛ek New Field. Tφm zobrazφme dialogovΘ okno New Field. Toto okno obsahuje t°i podokna: Field properties, Field type a Lookup definition. VoliΦe v Φßsti Field type umo╛≥ujφ specifikovat typ vytvß°enΘ polo╛kovΘ komponenty. Implicitnφ typ je Data. Pokud zvolφme Lookup, pak editaΦnφ ovladaΦe Dataset a SourceFields ve skupin∞ Lookup definition jsou povoleny. M∙╛eme takΘ vytvß°et poΦitatelnΘ polo╛ky a jestli╛e pracujeme s komponentou TClientDataSet, pak lze takΘ vytvß°et polo╛ky InternalCalc.
╚ßst Field properties umo╛≥uje zadßvat obecnΘ informace o polo╛kovΘ komponent∞. JmΘno polo╛kovΘ komponenty zadßvßme do editaΦnφho ovladaΦe Name. ZadanΘ jmΘno odpovφdß vlastnosti FieldName polo╛kovΘ komponenty. C++ Builder pou╛ije toto jmΘno k vytvo°enφ jmΘna komponenty v editaΦnφm ovladaΦi Component. JmΘno zobrazovanΘ v Component odpovφdß vlastnosti Name polo╛kovΘ komponenty a je zde zobrazovßno pouze pro identifikaci (je to identifikßtor, kter² pou╛φvßme p°i odkazech na komponentu ze zdrojovΘho k≤du). Do Φßsti Component neumo╛≥uje C++ Builder p°φm² zßpis.
Kombinovan² ovladaΦ Type v Φßsti Field properties umo╛≥uje specifikovat datov² typ polo╛kovΘ komponenty. Datov² typ musφme zadat pro v╣echny vytvß°enΘ novΘ polo╛kovΘ komponenty. Nap°. pro zobrazovßnφ pen∞╛nφ hodnoty v polo╛ce, vybereme v rozbalovacφm seznamu Currency. EditaΦnφ ovladaΦ Size umo╛≥uje specifikovat maximßlnφ poΦet znak∙ zobrazovan²ch nebo zadßvan²ch v polo╛kßch zalo╛en²ch na °et∞zcφch nebo velikost polo╛ek Bytes a VarBytes. Pro v╣echny ostatnφ datovΘ typy Size nemß v²znam.
╚ßst Lookup definition je povolena pouze p°i nastavenφ Field type na Lookup. Volbami v tΘto Φßsti se budeme zab²vat pozd∞ji.
V tΘto Φßsti jsou uvedeny je╣t∞ nßsledujφcφ body:

Definovßnφ datovΘ polo╛ky
Datovß polo╛ka nahrazuje existujφcφ polo╛ku v datovΘ mno╛in∞. Nap°. z programov²ch d∙vod∙ chceme nahradit TSmallIntField typem TIntegerField. Proto╛e nem∙╛eme zm∞nit typ polo╛ky p°φmo, musφme definovat novou polo╛ku, kterß ji nahradφ.
Pozor: Polo╛ka, kterou definujeme, musφ odvozovat svΘ hodnoty od existujφcφho sloupce v tabulce p°ipojenΘ datovΘ mno╛iny.
K vytvo°enφ nahrazujφcφ datovΘ polo╛ky pro polo╛ku v tabulce p°i°azenΘ datovΘ mno╛iny provedeme tyto kroky:
  1. Odstranφme polo╛ku ze seznamu trval²ch polo╛ek p°i°azen²ch k datovΘ mno╛in∞ a pak v mφstnφ nabφdce zvolφme New Field.
  2. V dialogovΘm okn∞ New Field zadßme jmΘno existujφcφ polo╛ky v databßzovΘ tabulce do editaΦnφho ovladaΦe Name. Nezadßvßme novΘ jmΘno polo╛ky, ale specifikujeme jmΘno tΘ polo╛ky, od kterΘ novß polo╛ka odvozuje svß data.
  3. Zvolφme nov² datov² typ pro polo╛ku v kombinovanΘm ovladaΦi Type (je nutno zvolit typ li╣φcφ se od datovΘho typu nahrazovanΘ polo╛ky). Nem∙╛eme nahradit °et∞zcovou polo╛ku jednΘ dΘlky, °et∞zcovou polo╛kou jinΘ dΘlky. I kdy╛ datov² typ musφ b²t r∙zn², musφ b²t kompatibilnφ s aktußlnφm datov²m typem polo╛ky v p°i°azenΘ tabulce.
  4. Pokud je to pot°eba, pak zadßme velikost polo╛ky v editaΦnφm ovladaΦi Size. Velikost zadßvßme pouze pro polo╛ky typ∙ TStringField, TBytesField a TVarBytesField.
  5. V Φßsti Field type zvolφme voliΦ Data.
  6. Stiskneme OK. DialogovΘ okno se uzav°e, nov∞ definovanß datovß polo╛ka nahradφ existujφcφ polo╛ku a je aktualizovßna deklarace komponenty v datovΘm modulu nebo na formulß°i.
Pro editaci vlastnostφ nebo udßlostφ p°i°azen²ch k polo╛kovΘ komponent∞, vybereme jmΘno komponenty v seznamu Editoru polo╛ek a vlastnosti nebo udßlosti editujeme pomocφ Inspektora objekt∙.
Definovßnφ poΦitateln²ch polo╛ek
PoΦitatelnΘ polo╛ky zobrazujφ hodnoty vypoΦφtanΘ za b∞hu aplikace obsluhou udßlosti OnCalcFields. Nap°. m∙╛eme vytvo°it °et∞zcovou polo╛ku, kterß zobrazuje spojenφ hodnot z jin²ch polo╛ek.
K vytvo°enφ poΦitatelnΘ polo╛ky v dialogovΘm okn∞ New Field:
  1. Do editaΦnφho ovladaΦe Name zadßme jmΘno poΦitatelnΘ polo╛ky. Nezadßvßme jmΘno existujφcφ polo╛ky.
  2. V kombinovanΘm ovladaΦi Type zvolφme datov² typ pro polo╛ku.
  3. Pokud vytvß°φme polo╛ku typu TStringField, TBytesField nebo TVarBytesField, pak do editaΦnφho ovladaΦe Size zadßme velikost.
  4. V Φßsti Field type zvolφme Calculated.
  5. Stiskneme OK. Nov∞ definovanß polo╛ka je automaticky p°idßna na konec seznamu trval²ch polo╛ek v Editoru polo╛ek a deklarace komponenty je automaticky p°idßna do deklarace ve zdrojovΘm k≤du datovΘho modulu nebo formulß°e.
  6. Umφstφme k≤d, kter² vypoΦφtßvß hodnotu polo╛ky do obsluhy OnCalcField datovΘ mno╛iny.
Poznßmka: Pro editovßnφ vlastnostφ nebo udßlostφ p°i°azen²ch k polo╛kovΘ komponent∞, vybereme jmΘno komponenty v seznamu Editoru polo╛ek a vlastnosti nebo udßlosti editujeme pomocφ Inspektora objekt∙.
Pokud pracujeme s klientskou datovou mno╛inou nebo komponentou TQuery, pak m∙╛eme takΘ vytvo°it polo╛ku InternalCalc. Internφ poΦitatelnΘ polo╛ky vytvß°φme a programujeme podobn∞ jako poΦitatelnΘ polo╛ky. Pro klientskou datovou mno╛inu je v²znamn² rozdφl mezi t∞mito typy poΦitateln²ch polo╛ek v tom, ╛e vypoΦφtanΘ hodnoty pro polo╛ky InternalCalc jsou ulo╛eny a zφskßvßny jako Φßst dat klientskΘ datovΘ mno╛iny. K vytvo°enφ polo╛ky InternalCalc vybereme voliΦ InternalCalc v Φßsti Field type.
Programovßnφ poΦitatelnΘ polo╛ky
Po definovßnφ poΦitatelnΘ polo╛ky, musφme zapsat k≤d pro v²poΦet jejφ hodnoty. Jinak mß v╛dy hodnotu NULL. K≤d pro poΦitatelnou polo╛ku je umφst∞n v obsluze udßlosti OnCalcFields pro jejφ datovou mno╛inu.
K naprogramovßnφ v²poΦtu hodnoty pro poΦitatelnou polo╛ku:
  1. Vybereme komponentu datovΘ mno╛iny v rozbalovacφm seznamu Inspektora objekt∙.
  2. P°ejdeme na strßnku udßlostφ Inspektora objekt∙ a dvojit∞ klikneme na udßlosti OnCalcFields.
  3. Zapφ╣eme k≤d, kter² nastavφ hodnotu a dal╣φ vlastnosti poΦitatelnΘ polo╛ky podle pot°eby.
Nap°. p°edpoklßdejme, ╛e mßme vytvo°enou poΦitatelnou polo╛ku CityStateZip pro tabulku Customers v datovΘm modulu CustomerData. CityStateZip mß zobrazit m∞sto, stßt a po╣tovnφ k≤d podniku na jednom °ßdku v datovΘm ovladaΦi. Do obsluhy udßlosti OnCalcFields p°idßme nßsledujφcφ k≤d:
CustomersCityStateZip->Value = CustomersCity->Value + AnsiString(", ") +
    CustomersState->Value + AnsiString(" ") + CustomersZip->Value;
Definovßnφ vyhledßvacφ polo╛ky
Vyhledßvacφ polo╛ky jsou polo╛ky urΦenΘ pouze pro Φtenφ, kterΘ zobrazujφ hodnoty za b∞hu aplikace na zßklad∞ specifikovanΘho vyhledßvacφho kritΘria. V nejjednodu╣╣φm tvaru je vyhledßvacφ polo╛ce p°edßno jmΘno existujφcφ prohledßvanΘ polo╛ky, hledanß hodnota a jinß polo╛ka v prohledßvanΘ datovΘ mno╛in∞, jejφ╛ hodnota mß b²t zobrazena.
Nap°. p°edpoklßdejme aplikaci pou╛φvajφcφ vyhledßvacφ polo╛ku k automatickΘmu urΦenφ m∞sta a stßtu na zßklad∞ po╣tovnφho k≤du. V tomto p°φpad∞ sloupec urΦujφcφ hledßnφ m∙╛e b²t ZipTable->Zip, hodnota urΦujφcφ hledßnφ je urΦena Order->CustZip a vrßcenou hodnotu tvo°φ sloupce ZipTable->City a ZipTyble->State zßznamu, kde hodnota ZipTable->Zip odpovφdß souΦasnΘ hodnot∞ v polo╛ce Order->CustZip.
K vytvo°enφ vyhledßvacφ polo╛ky v dialogovΘm okn∞ New Field:
  1. Zadßme jmΘno pro vyhledßvacφ polo╛ku do editaΦnφho ovladaΦe Name. Nesmφme zadat jmΘno existujφcφ polo╛ky.
  2. Zvolφme datov² typ pro polo╛ku v kombinovanΘm ovladaΦi Type.
  3. Pro polo╛ky typ∙ TStringField, TBytesField a TVarBytesField zadßme do editaΦnφho ovladaΦe Size velikost polo╛ky.
  4. V Φßsti Field type zvolφme voliΦ Lookup (tφm umo╛nφme pou╛φvat kombinovanΘ ovladaΦe Dataset a Key Fields).
  5. V kombinovanΘm ovladaΦi Dataset vybereme datovou mno╛inu, ve kterΘ chceme vyhledßvat hodnotu polo╛ky (musφ se jednat o jinou datovou mno╛inu a nesmφ nastat kruhov² odkaz). Specifikace tΘto datovΘ mno╛iny povolφ pou╛itφ kombinovan²ch ovladaΦ∙ Lookup Keys a Result Field.
  6. V kombinovanΘm ovladaΦi Key Fields zvolφme polo╛ku v souΦasnΘ datovΘ mno╛in∞, pro kterou hledßme hodnotu. K vyhledßvßnφ vφce ne╛ v jednΘ polo╛ce, zadßme jmΘna polo╛ek p°φmo (bez jejich v²b∞ru v seznamu) a odd∞lujeme je st°ednφky. Pokud pou╛φvßme vφce ne╛ jednu polo╛ku, pak musφme pou╛φt komponenty trval²ch polo╛ek.
  7. V kombinovanΘm ovladaΦi Lookup Keys vybereme polo╛ku z prohledßvanΘ datovΘ mno╛iny, pou╛itou jako zdrojovou polo╛ku odpovφdajφcφ polo╛ce specifikovanΘ v p°edchozφm kroku. Pokud specifikujeme vφce ne╛ jednu klφΦovou polo╛ku, pak musφme specifikovat stejn² poΦet vyhledßvacφch klφΦ∙. Pro specifikaci vφce ne╛ jednΘ polo╛ky, zadßvßme jmΘna polo╛ek p°φmo (odd∞lujeme je st°ednφky).
  8. V kombinovanΘm ovladaΦi Result Field vybereme polo╛ku z prohledßvanΘ datovΘ mno╛iny urΦujφcφ vracenou hodnotu vytvo°enΘ vyhledßvacφ polo╛ky.
Kdy╛ navrhneme a spustφme na╣φ aplikaci, pak hodnoty vyhledßvacφch polo╛ek jsou urΦeny p°ed v²poΦtem poΦitateln²ch polo╛ek. Jako zßklad poΦitateln²ch polo╛ek lze pou╛φt vyhledßvacφ polo╛ky, ale nelze pou╛φt poΦitatelnΘ polo╛ky jako zßklad pro vyhledßvacφ polo╛ky. Ke zm∞n∞ tohoto chovßnφ m∙╛eme pou╛φt vlastnost LookupCache. LookupCache urΦuje zda hodnoty vyhledßvacφch polo╛ek jsou ulo╛eny do vyrovnßvacφ pam∞ti p°i prvnφm otev°enφ datovΘ mno╛iny nebo zda jsou hledßny dynamicky v╛dy p°i zm∞n∞ souΦasnΘho zßznamu datovΘ mno╛iny.
LookupCache nastavφme na true (ulo╛enφ hodnot vyhledßvacφch polo╛ek), kdy╛ vyhledßvacφ datovß mno╛ina se z°φdka m∞nφ a poΦet r∙zn²ch vyhledßvan²ch hodnot je mal². Uklßdßnφ vyhledßvan²ch hodnot m∙╛e zv²╣it v²konnost, proto╛e vyhledßvanΘ hodnoty pro ka╛dou mno╛inu hodnot vyhledßvacφ polo╛ky jsou p°edzavedeny p°i otev°enφ datovΘ mno╛iny. Kdy╛ se zm∞nφ souΦasn² zßznam v datovΘ mno╛in∞, pak objekt polo╛ky m∙╛e lokalizovat svoji hodnotu ve vyrovnßvacφ pam∞ti namφsto jejφho vyhledßvßnφ ve vyhledßvacφ datovΘ mno╛in∞. Tato v²konnost vzroste znaΦn∞, pokud vyhledßvacφ datovß mno╛ina je na sφti s pomal²m p°φstupem.
Tip: M∙╛eme pou╛φt vyhledßvacφ vyrovnßvacφ pam∞╗ k poskytnutφ vyhledßvan²ch hodnot programov∞ mφsto z jinΘ datovΘ mno╛iny. Za b∞hu vytvo°φme objekt TLookupList a pou╛ijeme jeho metodu Add k jeho napln∞nφ vyhledßvan²mi hodnotami. Nastavφme vlastnost LookupList vyhledßvacφ polo╛ky na tento objekt TLookupList a nastavφme jeho vlastnost LookupCache na true. Pokud dal╣φ vyhledßvacφ vlastnosti nejsou nastaveny, pak polo╛ka pou╛ije dodan² vyhledßvacφ seznam bez jeho p°epsßnφ hodnotami z vyhledßvacφ datovΘ mno╛iny.
Pokud ka╛d² zßznam datovΘ mno╛iny mß jinou hodnotu pro KeyFields, pak nßklady na vlo╛enφ hodnot do vyrovnßvacφ pam∞ti mohou b²t v∞t╣φ ne╛ zisk poskytnut² vyrovnßvacφ pam∞tφ. Nev²hoda roste s poΦtem r∙zn²ch hodnot KeyFields.
Pokud vyhledßvacφ datovß mno╛ina se m∞nφ, pak uklßdßnφ vyhledßvacφch hodnot do vyrovnßvacφ pam∞ti m∙╛e vΘst k nesprßvn²m v²sledk∙m. M∙╛eme volat metodu RefreshLookupList pro aktualizaci hodnot ve vyhledßvacφ vyrovnßvacφ pam∞ti. RefreshLookupList regeneruje vlastnost LookupList, kterß obsahuje hodnoty LookupResultField pro ka╛dou mno╛inu hodnot LookupKeyFields.
Kdy╛ nastavφme LookupCache za b∞hu, pak volßnφ RefreshLookupList inicializuje vyrovnßvacφ pam∞╗.
Definovßnφ agregovan²ch polo╛ek
AgregovanΘ polo╛ky zobrazujφ hodnoty z udr╛ovanΘho agregßtu v klientskΘ datovΘ mno╛in∞. Agregßt je v²poΦet, kter² sumarizuje data v mno╛in∞ zßznam∙. K vytvo°enφ agregovanΘ polo╛ky v dialogovΘm okn∞ New Field:
  1. Zadßme jmΘno pro agregovanou polo╛ku do editaΦnφho ovladaΦe Name. Nesmφme zadat jmΘno existujφcφ polo╛ky.
  2. V kombinovanΘm ovladaΦi Type zvolφme pro polo╛ku agregovan² datov² typ.
  3. V Φßsti Field type zvolßme Aggregate.
  4. Stiskneme OK. Nov∞ definovanß polo╛ka je automaticky p°idßna na konec seznamu trval²ch polo╛ek v Editoru polo╛ek a deklarace komponenty je automaticky p°idßna do deklarace ve zdrojovΘm k≤du datovΘho modulu nebo formulß°e.
  5. Umφstφme v²poΦty pro agregßt do vlastnosti ExprText nov∞ vytvo°enΘ agregovanΘ polo╛ky.
Po vytvo°enφ TAggregateField m∙╛e b²t na agregovanou polo╛ku napojen ovladaΦ TDBText. OvladaΦ TDBText pak zobrazuje hodnotu agregovanΘ polo╛ky, kterß se vztahuje k souΦasnΘmu zßznamu v p°ipojenΘ klientskΘ datovΘ mno╛in∞.
Ru╣enφ trval²ch polo╛kov²ch komponent
Ru╣enφ trval²ch polo╛kov²ch komponent je u╛iteΦnΘ p°i zp°φstup≥ovßnφ podmno╛iny z mo╛n²ch sloupc∙ v tabulce a pro definovßnφ na╣ich vlastnφch trval²ch polo╛ek k nahrazenφ sloupc∙ v tabulce. K odstran∞nφ trval²ch polo╛kov²ch komponent z datovΘ mno╛iny, tyto polo╛ky vybereme v seznamu Editoru polo╛ek a stiskneme klßvesu Del (je mo╛no takΘ pou╛φt volbu Delete v mφstnφ nabφdce).
Odstran∞nΘ polo╛ky nejsou dßle dostupnΘ v datovΘ mno╛in∞ a nemohou b²t zobrazovßny datov²mi ovladaΦi. Odstran∞nΘ trvalΘ polo╛ky m∙╛eme kdykoliv op∞t vytvo°it, ale v╣echny d°φve provedenΘ zm∞ny jsou ztraceny.
Poznßmka: Pokud odstranφme v╣echny trvalΘ polo╛kovΘ komponenty z datovΘ mno╛iny, pak datovß mno╛ina zaΦne op∞t pou╛φvat dynamickΘ komponenty pro ka╛d² sloupec v p°i°azenΘ databßzovΘ tabulce.

Nastavovßnφ vlastnostφ a udßlostφ trval²ch polo╛ek

B∞hem nßvrhu m∙╛eme nastavovat vlastnosti a p°izp∙sobovat udßlosti trval²ch polo╛kov²ch komponent. Vlastnosti urΦujφ zp∙sob zobrazovßnφ polo╛ky v datovΘ komponent∞, nap°. zda m∙╛e b²t zobrazena v TDBGrid nebo zda jejφ hodnota m∙╛e b²t modifikovßna. Obsluhy udßlostφ urΦujφ co nastane, kdy╛ data jsou zφskßna, zm∞n∞na, nastavena nebo ov∞°ovßna.
K nastavovßnφ vlastnostφ polo╛kov²ch komponent nebo zßpisu jejich obsluh udßlostφ, pou╛φvßme po jejich v²b∞ru obvykl²m zp∙sobem Inspektor objekt∙.
V tΘto Φßsti jsou uvedeny je╣t∞ tyto body:
Nastavovßnφ zobrazovacφch a editaΦnφch vlastnostφ p°i nßvrhu
K editaci zobrazovacφch vlastnostφ vybranΘ polo╛kovΘ komponenty p°ejdeme na strßnku vlastnostφ Inspektora objekt∙. Vlastnosti, kterΘ m∙╛eme editovat, jsou uvedeny v nßsledujφcφ tabulce.
 
Vlastnost V²znam
Alignment Zarovnßvßnφ (vlevo, vpravo nebo na st°ed) obsahu polo╛ky v datovΘm ovladaΦi.
ConstraintErrorMessage Specifikuje text zobrazen², kdy╛ editace se dostane do rozporu s omezujφcφmi podmφnkami.
CustomConstraint Specifikuje lokßlnφ omezenφ aplikovanΘ na data b∞hem editace.
Currency Pouze pro ΦφselnΘ polo╛ky. true - zobrazenφ pen∞╛nφ hodnoty; false (implicitn∞) - nezobrazovßnφ pen∞╛nφ hodnoty.
DisplayFormat Specifikuje formßt dat zobrazen²ch v datovΘm ovladaΦi.
DisplayLabel Specifikuje jmΘno sloupce pro polo╛ku v datovΘ komponent∞ m°φ╛ky.
DisplayWidth Specifikuje ╣φ°ku (ve znacφch) sloupce m°φ╛ky, kter² zobrazuje polo╛ku.
EditFormat Specifikuje editaΦnφ formßt dat v datovΘm ovladaΦi.
EditMask Omezuje datov² vstup v editovatelnΘ polo╛ce na specifikovan² typ a rozsah znak∙ a specifikuje p°φpadnΘ specißlnφ needitovatelnΘ znaky zobrazovanΘ v polo╛ce (pomlΦky, zßvorky apod.).
FieldKind Specifikuje typ vytvo°enΘ polo╛ky.
FieldName Specifikuje aktußlnφ jmΘno sloupce v tabulce, od kterΘho polo╛ka odvozuje svou hodnotu a datov² typ.
HasConstraints Indikuje, zda existuje omezenφ vzta╛enΘ na polo╛ku.
ImportedConstraint Specifikuje SQL omezenφ importovanΘ z DatovΘho slovnφku nebo SQL serveru.
Index Specifikuje po°adφ polo╛ky v datovΘ mno╛in∞.
LookupDataSet Specifikuje tabulku pou╛itou k vyhledßvßnφ hodnot u vyhledßvacφch polo╛ek.
LookupKeyFields Specifikuje polo╛ku(y) ve vyhledßvacφ datovΘ mno╛in∞ pou╛itΘ k vyhledßvßnφ.
LookupResultField Specifikuje polo╛ku ve vyhledßvacφ datovΘ mno╛in∞ jejich╛ hodnota je p°ekopφrovßna do tΘto polo╛ky.
MaxValue Pouze pro ΦφselnΘ polo╛ky. UrΦuje maximßlnφ hodnotu, kterou u╛ivatel m∙╛e zadat do polo╛ky.
MinValue Pouze pro ΦφselnΘ polo╛ky. UrΦuje minimßlnφ hodnotu, kterou u╛ivatel m∙╛e zadat do polo╛ky.
Name Specifikuje jmΘno polo╛kovΘ komponenty.
Origin Specifikuje jmΘno polo╛ky jak je zobrazeno v p°i°azenΘ databßzi.
Precision Pouze pro ΦφselnΘ polo╛ky. Specifikuje poΦet v²znamn²ch Φφslic.
ReadOnly true - zobrazuje hodnotu polo╛ky v datovΘm ovladaΦi, ale zabra≥uje jejφ editaci; false (implicitn∞) - umo╛≥uje zobrazenφ a editaci hodnoty polo╛ky.
Size UrΦuje maximßlnφ poΦet znak∙, kterΘ mohou b²t zobrazeny nebo zadßny v °et∞zcovΘ polo╛ce nebo velikost (ve slabikßch) polo╛ek TBytesField nebo TVarBytesField
Tag CelΘ Φφslo p°φstupnΘ pro pou╛itφ programßtorem v ka╛dΘ komponent∞.
Transliterate true (implicitn∞) - urΦuje, zda m∙╛e nastat p°eklad do a z p°φpadnΘ lokalizace, kdy╛ data jsou p°enß╣ena mezi datovou mno╛inou a databßzφ; false - lokalizovan² p°eklad nenastßvß.
Visible true (implicitn∞) - umo╛≥uje zobrazenφ polo╛ky v datovΘ komponent∞ m°φ╛ky; false - zabra≥uje zobrazovßnφ polo╛ky v datovΘ komponent∞ m°φ╛ky. U╛ivatelem definovanΘ komponenty mohou provßd∞t zobrazovßnφ na zßklad∞ tΘto vlastnosti.

Ne v╣echny vlastnosti jsou p°φstupnΘ pro v╣echny komponenty. Nap°. polo╛kovΘ komponenty typu TStringField nemajφ vlastnosti Currency, MaxValue nebo DisplayFormat a komponenta typu TFloatField nemß vlastnost Size.
Zatφmco v²znam v∞t╣iny vlastnostφ je jasn² a p°φmoΦar², n∞kterΘ vlastnosti, jako je DisplayFormat, EditFormat a EditMask jsou svßzanΘ a jejich nastavenφ musφ b²t koordinovßno.

Nastavovßnφ vlastnostφ polo╛kov²ch komponent za b∞hu
S vlastnostmi polo╛kov²ch komponent m∙╛eme manipulovat a pou╛φvat je za b∞hu. Nap°. nßsledujφcφ k≤d nastavuje vlastnost ReadOnly polo╛ky CityStateZip v tabulce Custometrs na true:
CustomersCityStateZip->ReadOnly = true;
Dal╣φ p°φkaz m∞nφ po°adφ polo╛ky nastavenφm vlastnosti Index polo╛ky CityStateZip v tabulce Customers na 3:
CustomersCityStateZip->Index = 3;
Vytvß°enφ mno╛iny atribut∙ pro polo╛kovΘ komponenty
Kdy╛ n∞kolik polo╛ek v datov²ch mno╛inßch pou╛φvan²ch na╣φ aplikacφ sdφlφ spoleΦnΘ formßtovacφ vlastnosti (jako je Alignment, DisplayWidth, DisplayFormat, MaxValue, MinValue apod.), pak  je v²hodn∞j╣φ ne╛ nastavovat tyto vlastnosti pro jednotlivΘ polo╛ky samostatn∞, ulo╛it vlastnosti jako mno╛inu atribut∙ v DatovΘm slovnφku. Mno╛ina atribut∙ ulo╛enß v DatovΘm slovnφku m∙╛e b²t snadno aplikovßna na ostatnφ polo╛ky.
K vytvo°enφ mno╛iny atribut∙ zalo╛en²ch na polo╛kovΘ komponent∞ v datovΘ mno╛in∞:
  1. Dvojit²m kliknutφm na datovΘ mno╛in∞ vyvolßme Editor polo╛ek.
  2. Vybereme polo╛ku, pro kterou chceme nastavovat vlastnosti.
  3. Nastavφme po╛adovanΘ vlastnosti pro polo╛ku v Inspektoru objekt∙.
  4. V mφstnφ nabφdce Editoru polo╛ek zvolφme Save Attributes k ulo╛enφ souΦasnΘho nastavenφ vlastnostφ jako mno╛inu atribut∙ v DatovΘm slovnφku.
JmΘno pro mno╛inu atribut∙ je implicitn∞ jmΘno souΦasnΘ polo╛ky. Pro mno╛inu atribut∙ m∙╛eme specifikovat jinΘ jmΘno p°i pou╛itφ volby Save Attributes As.
Poznßmka: M∙╛eme takΘ vytvß°et mno╛inu atribut∙ p°φmo v Pr∙zkumnφku SQL. Kdy╛ vytvo°φme mno╛inu atribut∙ v DatovΘm slovnφku, pak nenφ aplikovßna na n∞jakΘ polo╛ky, ale m∙╛eme specifikovat dva p°idanΘ atributy: typ polo╛ky (jako je TFloatField, TStringField apod.) a datov² ovladaΦ (jako je TDBEdit, TDBCheckBox apod.), kter² je automaticky umφst∞n na formulß°, kdy╛ polo╛ka zalo╛enß na mno╛in∞ atribut∙ je p°eta╛ena na formulß°.
P°i°azenφ mno╛iny atribut∙ k polo╛kovΘ komponent∞
Kdy╛ n∞kolik polo╛ek v datov²ch mno╛inßch pou╛it²ch na╣φ aplikacφ sdφlφ spoleΦnΘ formßtovacφ vlastnosti a nastavenφ t∞chto vlastnostφ mßme ulo╛enΘ v mno╛in∞ atribut∙ v DatovΘm slovnφku, pak m∙╛eme snadno tuto mno╛inu atribut∙ aplikovat na polo╛ky bez nutnosti manußlnφho nastavovßnφ pro ka╛dou polo╛ku.
Pro aplikovßnφ mno╛iny atribut∙ na polo╛kovou komponentu:
  1. Dvojit∞ klikneme na datovou mno╛inu k vyvolßnφ Editoru polo╛ek.
  2. Vybereme polo╛ky na kterΘ chceme aplikovat mno╛inu atribut∙.
  3. V mφstnφ nabφdce Editoru polo╛ek zvolφme Associate Attributes a vybereme nebo zadßme aplikovanou mno╛inu atribut∙. Pokud je v DatovΘm slovnφku mno╛ina atribut∙, kterß mß stejnΘ jmΘno jako souΦasnß polo╛ka, pak toto jmΘno mno╛iny je zobrazeno v editaΦnφm ovladaΦi.
Pozor: Pokud mno╛ina atribut∙ v DatovΘm slovnφku se pozd∞ji zm∞nφ, pak musφme op∞tovn∞ aplikovat mno╛inu atribut∙ na ka╛dou polo╛kovou komponentu, kterou pou╛φvßme.
Odstra≥ovßnφ asociacφ atribut∙
Kdy╛ zm∞nφme svΘ ·mysly o p°i°azenφ mno╛iny atribut∙ k polo╛kßm, pak asociaci m∙╛eme odstranit t∞mito kroky:
  1. Vyvolßme Editor polo╛ek pro datovou mno╛inu obsahujφcφ polo╛ku.
  2. Vybereme polo╛ku nebo polo╛ky, pro kterΘ chceme odstranit asociace a v mφstnφ nabφdce Editoru zvolφme Unassociate Attributes.
Pozor: Odasociovßnφ mno╛iny atribut∙ nem∞nφ ╛ßdnΘ vlastnosti polo╛ek. Polo╛ky z∙stanou tak, jakΘ byly, kdy╛ mno╛ina atribut∙ byla na nφ aplikovßna. Ke zm∞m∞ t∞chto vlastnostφ, vybereme polo╛ku v Editoru polo╛ek a nastavφme jejφ vlastnosti v Inspektoru objekt∙.
╪φzenφ a maskovßnφ vstupu u╛ivatele
Vlastnost EditMask poskytuje mo╛nost °φzenφ typu a rozsahu hodnot zadßvan²ch u╛ivatelem do datovΘho ovladaΦe p°i°azenΘho k polo╛kov²m komponentßm TStringField, TDateField, TTimeField a TDateTimeField. M∙╛eme pou╛φt existujφcφ masku nebo vytvo°it svou vlastnφ. Nejsnadn∞ji editaΦnφ masku vytvo°φme v Editoru vstupnφ masky. NicmΘn∞ m∙╛eme editaΦnφ masku zadat p°φmo ve vlastnosti EditMask polo╛ky v Inspektoru objekt∙.
Poznßmka: Pro komponentu TStringField, vlastnost EditMask je takΘ jejφ zobrazovacφ formßt.
K vyvolßnφ Editoru vstupnφ masky pro polo╛kovou komponentu:
  1. Vybereme komponentu v Editoru polo╛ek nebo Inspektoru objekt∙.
  2. P°ejdeme na strßnku vlastnostφ Inspektora objekt∙.
  3. Dvojit∞ klikneme ve sloupci hodnot vlastnosti EditMask. Tφm je otev°en Editor vstupnφ masky.
Editor vstupnφ masky umo╛≥uje vytvß°et a editovat formßt masky. ╚ßst SampleMasks slou╛φ k v²b∞ru z p°eddefinovan²ch masek. Jestli╛e zde vybereme n∞jakou masku, pak formßt masky je zobrazen v editaΦnφm ovladaΦi Input Mask, kde jej m∙╛eme modifikovat nebo jej pou╛φt beze zm∞ny. Mo╛n² vstup u╛ivatele pro tuto vstupnφ masku m∙╛eme vyzkou╣et v editaΦnφm ovladaΦi Test Input. TlaΦφtko Masks umo╛≥uje zavedenφ u╛ivatelskΘ mno╛iny masek (pokud je mßme vytvo°eny).
Pou╛itφ implicitnφho formßtovßnφ pro ΦφselnΘ, datumovΘ a ΦasovΘ polo╛ky
C++ Builder poskytuje vestav∞nΘ zobrazovacφ a editaΦnφ funkce a inteligentnφ implicitnφ formßtovßnφ pro TFloatField, TCurrencyField, TIntegerField, TSmallIntField, TWordField, TDateField, TDateTimeField a TTimeField. K pou╛itφ t∞chto funkcφ nenφ zapot°ebφ nic d∞lat. Implicitnφ formßtovßnφ je provßd∞no nßsledujφcφmi funkcemi: FormatFloat (pro TFloatField a TCurreancyField), FormatDateTime (pro TDateField, TTimeField a TDateTimeField) a FormatCurr (pro TCurrencyField).
Pro danou komponentu jsou dostupnΘ pouze formßtovacφ vlastnosti p°φslu╣ejφcφ datovΘmu typu polo╛kovΘ komponenty. Implicitnφ formßtovacφ konvence pro datum, Φas, m∞nu a ΦφselnΘ hodnoty jsou zalo╛eny na nastavenφch nßrodnostnφch vlastnostφ v operaΦnφm systΘmu.
B∞hem nßvrhu nebo za b∞hu m∙╛eme editovat vlastnosti DisplayFormat a EditFormat polo╛kov²ch komponent, k p°epsßnφ implicitnφho zobrazovacφho nastavenφ pro tuto polo╛ku. M∙╛eme takΘ zapsat obsluhy udßlostφ OnGetText a OnSetText k p°izp∙sobenφ formßtovßnφ pro polo╛kovΘ komponenty za b∞hu aplikace.
Obsluha udßlostφ
Stejn∞ jako ostatnφ komponenty i polo╛kovΘ komponenty majφ p°i°azeny obsluhy udßlostφ. Zßpisem t∞chto obsluh m∙╛eme °φdit udßlosti, kterΘ ovliv≥ujφ data zadßvanß do polo╛ek prost°ednictvφm datov²ch ovladaΦ∙. V nßsledujφcφ tabulce je uveden seznam udßlostφ polo╛kov²ch komponent:
 
Udßlost Funkce
OnChange Je volßna, kdy╛ hodnota polo╛ky je zm∞n∞na.
OnGetText Je volßna, kdy╛ hodnota pro polo╛kovou komponentu je zφskßna pro zobrazenφ nebo editaci.
OnSetText Je volßna, kdy╛ hodnota pro polo╛kovou komponentu je nastavena pro zobrazenφ nebo editaci.
OnValidate Volßna k ov∞°enφ hodnoty pro polo╛kovou komponentu, kdy╛ jejφ hodnota je zm∞n∞na editaΦnφ nebo vklßdacφ operacφ.

Udßlosti OnGetText a OnSetText jsou u╛iteΦnΘ pro p°izp∙sobovßnφ formßtovacφch funkcφ. OnChange je u╛iteΦnΘ pro provßd∞nφ specifick²ch ·loh souvisejφcφch se zm∞nou dat, jako je povolovßnφ nebo zakazovßnφ nabφdek nebo vizußlnφch ovladaΦ∙. OnValidate je u╛iteΦnß, kdy╛ chceme °φdit kontrolu p°φpustnosti zadßvan²ch dat p°ed zßpisem hodnot do databßze. Obsluhy udßlostφ zapisujeme obvykl²m zp∙sobem.

Prßce s metodami polo╛kov²ch komponent za b∞hu aplikace

Metody polo╛kov²ch komponent dostupnΘ za b∞hu aplikace umo╛≥ujφ p°evßd∞t hodnoty polo╛ky z jednoho datovΘho typu na jin² a umo╛≥ujφ nastavit zaost°enφ na prvnφ datov² ovladaΦ na formulß°i, kter² je spojen s polo╛kovou komponentou.
╪φzenφ zaost°enφ datov²ch ovladaΦ∙ spojen²ch s polo╛kami je d∙le╛itΘ, kdy╛ aplikace provßdφ zßznamov∞ orientovanou kontrolu p°φpustnosti dat v obsluze udßlostφ datovΘ mno╛iny (jako je BeforePost). Kontrola m∙╛e b²t provßd∞na pro polo╛ky v zßznamu a to bez ohledu na to, zda p°i°azen² datov² ovladaΦ mß nebo nemß zaost°enφ. Pokud kontrola jistΘ polo╛ky je ne·sp∞╣nß, pak po╛adujeme, aby datov² ovladaΦ s chybn²mi daty zφskal zaost°enφ a u╛ivatel mohl chybu opravit.
╪φzenφ zaost°enφ pro polo╛ky datov²ch komponent provßdφme metodou FocusControl polo╛ky. FocusControl nastavuje zaost°enφ na prvnφ datov² ovladaΦ na formulß°i, kter² je p°i°azen k polo╛ce. Obsluha udßlosti m∙╛e volat metodu FocusControl polo╛ky p°ed kontrolou polo╛ky. Nßsledujφcφ k≤d ukazuje jak volat metodu FocusControl pro polo╛ku Company v tabulce Customers:
CustomersCompany->FocusControl();
V nßsledujφcφ tabulce jsou uvedeny n∞kterΘ dal╣φ metody polo╛kov²ch komponent a jejich pou╛itφ. Kompletnφ seznam t∞chto metod je uveden v nßpov∞d∞.
 
Metoda Popis
AssignValue Nastavuje hodnotu polo╛ky na specifikovanou hodnotu pomocφ automatick²ch konverznφch funkcφ na zßklad∞ typu polo╛ky.
Clear Vyprazd≥uje polo╛ku a nastavuje ji na NULL.
GetData Zφskßvß neformßtovanß data z polo╛ky.
IsValidChar UrΦuje, zda znak zadan² u╛ivatelem do datovΘho ovladaΦe k nastavenφ hodnoty je p°φpustn² pro tuto polo╛ku.
SetData P°i°azuje neformßtovanß data do tΘto polo╛ky.

Zobrazovßnφ, konverze a zp°φstup≥ovßnφ hodnot polo╛ek

DatovΘ ovladaΦe jako TDBEdit a TDBGrid automaticky zobrazujφ hodnoty p°i°azen²ch polo╛kov²ch komponent. Pokud editovßnφ je pro datovou mno╛inu a ovladaΦ povoleno, pak datov² ovladaΦ m∙╛e takΘ zasφlat novΘ a zm∞n∞nΘ hodnoty do databßze. Obecn∞, zabudovanΘ vlastnosti a metody datov²ch ovladaΦ∙ umo╛≥ujφ jejich p°ipojenφ k databßzi, zobrazovßnφ hodnot a provßd∞nφ aktualizacφ bez nutnosti programovßnφ.
Standardnφ ovladaΦe mohou takΘ zobrazovat a editovat databßzovΘ hodnoty p°i°azenΘ k polo╛kov²m komponentßm. Pou╛itφ standardnφch ovladaΦ∙ v tomto p°φpad∞ vy╛aduje programovßnφ.
V tΘto Φßsti jsou uvedeny je╣t∞ tyto body:
Zobrazovßnφ hodnot polo╛kov²ch komponent ve standardnφch ovladaΦφch
Aplikace m∙╛e zp°φstupnit hodnotu databßzovΘho sloupce prost°ednictvφm vlastnosti Value polo╛kovΘ komponenty. Nap°. nßsledujφcφ p°φkaz p°i°azuje hodnotu polo╛ky CustomersCompany do ovladaΦe TEdit:
Edit3->Text = CustomersCompany->Value;
Tato metoda pracuje dob°e pro °et∞zcovΘ hodnoty, ale vy╛aduje programovßnφ pro konverze na jinΘ datovΘ typy. Polo╛kovΘ komponenty majφ zabudovanΘ funkce pro provßd∞nφ p°evod∙.
Poznßmka: Pro p°φstup a nastavovßnφ hodnot polo╛ek m∙╛eme takΘ pou╛φt varianty. Varianta je nov², flexibilnφ datov² typ.
P°evod hodnot polo╛ek
Konverznφ funkce umo╛≥ujφ p°evßd∞t jeden datov² typ na jin². Nap°. funkce AsString p°evßdφ ΦφselnΘ a logickΘ hodnoty na °et∞zcovou reprezentaci. Nßsledujφcφ tabulka uvßdφ p°ehled konverznφch funkcφ polo╛kov²ch komponent a funkce kterΘ jsou pou╛itelnΘ pro jednotlivΘ typy polo╛kov²ch komponent:
 
AsVariant AsString AsInteger AsFloat AsCurrency AsDateTime AsBoolean
TStringField
x
x
x
x
x
x
TIntegerField
x
x
x
x
TSmallIntField
x
x
x
x
TWordField
x
x
x
x
TFloatField
x
x
x
TCurrencyField
x
x
x
TBCDField
x
x
x
TDateTimeField
x
x
x
x
TDateField
x
x
x
x
TTimeField
x
x
x
x
TBooleanField
x
x
TBytesField
x
x
TVarBytesField
x
x
TBlobField
x
x
TMemoField
x
x
TGraphicField
x
x

Poznßmka: Pov╣imn∞te si, ╛e metoda AsVariant umo╛≥uje p°evod mezi v╣emi datov²mi typy.
V n∞kter²ch p°φpadech konverze nejsou mo╛nΘ. Nap°. AsDateTime m∙╛e b²t pou╛ita pro p°evod °et∞zce na datum, Φas nebo datum s Φasem, pouze tehdy, jestli╛e °et∞zcovß hodnota je ve formßtu datumu a Φasu. Ne·sp∞╣n² p°evod generuje v²jimku.
V n∞kter²ch jin²ch p°φpadech, p°evod mo╛n² je, ale v²sledky p°evod∙ nejsou v╛dy oΦekßvanΘ. Nap°. co nastane p°i p°evodu hodnoty TDateTimeField na formßt v pohyblivΘ °ßdovΘ Φßrce? AsFloat p°evßdφ datumovou Φßst na poΦet dnφ od 31. 12. 1899 a Φasovou Φßst polo╛ky na zlomek 24 hodin. Nßsledujφcφ tabulka uvßdφ seznam konverzφ produkujφcφch specißlnφ v²sledky:
 
Konverze V²sledek
String na Boolean P°evßdφ "true", "false", "Yes" a "No" na logickou hodnotu. Ostatnφ hodnoty generujφ v²jimku.
Float na Integer Zaokrouhluje hodnotu float na nejbli╛╣φ celoΦφselnou hodnotu.
DateTime na Float P°evßdφ datum na poΦet dnφ od 31. 12. 1899 a Φas na zlomek 24 hodin.
Boolean na String P°evßdφ logickou hodnotu na "true" nebo "false".

V ostatnφch p°φpadech, konverze nenφ  mo╛nß. V t∞chto p°φpadech, pokus o konverzi zp∙sobφ generovßnφ v²jimky.
Konverznφ funkce pou╛φvßme stejn∞ jako jinΘ metody komponent: p°ipojφme jmΘno funkce na konec jmΘna komponenty (za ╣ipku) v p°i°azovacφm p°φkazu. Konverze v╛dy nastane p°ed p°i°azenφm. Nap°. nßsledujφcφ p°φkaz p°evßdφ hodnotu CustomersCustNo na °et∞zec a p°i°adφ ji textu editaΦnφho ovladaΦe:
Edit1->Text = CustomersCustNo->AsString;
Obdobn∞, dal╣φ p°φkaz p°i°azuje text editaΦnφho ovladaΦe do polo╛ky CustomersCustNo jako celΘ Φφslo:
CustomersCustNo->AsInteger = StrToInt(Edit1->Text);
P°i provßd∞nφ nepodporovanΘ konverze za b∞hu nastane v²jimka.

Zp°φstup≥ovßnφ hodnot polo╛ek implicitnφ vlastnostφ datovΘ mno╛iny
Preferovanß metoda pro p°φstup k hodnot∞ polo╛ky je pou╛itφ varianty s vlastnostφ FieldValues. Nap°. nßsledujφcφ p°φkaz vklßdß hodnotu editaΦnφho ovladaΦe do polo╛ky CustNo tabulky Custometrs:
Customers->FieldValues["CustNo"] = Edit2->Text;
Zp°φstup≥ovßnφ hodnot polo╛ek vlastnostφ Fields datovΘ mno╛iny
Hodnotu polo╛ky m∙╛eme zp°φstupnit vlastnostφ Fields komponenty datovΘ mno╛iny, ve kterΘ je polo╛ka obsa╛ena. Zp°φstup≥ovßnφ hodnot polo╛ek touto vlastnostφ je u╛iteΦnΘ, kdy╛ pot°ebujeme prochßzet p°es n∞kolik sloupc∙ nebo pokud na╣e aplikace pracuje s tabulkou, kterß nenφ dostupnß b∞hem nßvrhu.
K pou╛itφ vlastnosti Fields musφme znßt po°adφ a datov² typ polo╛ky v datovΘ mno╛in∞. Ke specifikaci zp°φstup≥ovanΘ polo╛ky pou╛ijeme po°adovΘ Φφslo polo╛ky. Prvnφ polo╛ka v datovΘ mno╛in∞ mß Φφslo 0. Hodnoty polo╛ek musφ b²t p°evedeny na po╛adovan² typ pomocφ konverznφch funkcφ polo╛kov²ch komponent.
Nap°. nßsledujφcφ p°φkaz p°i°azuje aktußlnφ hodnotu sedmΘho sloupce tabulky do editaΦnφho ovladaΦe:
Edit1->Text = CustTable->Fields[6]->AsString;
Podobn∞ m∙╛eme p°i°adit hodnotu polo╛ce nastavenφm vlastnosti Fields datovΘ mno╛iny do urΦenΘ polo╛ky. Nap°.
Customers->Edit();
Customers->Fields[6]->AsString = Edit1->Text;
Customers->Post();
Zp°φstup≥ovßnφ hodnot polo╛ky metodou FieldByName datovΘ mno╛iny
Hodnotu polo╛ky m∙╛eme takΘ zp°φstupnit metodou FieldByName datovΘ mno╛iny. Toto je u╛iteΦnΘ, kdy╛ znßme jmΘno polo╛ky, ke kterΘ chceme p°istupovat, ale nemßme p°φstup k p°φslu╣nΘ tabulce b∞hem nßvrhu.
K pou╛itφ FieldByName, musφme znßt jmΘno datovΘ mno╛iny a jmΘno polo╛ky. JmΘno polo╛ky p°edßvßme jako parametr metody. Pro p°φstup nebo zm∞nu hodnoty polo╛ky, p°evedeme v²sledek p°φslu╣nou konverznφ funkcφ polo╛kovΘ komponenty, jako je AsString nebo AsInteger. Nap°. nßsledujφcφ p°φkaz p°i°azuje hodnotu polo╛ky CustNo v datovΘ mno╛in∞ Customers do editaΦnφho ovladaΦe:
Edit2->Text = Customers->FieldByName("CustNo")->AsString;
Podobn∞ m∙╛eme p°i°adit hodnotu polo╛ce:
Customers->Edit();
Customers->FieldByName("CustNo")->AsString = Edit2->Text;
Customers->Post();

Testovßnφ souΦasnΘ hodnoty polo╛ky

Pokud na╣e aplikace pou╛φvß TClientDataSet nebo administruje datovou mno╛inu, kterß je zdrojovou datovou mno╛inu pro komponentu TProvider na aplikaΦnφm serveru a pokud nastanou problΘmy p°i aktualizaci zßznam∙, pak m∙╛eme pou╛φt vlastnost CurValue k zji╣t∞nφ hodnoty polo╛ky v zßznamu zp∙sobujφcφm problΘmy. CurValue reprezentuje souΦasnou hodnotu polo╛kovΘ komponenty, vΦetn∞ zm∞n proveden²ch ostatnφmi u╛ivateli databßze.
CurValue pou╛ijeme k zji╣t∞nφ hodnoty polo╛ky, kdy╛ p°i odeslßnφ hodnoty do databßze vznikne problΘm. Pokud souΦasnß hodnota polo╛ky zp∙sobuje p°i zßpisu problΘm, nap°. typu poru╣enφ klφΦe, pak vznikß udßlost OnReconcileError.
V obsluze OnReconcileError, NewValue je odesφlanß hodnota zp∙sobujφcφ problΘm, OldValue je p∙vodnφ hodnota polo╛ky p°ed provedenφm editace a CurValue je souΦasnß hodnota polo╛ky. CurValue se m∙╛e li╣it od OldValue, pokud jin² u╛ivatel zm∞nil hodnotu polo╛ky po p°eΦtenφ OldValue.

Nastavenφ implicitnφ hodnoty pro polo╛ku

M∙╛eme specifikovat jak za b∞hu bude vypoΦφtßna implicitnφ hodnota pro polo╛ku pomocφ vlastnosti DefaultExpression. DefaultExpression m∙╛e b²t libovoln² p°φpustn² SQL v²raz, kter² se neodkazuje na hodnoty polo╛ek. Pokud v²raz obsahuje jinou ne╛ Φφselnou hodnotu, pak musφ b²t zapsßna v apostrofech. Nap°.
'12:00:00'

Prßce s omezenφmi

Polo╛kovΘ komponenty mohou pou╛φvat omezenφ SQL na serveru. Dßle na╣e aplikace m∙╛e vytvß°et a pou╛φvat u╛ivatelskß omezenφ, kterΘ jsou lokßlnφ v na╣φ aplikaci. V╣echna omezenφ jsou pravidla nebo podmφnky, kterΘ omezujφ rozsah hodnot, kterΘ polo╛ka m∙╛e nab²vat. Zde se budeme zab²vat omezenφmi pouze na ·rovni polo╛kov²ch komponent.
V tΘto Φßsti jsou uvedeny body:
Vytvß°enφ u╛ivatelsk²ch omezenφ
U╛ivatelskß omezenφ nejsou importovßna ze serveru stejn∞ jako ostatnφ omezenφ. Jsou to omezenφ, kterß jsou deklarovßna a implementovßna v na╣i lokßlnφ aplikaci. U╛ivatelskß omezenφ mohou b²t u╛iteΦnß pro provßd∞nφ p°edb∞╛nΘ kontroly datov²ch vstup∙, ale nemohou b²t aplikovßna na data zφskßvanß nebo odesφlßna na aplikaΦnφ server.
K vytvo°enφ u╛ivatelskΘho omezenφ nastavφme vlastnost CustomConstraint na specifikaci podmφnky omezenφ a nastavφme ConstraintErrorMessage na zprßvu zobrazovanou p°i poru╣enφ omezenφ.
CustomConstraint je °et∞zec SQL, kter² specifikuje omezenφ aplikace na hodnotu polo╛ky. Nastavφme CustomConstraint k omezenφ hodnot, kterΘ u╛ivatel m∙╛e zadat do polo╛ky. CustomConstraint m∙╛e b²t libovoln² p°φpustn² v²raz, jako je
x > 0 and x < 100
JmΘno pou╛itΘ k odkazovßnφ na hodnotu polo╛ky, m∙╛e b²t libovoln² °et∞zec, kter² nenφ klφΦov²m slovem SQL a je pou╛it konzistentn∞ v celΘm v²razu omezenφ.
U╛ivatelskß omezenφ jsou p°idßna ke v╣em omezenφm na hodnotu polo╛ky zφskan²m ze serveru.
Pou╛φvßnφ serverov²ch omezenφ
V∞t╣ina SQL databßzφ pou╛φvß omezenφ k urΦenφ podmφnek na mo╛nΘ hodnoty pro polo╛ku. Nap°. polo╛ka nemusφ povolovat hodnoty NULL, m∙╛e ve sloupci po╛adovat unikßtnφ hodnoty nebo p°ipou╣tφ pouze hodnoty, kterΘ le╛φ v urΦitΘm intervalu. I kdy╛ m∙╛eme tato omezenφ replikovat ve sv²ch klientsk²ch aplikacφch, C++ Builder nabφzφ vlastnost ImportedConstraint k lokßlnφmu ╣φ°enφ serverov²ch omezenφ.
Vlastnost ImportedConstraint je urΦena pouze pro Φtenφ a specifikuje klauzuli SQL omezujφcφ n∞jak²m zp∙sobem hodnotu polo╛ky. Nap°.
Value > 0 and Value < 100
Hodnotu ImportedConstraint nem∞nφme (mimo Φßstφ chßpan²ch jako komentß°), proto╛e nem∙╛e b²t interpretovßna modulem p°φstupu k databßzi. K p°idßnφ dal╣φch omezenφ na hodnotu polo╛ky pou╛ijeme vlastnost CustomConstraint. Pokud se serverovΘ omezenφ zm∞nφ, pak se takΘ zm∞nφ ImportedConstraint, ale omezenφ uvedenΘ ve vlastnosti CustomConstraint je trvalΘ.
Odstran∞nφm omezenφ z vlastnosti ImportedConstraint nezm∞nφme ov∞°ovßnφ hodnot polo╛ky provßd∞nΘ tφmto omezenφm. V²sledkem odstran∞nφ omezenφ je to, ╛e omezenφ bude testovßno na serveru a ne lokßln∞. P°i lokßlnφm testovßnφ omezenφ, kdy╛ nastane poru╣enφ omezenφ je zobrazena chybovß zprßva urΦenß vlastnostφ ConstraintErrorMessage a to mφsto zobrazenφ chybovΘ zprßvy ze serveru.

Prßce s objektov²mi polo╛kami

Potomci objektov²ch polo╛ek (TObjectField) podporujφ datovΘ typy ADT (Abstract Data Type), polo╛kovß pole, polo╛kovΘ datovΘ mno╛iny a odkazovΘ polo╛ky. V╣echny tyto polo╛kovΘ typy obsahujφ nebo se odkazujφ na pod°φzenΘ polo╛ky nebo jinΘ datovΘ mno╛iny.
Polo╛ky ADT a odkazovΘ polo╛ky mapujφ polo╛ku na pod°φzenΘ polo╛ky. Polo╛ka ADT obsahuje pod°φzenΘ polo╛ky, kterΘ sami mohou b²t libovolnΘho skalßrnφho nebo objektovΘho typu. Polo╛kovΘ pole obsahuje pole pod°φzen²ch polo╛ek, v╣echny stejnΘho typu.
Polo╛ky datov²ch mno╛in a odkaz∙ mapujφ polo╛ky na jinΘ datovΘ mno╛iny. Polo╛ka datovΘ mno╛iny poskytuje p°φstup k vno°enΘ datovΘ mno╛in∞ a odkazovß polo╛ka uklßdß ukazatel (odkaz) na jin² trval² objekt (ADT).
 
JmΘno komponenty V²znam
TADTField Reprezentuje polo╛ku ADT.
TArrayField Reprezentuje polo╛kovΘ pole
TDataSetField Reprezentuje polo╛ku, kterß obsahuje odkaz na vno°enou datovou mno╛inu.
TReferenceField Reprezentuje polo╛ku REF, tj. ukazatel na ADT.

Kdy╛ Editorem polo╛ek p°idßme polo╛ku k datovΘ mno╛in∞ obsahujφcφ objektovΘ polo╛ky, pak objektovΘ polo╛ky sprßvnΘho typu jsou automaticky vytvo°eny za nßs. P°idßnφ trvalΘ objektovΘ polo╛ky k datovΘ mno╛in∞ automaticky nastavφ vlastnost ObjectView datovΘ mno╛iny na true, co╛ zajistφ hierarchickΘ uklßdßnφ polo╛ek.
Nßsledujφcφ vlastnosti jsou spoleΦnΘ pro v╣echny potomky objektovΘ polo╛ky a poskytujφ funkΦnost pro zpracovßnφ pod°φzen²ch polo╛ek a datov²ch mno╛in:
 
Vlastnost V²znam
Fields Obsahuje pod°φzenΘ polo╛ky tvo°φcφ objektovou polo╛ku.
ObjectType Klasifikace objektovΘ polo╛ky.
FieldCount PoΦet pod°φzen²ch polo╛ek tvo°φcφch objektovou polo╛ku.
FieldValues Poskytuje p°φstup k hodnotßm pod°φzen²ch polo╛ek objektovΘ polo╛ky.

V tΘto Φßsti jsou uvedeny je╣t∞ tyto body:

Polo╛ky ADT a polo╛kovß pole obsahujφ pod°φzenΘ polo╛ky, kterΘ mohou b²t zobrazovßny pomocφ datov²ch ovladaΦ∙. DatovΘ ovladaΦe jako je TDBEdit a TDBGrid tyto typy polo╛ek automaticky zobrazujφ.
DatovΘ ovladaΦe s vlastnostφ DataField automaticky zobrazujφ libovolnΘ polo╛ky ADT a polo╛kovß pole v rozbalovacφm seznamu. Kdy╛ tento typ polo╛ky je spojen s datov²m ovladaΦem, pak pod°φzenΘ polo╛ky se zobrazφ v needitovatelnΘm Φßrkami odd∞lenΘm °et∞zci v ovladaΦi. Pod°φzenß polo╛ka je spojena s ovladaΦem jako normßlnφ datovß polo╛ka.
OvladaΦ TDBGrid zobrazuje polo╛ky ADT a polo╛kov²m polem r∙zn∞, a to v zßvislosti na hodnot∞ vlastnosti ObjectView datovΘ mno╛iny. Kdy╛ ObjectView je false, pak ka╛dß pod°φzenß polo╛ka je zobrazena v samostatnΘm sloupci. Kdy╛ ObjectView je true, pak ADT nebo polo╛kovΘ pole m∙╛e b²t roz╣φ°eno nebo sbaleno kliknutφm na ╣ipku na titulnφm °ßdku sloupce. P°i roz╣φ°enφ polo╛ky, ka╛dß pod°φzenß polo╛ka je zobrazovßna ve svΘm vlastnφm sloupci. P°i sbalenφ polo╛ky, je zobrazen pouze jeden sloupec s needitovatelnΘm Φßrkami odd∞len²m °et∞zcem obsahujφcφm pod°φzenΘ polo╛ky.
Prßce s polo╛kami ADT
ADT jsou u╛ivatelem definovanΘ typy vytvo°enΘ na serveru a podobajφ se strukturßm. ADT mohou obsahovat v∞t╣inu skalßrnφch polo╛kov²ch typ∙, pole polo╛ek, odkazovΘ polo╛ky a vno°enΘ ADT.
Jsou r∙znΘ zp∙soby zp°φstup≥ovßnφ dat v polo╛kßch typu ADT. Vytvß°enφ a pou╛φvßnφ trval²ch polo╛ek je d∙razn∞ doporuΦovßno. Nßsledujφcφ p°φklad p°i°azuje hodnoty pod°φzen²ch polo╛ek k editaΦnφmu ovladaΦi nazvanΘmu CityEdit, pou╛φvß nßsledujφcφ strukturu ADT:
Address
  Street
  City
  State
  Zip
a komponentu tabulky Customer jsou vytvo°eny nßsledujφcφ trvalΘ polo╛ky:
CustomerAddress: TADTField;
CustomerAddrStreet: TStringField;
CustomerAddrCity: TStringField;
CustomerAddrState: TStringField;
CustomerAddrZip: TStringField;
Tento °ßdek k≤du pou╛φvß trvalou polo╛ku a ukazuje doporuΦovanou metodu zp°φstup≥ovßnφ dat v polo╛ce ADT.
CityEdit->Text = CustomerAddrCity->AsString;
Nßsledujφcφ p°φklad k≤du vy╛aduje, aby vlastnost ObjectView datovΘ mno╛iny byla nastavena na true. Nevy╛aduje trvalΘ polo╛ky. Tento p°φklad pou╛φvß pln∞ kvalifikovanΘ jmΘno s metodou FieldByName datovΘ mno╛iny.
CityEdit->Text := Customer->FieldByName("Address.City")->AsString;
K hodnot∞ pod°φzenΘ polo╛ky m∙╛eme p°istupovat vlastnostφ FieldValues komponenty TADTField. FieldValues akceptuje a vracφ typ Variant a tak m∙╛eme zpracovßvat a p°evßd∞t polo╛ky libovolnΘho typu. Parametr indexu p°ebφrß celoΦφselnou hodnotu. Nap°.
CityEdit->Text = ((TADTField*)Customer->FieldByName("Address"))->
                 FieldValues[1];
Dal╣φ k≤d pou╛φvß vlastnost Fields komponenty TADTField.
CityEdit->Text = ((TADTField*)Customer->FieldByName("Address"))->Fields->
                 Fields[1]->AsString;
Nßsledujφcφ k≤d pou╛φvß vlastnost Fields komponenty TADTField s FieldByName datovΘ mno╛iny i objektu TField.
CityEdit->Text = ((TADTField*)Customer->FieldByName("Address"))->Fields->
                 FieldByName("City")->AsString;
Jak m∙╛eme vid∞t v poslednφm p°φklad∞, p°φstup k dat∙m polo╛ky prost°ednictvφm trval²ch polo╛ek je jednoduch². Dal╣φ p°φstupovΘ metody jsou hlavn∞ u╛iteΦnΘ, kdy╛ struktura databßzovΘ tabulky nenφ pevnß nebo znßmß p°i nßvrhu.
Hodnoty polo╛ky ADT mohou b²t takΘ zp°φstup≥ovßny vlastnostφ FieldValues datovΘ mno╛iny:
Customer->Edit();
Customer->FieldValues["Address.City"] = CityEdit->Text;
Customer->Post();
Dal╣φ p°φkaz Φte hodnotu °et∞zce v pod°φzenΘ polo╛ky City polo╛ky ADT Address do editaΦnφho ovladaΦe:
CityEdit->Text = Customer->FieldValues["Address.City"];
Poznßmka: Vlastnost ObjectView datovΘ mno╛iny m∙╛e b²t pro p°eklad t∞chto °ßdk∙ true nebo false.
Prßce s polo╛kov²m polem
Polo╛kovΘ pole obsahuje mno╛inu polo╛ek stejnΘho typu. Typy polo╛ek mohou b²t skalßrnφ (nap°. float nebo string) nebo neskalßrnφ (nap°. ADT), ale polo╛kovΘ pole polφ nenφ povolenΘ. Vlastnost SparseArrays datovΘ mno╛iny urΦuje zda pro ka╛d² prvek polo╛kovΘho pole je vytvo°en unikßtnφ objekt TField.
Jsou r∙znΘ zp∙soby p°φstupu k dat∙m v typech polo╛kov²ch polφ. Nßsledujφcφ p°φklad zapl≥uje okno seznamu neprßzdn²m polem prvk∙.
for (int i = 0; (!OrderDates->Fields->Fields[i]->IsNull) &&
     (i < OrderDates->Size - 1); ++i)
  OrderDateListBox->Items->Add(OrderDates->Fields->Fields[i]->AsString);
Dal╣φ p°φklad p°i°azuje hodnotu pod°φzenΘ polo╛ky do editaΦnφho ovladaΦe nazvanΘho TelEdit a pou╛φvß pole TelNos_Array, kterΘ mß ╣est °et∞zcov²ch prvk∙. Pro komponentu tabulky Customer jsou vytvo°eny nßsledujφcφ trvalΘ polo╛ky a pou╛ity nßsledujφcφm p°φkladem:
CustomerTELNOS_ARRAY: TArrayField;
CustomerTELNOS_ARRAY0: TStringField;
CustomerTELNOS_ARRAY1: TStringField;
CustomerTELNOS_ARRAY2: TStringField;
CustomerTELNOS_ARRAY3: TStringField;
CustomerTELNOS_ARRAY4: TStringField;
CustomerTELNOS_ARRAY5: TStringField;
Tento °ßdek k≤du pou╛φvß trvalou polo╛ku k p°i°azenφ hodnoty prvku pole do editaΦnφho ovladaΦe:
TelEdit->Text = CustomerTELNOS_ARRAY0->AsString;
Nßsledujφcφ p°φklad vy╛aduje nastavenφ vlastnosti ObjectView datovΘ mno╛iny na true. TrvalΘ polo╛ky nejsou po╛adovßny. Hodnotu pod°φzenΘ polo╛ky m∙╛eme zp°φstupnit vlastnostφ FieldValues datovΘ mno╛iny. FieldValues akceptuje a vracφ typ Variant, co╛ umo╛≥uje zpracovßvat a p°evßd∞t polo╛ky libovolnΘho typu. Nap°.
TelEdit->Text = ((TArrayField*)Customer->FieldByName("TelNos_Array"))->
                FieldValues[1];
Dal╣φ p°φklad k≤du pou╛φvß vlastnost Fields komponenty TArrayField.
TelEdit->Text = ((TArrayField*)Customer->FieldByName("TelNos_Array"))->
                Fields->Fields[1]->AsString;
Prßce s polo╛kov²mi datov²mi mno╛inami
Polo╛kovΘ datovΘ mno╛iny zp°φstup≥ujφ data ulo╛enß ve vno°en²ch datov²ch mno╛inßch. Vlastnost NestedDataSet urΦuje vno°enou datovou mno╛inu. Data ve vno°enΘ datovΘ mno╛in∞ jsou pak zp°φstupn∞na pomocφ objektu polo╛ky vno°enΘ datovΘ mno╛iny.
OvladaΦe TDBGrid povolujφ zobrazenφ dat ulo╛en²ch v polo╛kßch datov²ch mno╛in. V ovladaΦi TDBGrid, polo╛ka datovΘ mno╛iny je indikovßna v ka╛dΘm sloupci datovΘ mno╛iny textem "(DataSet)" a za b∞hu tlaΦφtkem se t°emi teΦkami. Stiskem tohoto tlaΦφtka vyvolßme nov² formulß° s m°φ╛kou zobrazujφcφ p°i°azenou datovou mno╛inu k souΦasnΘmu zßznamu polo╛kovΘ datovΘ mno╛in∞. Tento formulß° m∙╛eme takΘ zobrazit programov∞ metodou ShowPopupEditor m°φ╛ky. Nap°. pokud sedm² sloupec v m°φ╛ce reprezentuje polo╛kovou datovou mno╛inu, pak nßsledujφcφ k≤d zobrazφ p°i°azenou datovou mno╛inu k tΘto polo╛ce pro souΦasn² zßznam:
DBGrid1->ShowPopupEditor(DBGrid1->Columns->Items[7], -1, -1);
Polo╛kovß datovß mno╛ina nenφ normßln∞ spojena p°φmo s datov²mi ovladaΦi. Vno°enß datovß mno╛ina TNestedTable je potomkem TDataSet a poskytuje specifickou funkΦnost pro p°φstup k dat∙m ulo╛en²m ve vno°en²ch datov²ch mno╛inßch. Po p°i°azenφ TDataSetField k polo╛kovΘ datovΘ mno╛in∞, trvalΘ polo╛ky mohou b²t vytvß°eny pro polo╛ky vno°enΘ datovΘ mno╛iny.
Pro p°φstup k dat∙m v polo╛kovΘ datovΘ mno╛in∞ nejprve vytvo°φme trval² objekt TDataSetField pomocφ Editoru polo╛ek tabulky a potom spojφme tuto polo╛ku pomocφ vlastnosti DatasetField na objekt TNestedTable nebo TClientDataSet. Pokud vno°enß polo╛ka datovΘ mno╛iny pro souΦasn² zßznam je p°i°azena, pak vno°enß datovß mno╛ina obsahuje zßznamy s vno°en²mi daty; jinak vno°enß datovß mno╛ina je prßzdnß.
P°ed vlo╛enφm zßznam∙ do vno°enΘ datovΘ mno╛iny, se musφme ujistit, ╛e odpovφdajφcφ zßznamy jsme zaslali do hlavnφ tabulky, pokud jsme je prßv∞ vlo╛ili. Pokud vlo╛enΘ zßznamu nebyly odeslßny, pak budou odeslßny automaticky a to p°ed odeslßnφm zßznam∙ do vno°enΘ datovΘ mno╛iny.
Prßce s odkazov²mi polo╛kami
OdkazovΘ polo╛ky uklßdajφ odkaz (ukazatel) na jin² objekt ADT. Tento objekt ADT je jeden zßznam jinΘho objektu tabulky. OdkazovΘ polo╛ky se v╛dy odkazujφ na jeden zßznam v datovΘ mno╛in∞ (objektu tabulky). Data v odkazovanΘm objektu jsou aktußln∞ vraceny ve vno°enΘ datovΘ mno╛in∞, ale mohou b²t takΘ zp°φstupn∞ny prost°ednictvφm vlastnosti Fields v TReferenceField.
V ovladaΦi TDBGrid odkazovß polo╛ka je urΦena v ka╛dΘ bu≥ce sloupce datovΘ mno╛iny pomocφ (Reference) a za b∞hu tlaΦφtkem se t°emi teΦkami. Stiskem tohoto tlaΦφtka za b∞hu zobrazφme nov² formulß° s m°φ╛kou zobrazujφcφ objekt p°i°azen² k souΦasnΘmu zßznamu odkazovΘ polo╛ky.
Tento formulß° m∙╛e b²t takΘ vyvolßn programov∞ pomocφ metody ShowPopupEditor m°φ╛ky. Nap°. pokud sedm² sloupec v m°φ╛ce reprezentuje odkazovou polo╛ku, pak nßsledujφcφ k≤d zobrazφ objekt p°i°azen² k tΘto polo╛ce pro souΦasn² zßznam:
DBGrid1->ShowPopupEditor(DBGrid1->Columns->Items[7], -1, -1);
Pro zp°φstupn∞nφ dat v odkazovΘ polo╛ce musφme nejprve vytvo°it trvalou TDataSetField a pak spojit tuto polo╛ku pomocφ vlastnosti DatasetField k TNestedTable nebo TClientDataSet. Pokud odkaz je p°i°azen, pak odkaz bude obsahovat jeden zßznam s odkazovan²mi daty. Pokud odkaz je null, pak odkaz je prßzdn².
Nßsledujφcφ p°φklad p°i°azuje data z odkazovΘ polo╛ky CustomerRefCity do editaΦnφho ovladaΦe nazvanΘho CityEdit:
CityEdit->Text = CustomerADDRESS_REF->NestedDataSet->Fields->
                 Fields[1]->AsString;
Kdy╛ data v odkazovΘ polo╛ce jsou editovßna, pak jsou modifikovßna odkazovanß data. Pro p°i°azenφ odkazovΘ polo╛ky, musφme nejprve pou╛φt p°φkaz SELECT k v²v∞ru odkazu z tabulky a pak p°i°adit. Nap°.
AddressQuery->SQL->Text =
  "SELECT REF(A) FROM AddressTable A WHERE A.City = 'San Francisco'";
AddressQuery->Open();
CustomerAddressRef->Assign(AddressQuery->Fields->Fields[0]);

  1. V nßsledujφcφ aplikaci se seznßmφme s vyhledßvacφmi a poΦitateln²mi polo╛kami. V m°φ╛ce je zobrazena tabulka Orders. Jsou k nφ p°idßny t°i vyhledßvacφ polo╛ky: CustomerName, EmployeeLastName and EmployeeFirstName.  PoΦitatelnß polo╛ka EmployeeFullName ukazuje jak m∙╛eme spojit dv∞ vyhledßvacφ polo╛ky.

  2. ZaΦneme v²voj novΘ aplikace. Na formulß° umφstφme TDBNavigator a TDBGrid. U formulß°e zm∞nφme vlastnost Name na fmLookup a vlastnost Caption na Lookup Example. Formulß° ulo╛φme do souboru Lookup. Na╣e aplikace bude takΘ vyu╛φvat datov² modul. P°idßme jej k aplikaci a umφstφme do n∞j t°i komponenty TTable (nazveme je tbOrders, tbCustomer a tbEmployee). U v╣ech nastavφme vlastnost DatabaseName na BCDEMOS, vlastnosti TableName budou tvo°eny postupn∞ ORDERS.DB, CUSTOMER.DB a EMPLOYEE.DB a nastavφme u nich Active na true. Dßle do datovΘho modulu umφstφme t°i komponenty TDataSource, nastavφme u nich vlastnosti Name postupn∞ na OrdersSource, CustomerSource a EmployeeSource a vlastnosti DataSet postupn∞ na tbOrders, tbCustomer a tbEmployee. V mφstnφ nabφdce tabulky tbCustomer zvolφme Fields Editor a p°idßme v╣echny polo╛ky. Obdobn∞ to provedeme s tabulkou tbOrders. V tbOrders vytvo°φme dßle na╣e t°i vyhledßvacφ polo╛ky (CustomerName, EmployeeLastName and EmployeeFirstName). V CustomerName budeme v tabulce tbCustomer zji╣╗ovat hodnotu Company na zßklad∞ CustNo. U zb²vajφcφch dvou budeme zji╣╗ovat v tabulce tbEmployee hodnoty LastName a FirstName na zßklad∞ EmpNo. PoΦitatelnß polo╛ka EmployeeFullName bude spojovat vytvo°enΘ vyhledßvacφ polo╛ky EmployeeLastName and EmployeeFirstName. Obsluha OnCalcFields bude tvo°ena p°φkazem:
    if (tbOrdersEmployeeFirstName->IsNull)
      tbOrdersEmployeeFullName->Value = tbOrdersEmployeeLastName->Value;
    else
      tbOrdersEmployeeFullName->Value=tbOrdersEmployeeFirstName->Value+' '+
        tbOrdersEmployeeLastName->Value;
    V²voj tΘto aplikace dokonΦete sami.
    Pov╣imn∞te si, ╛e kdy╛ ve spu╣t∞nΘ aplikaci p°ejdeme na n∞kterou z vyhledßvacφch polo╛ek a stiskneme F2, pak m∙╛eme vid∞t tlaΦφtko pro rozbalenφ seznamu. Pokud vybereme novou hodnotu ze seznamu, pak odpovφdajφcφ KeyField (CustNo nebo EmpNo) se zm∞nφ. Pokud ale do polo╛ky zapφ╣eme novou hodnotu, pak odpovφdajφcφ KeyField se nezn∞nφ pokud hodnota nenφ odeslßna do databßze.
9. Prßce s polo╛kov²mi komponentami