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