8. Práce s datovými ovladači

Tato kapitola popisuje jak používat vizuální datové ovladače k zobrazení a editaci dat přiřazených k tabulkám a dotazům v našich databázových aplikacích. Datové ovladače získávají zobrazovaná data od databázových zdrojů z vnějšku aplikace a také případně zasílají (vracejí) datové změny zpět datovým zdrojům.
Tato kapitola popisuje základní služby společné pro všechny komponenty datových ovladačů a je zde uvedeno jak a kdy používat konkrétní komponenty.

Používání společných služeb datových ovladačů

Následující úlohy jsou společné pro většinu datových ovladačů: Datové ovladače umisťujeme ze stránky Data Controls Palety komponent na formulář naší databázové aplikace. Datové ovladače obecně povolují zobrazení a editaci položek dat spojených se současným záznamem v datové množině. V následující tabulce je uveden přehled datových ovladačů.
 
Datový ovladač Popis
TDBGrid Zobrazuje informace z datového zdroje v tabulkovém formátu. Sloupce v mřížce odpovídají sloupcům v připojené tabulce nebo dotazu. Řádky v mřížce odpovídají záznamům.
TDBNavigator Poskytuje konfigurovatelnou množinu tlačítek pro navigaci po záznamech datové množiny, aktualizaci záznamů, odesílání záznamů, rušení záznamů, rušení změn a obnovení zobrazení dat.
TDBText Zobrazuje data z položky jako Label.
TDBEdit Zobrazuje data z položky v editačním ovladači.
TDBMemo Zobrazuje data z položky Memo nebo BLOB v rolovatelném víceřádkovém editačním okně.
TDBImage Zobrazuje grafiku z datové položky v grafickém ovladači.
TDBListBox Zobrazuje seznam prvků, které můžeme použít k aktualizaci položky v současném datovém záznamu.
TDBComboBox Zobrazuje seznam prvků, které můžeme použít k aktualizaci položky a také umožňuje přímý zápis hodnoty jako standardní datový editační ovladač.
TDBCheckBox Zobrazuje značku, která indikuje hodnotu logické položky.
TDBRadioGroup Zobrazuje množinu vzájemně vylučujících se voleb pro položku.
TDBLookupListBox Zobrazuje seznam prvků vyhledaných z jiné datové množiny na základě hodnoty položky.
TDBLookupComboBox Zobrazuje seznam prvků vyhledaných z jiné datové množiny na základě hodnoty položky a umožňuje také přímý zápis hodnoty jako standardní datový editační ovladač.
TDBCtrlGrid Zobrazuje konfigurovatelnou opakovatelnou množinu datových ovladačů v mřížce.
TDBRichEdit Zobrazuje formátovaná data z položky v editačním okně.

Datové ovladače zpřístupňují data i během návrhu. Když nastavíme vlastnost DataSource ovladače na aktivní datový zdroj ve vytvářené aplikaci, můžeme bezprostředně vidět živá data v ovladači. Editor položek můžeme použít k procházení datovou množinou během návrhu k ověření, zda naše aplikace zobrazuje data správně a to bez nutnosti překladu a spuštění aplikace.
Za běhu aplikace, datové ovladače také zobrazují data a umožňují editaci dat (jestliže to povoluje ovladač a databáze, ke které jsme připojeni).

Přiřazování datových ovladačů k datové množině

Datové ovladače přiřazujeme k datovým množinám pomocí datového zdroje. Komponenta datového zdroje slouží jako propojení ovladače a datové množiny obsahující data. Pro přiřazení datového ovladače k datové množině:
  1. Umístíme komponenty datové množiny a datového zdroje do datového modulu (nebo na formulář) a nastavíme podle potřeby jejich vlastnosti.
  2. Umístíme datové ovladače ze stránky Data Access Palety komponent na formulář.
  3. Nastavíme vlastnost DataSource ovladače na jméno komponenty datového zdroje z kterého chceme získávat data.
  4. Nastavíme vlastnost DataField ovladače na jméno zobrazované položky (nebo vybereme jméno položky z rozbalovacího seznamu vlastnosti). Tento krok neprovádíme pro TDBGrid, TDBCtrlGrid a TDBNavigator, protože přistupují ke všem položkám v datové množině.
  5. Nastavíme vlastnost Active datové množiny na true k zobrazení dat v ovladači.

Editování a aktualizace dat

Všechny datové ovladače mimo navigátora zobrazují data z položek databáze. Můžeme je také použit k editaci a aktualizaci dat, pokud to připojená datová množina umožňuje.
Následující body popisují jak umožnit uživateli editaci dat z databázových položek pomocí datových ovladačů:
Povolení editace v ovladači na základě vstupu uživatele
Datová množina musí být ve stavu dsEdit, aby umožnila editaci svých dat. Vlastnost AutoEdit datového zdroje, ke kterému je ovladač přiřazen určuje, zda připojená datová množina získá stav dsEdit, když data v ovladači jsou modifikována v reakci na události klávesnice nebo myši. Pokud AutoEdit je true (implicitně), pak při editaci ovladače je automaticky nastaven režim dsEdit. Jestliže AutoEdit je false, pak přechod do stavu dsEdit za běhu aplikace musí zajistit ovladač TDBNavigator (nebo něco jiného).
Editování dat v ovladači
Vlastnost ReadOnly datového ovladače určuje, zda uživatel může editovat data zobrazená ovladačem. Má-li hodnotu false (implicitní hodnota), uživatel může data editovat. K zabránění editace dat v ovladači nastavíme ReadOnly na true.
To, zda uživatel může úspěšně editovat data v ovladači a zda může změny posílat zpět datové množině, určují také vlastnosti k ovladači přiřazeného datového zdroje a datové množiny. Vlastnost Enabled datového zdroje určuje, zda ovladač přiřazený k datovému zdroji je schopen zobrazit hodnoty položek z datové množiny a tedy také určuje zda uživatel může editovat a posílat hodnoty zpět do datové množiny. Pokud Enabled je true (implicitní hodnota), pak ovladač může zobrazovat hodnoty položek. Vlastnost ReadOnly datové množiny určuje zda uživatelova editace může být posílána datové množině. Je-li false (implicitní hodnota), pak změny jsou posílány datové množině. Při hodnotě true je datová množina určena pouze pro čtení.
Poznámka: Komponenta datové množiny má vlastnost CanModify (vlastnost přístupná pouze za běhu aplikace), která určuje, zda datová množina může být modifikována. CanModify je nastaveno na true, pokud databáze umožňuje zápis. Pokud CanModify je false, pak datová množina je určena pouze pro čtení.
Následující tabulka shrnuje faktory, které určují, zda uživatel může editovat data v ovladači a posílat změny do databáze.
 
Vlastnost ReadOnly datového ovladače
Vlastnost Enabled datového zdroje
Vlastnost ReadOnly datové množiny
Vlastnost CanModify datové množiny
Zápisový přístup k databázi
Můžeme zapisovat do databáze?
false
true
false
true
Read/Write
ano
false
true
false
false
ReadOnly
ne
false
false
-
-
-
ne
true
-
-
-
-
ne

Ve všech datových ovladačích mimo TDBGrid, když modifikujeme položku, pak modifikace je před opuštěním ovladače překopírována do přiřazené položkové komponenty v datové množině. Pokud stiskneme Esc před opuštěním ovladače, pak změny jsou zrušeny a položka si ponechá původní hodnotu. V TDBGrid jsou modifikace kopírovány pouze při přechodu na jiný záznam; stisknutí Esc ruší všechny změny provedené v současném záznamu.
Když záznam je odeslán, pak C++ Builder testuje všechny datové ovladače přiřazené k datové množině na stav změn. Pokud některá položka má problémy s aktualizací, pak C++ Builder generuje výjimku a záznam není modifikován.

Zakazování a povolování zobrazování dat

Když aplikace prochází datovou množinou nebo provádí hledání, pak je vhodné dočasně zabránit v zobrazování hodnot v datových ovladačích při změně současného záznamu. Zákaz zobrazování hodnot urychluje procházení nebo hledání a zamezuje kmitání obrazu. Metoda DisableControls datové množiny zakazuje zobrazování pro všechny datové ovladače připojené k datové množině. K opětovnému povolení zobrazování voláme metodu EnableControls datové množiny.
Obvykle zakážeme zobrazování před zahájením iteračního procesu. Samotný iterační proces umístíme do příkazu try ... catch a tak zajistíme opětovné povolení i při výskytu výjimky během zpracování. V klauzuli catch pak voláme EnableControls (mimo volání EnableControls i za blokem try ... catch). Následující kód ukazuje jak to provést.
CustTable->DisableControls();
try
{
  // procházení všemi záznamy datové množiny
  for (CustTable->First(); !CustTable->EOF; CustTable->Next())
  {
  // Zpracování každého záznamu
  ...
  }
}
catch (...)
{
  CustTable->EnableControls();
  throw; // opětovné generování výjimky
}
CustTable->EnableControls();
Obnovení zobrazení dat
Metoda Refresh datové množiny vyprazdňuje lokální vyrovnávací paměti a obnovuje data pro otevřenou datovou množinu. Tuto metodu můžeme použít k aktualizaci hodnot zobrazených v datových ovladačích, pokud chceme získat aktuální data v případě, kdy mohla být změněna jinými aplikacemi, které mají k datům souběžný přístup.
Pozor: V některých případech to ale může vést k neočekávaným výsledkům. Např. jestliže uživatel zobrazuje záznam zrušený jinou aplikací, pak v okamžiku volání Refresh záznam zmizí.
Povolení událostí myši, klávesnice a časovače
Vlastnost Enabled datového ovladače určuje zda ovladač reaguje na události myši, klávesnice nebo časovaře a předává informace svému datovému zdroji. Implicitní nastavení této vlastnosti je true. K zabránění událostí myši, klávesnice a časovače v přístupu k datovému ovladači, nastavíme jeho vlastnost Enabled na false. Když Enabled je false, pak datový zdroj nezískává informace z datového ovladače. Datový ovladač pokračuje v zobrazování dat, ale zobrazený text v ovladači je zamlžený.

Ovladače reprezentující samostatnou položku

Mnoho ovladačů na stránce Data controls Palety komponent reprezentuje jednu položku v databázové tabulce. Většina z těchto ovladačů se podobá vzhledem a funkčností standardním ovladačům Windows, které umístíme na formulář. Např. ovladač TDBEdit je datová verze standardního ovladače TEdit, který umožňuje uživateli vidět a editovat textový řetězec.
Který ovladač použijeme závisí na typu dat (text, formátovaný text, grafika, logická informace apod.) obsažených v položce. Následující body popisují tyto komponenty podrobněji:
Zobrazování dat jako popis
TDBText je ovladač určený pouze pro čtení, který se podobá standardní komponentě TLabel nebo komponentě TStaticText. Ovladač TDBText je užitečný když chceme pouze zobrazovat data na formuláři. Např. předpokládejme formulář vytvářený pro položky v tabulce zákazníků pro zadávání ulice, města a státu. Můžeme použít dynamické vyhledávání poštovního směrovacího čísla pro zadané město v jiné tabulce. Komponenta TDBText pak může být použita k zobrazení PSČ, které odpovídá adrese zadané uživatelem.
TDBText získává text k zobrazení ze specifikované položky v současném záznamu datové množiny. Protože TDBText získává svůj text z datové množiny, text je zobrazován dynamicky (text se mění při procházení záznamy databázové tabulky). Tedy nelze specifikovat zobrazovaný text TDBText při návrhu, jak je to možno provést u TLabel nebo TStaticText.
Poznámka: Když umístíme komponentu TDBText na formulář a potřebujeme zobrazovat data různé šířky, pak nastavíme její vlastnost AutoSize je true (implicitně), k zajištění změny velikosti ovladače. Pokud AutoSize je nastaveno na false a ovladač je příliš malý, pak zobrazená data jsou oříznuta.
Zobrazování a editace položek v TDBEdit
TDBEdit je databázová verze editační komponenty. TDBEdit zobrazuje aktuální hodnotu datové položky, ke které je připojena a umožňuje editaci použitím standardních technik.
Např. předpokládejme, že CustomersSource je komponenta TDataSource, která je aktivní a připojena k otevřené TTable nazvané CustomersTable. Můžeme pak umístit komponentu TDBEdit na formulář a nastavit její vlastnosti takto: DataSource na CustomersSource a DataField na CustNo. Editační datová komponenta bezprostředně zobrazí hodnotu ze současného řádku sloupce CustNo datové množiny CustomersTable a to jak během návrhu tak i při běhu aplikace.
Zobrazování a editace textu pomocí TDBMemo
TDBMemo je datová komponenta (podobající se standardní komponentě TMemo), která může zobrazovat data velkého binárního objektu (BLOB). TDBMemo zobrazuje víceřádkový text a umožňuje jej také zadávat. Ovladač TDBMemo můžeme použít k zobrazování memo položek z tabulek dBASE a Paradoxu a textová data obsažená v položkách BLOB.
Implicitně TDBMemo umožňuje uživateli editovat memo text. K zabránění editace nastavíme vlastnost ReadOnly ovladače memo na true. K zobrazování tabulátorů a umožnění uživateli jejich zadávání do mema, nastavíme vlastnost WantTabs na true. Pro omezení počtu znaků, které uživatel může zadat do této položky, používáme vlastnost MaxLength. Implicitní hodnota pro MaxLength je 0, což znamená, že počet znaků není omezen jinak než možnostmi operačního systému.
Několik vlastností ovlivňuje zobrazování a způsob zadávání textu. Můžeme řídit zobrazování posuvníků a to pomocí vlastnosti ScrollBars. K zabránění zalamování slov nastavíme vlastnost WordWrap na false. Vlastnost Alignment určuje jak bude text zarovnáván v ovladači. Možné hodnoty jsou: taLeftJustify (implicitně), taCenter a taRightJustify. Ke změně písma textu použijeme vlastnost Font.
Za běhu aplikace uživatel může vystřihovat, kopírovat a vkládat text z a do ovladače memo. Stejné úlohy můžeme provádět programově pomocí metod CutToClipboard, CopyToClipboard a PasteFromClipboard.
Protože TDBMemo může zobrazit velké množství dat, zobrazování může nějakou dobu trvat. K omezení potřebného času nastavíme vlastnost AutoDisplay (určuje, zda zpřístupňovaná data jsou zobrazována automaticky). Jestliže AutoDisplay je false, pak TDBMemo zobrazí místo aktuálních dat jméno položky. Dvojitým kliknutím v ovladači pak zobrazíme aktuální data.
Zobrazování a editace textu v ovladači TDBRichEdit
Datová komponenta TDBRichEdit (podobá se standardní TRichEdit) může zobrazovat formátovaný text uložený v položkách BLOB. TDBRichEdit zobrazuje formátovaný víceřádkový text a umožňuje uživateli také jeho zadávání.
Poznámka: I když TDBRichEdit poskytuje vlastnosti a metody k zadávání a práci s Rich textem, komponenta neposkytuje uživatelské rozhraní, k zpřístupnění formátovacích voleb. Naše aplikace musí implementovat uživatelské rozhraní k umožnění editace Rich textu.
Implicitně TDBRichEdit umožňuje uživateli editovat memo text. K zabránění editace nastavíme vlastnost ReadOnly ovladače na true. Pro zobrazování tabulátorů a umožnění jejich zadávání do ovladače, nastavíme vlastnost WantTabs na true. K omezení počtu znaků, které uživatel může zadat do této položky, používáme vlastnost MaxLength. Implicitní hodnota pro MaxLength je 0, což znamená, že počet znaků není omezen jinak než možnostmi operačního systému.
Protože TDBRichEdit může zobrazit velké množství dat, zobrazování může nějakou dobu trvat. K omezení potřebného času nastavíme vlastnost AutoDisplay (určuje, zda zpřístupňovaná data jsou zobrazována automaticky). Jestliže AutoDisplay je false, pak TDBRichEdit zobrazí místo aktuálních dat jméno položky. Dvojitým kliknutím v ovladači pak zobrazíme aktuální data.
Zobrazování a editace grafických položek v ovladači TDBImage
TDBImage je datová komponenta, která zobrazuje bitově orientovanou grafiku obsaženou v datových položkách BLOB. Obrázky BLOB bere z datové množiny a ukládá je vnitřně ve Windows ve formátu .DIB. Implicitně TDBImage dovoluje uživateli editovat obrázek a používat operace se schránkou. Můžeme také použít vlastní editační metody připojené k obsluhám událostí ovladače.
Implicitně, ovladač obrázku zobrazuje tolik grafiky, kolik se vejde do ovladače. Můžeme nastavit vlastnost Stretch na true, ke změně velikosti obrázku tak, aby stále zaplňoval ovladač obrázku i při změně jeho velikosti.
Protože TDBImage může zobrazovat velké množství dat, zobrazení může nějakou dobu trvat. K omezení potřebného času nastavíme vlastnost AutoDisplay (určuje, zda zpřístupňovaná data jsou automaticky zobrazována). Jestliže AutoDisplay je false, pak TDBImage zobrazuje místo aktuálních dat jméno položky. Dvojitým kliknutím v ovladači zobrazíme aktuální data.
Zobrazování a editace dat v seznamech a kombinovaných ovladačích
Jsou čtyři datové ovladače, které poskytují databázové verze standardních ovladačů seznamu a kombinovaných ovladačů. Tyto ovladače poskytují uživateli množinu implicitních datových hodnot k volbě za běhu.
Poznámka: Tyto datové ovladače mohou být spojeny pouze s datovými množinami pro komponenty tabulek (nemohou pracovat s komponentami dotazu).
Následující tabulka tyto ovladače popisuje.
 
Ovladač Popis
TDBListBox Zobrazuje seznam prvků, ze kterého uživatel může aktualizovat položku v současném záznamu. Seznam zobrazených prvků je vlastnost ovladače.
TDBComboBox Kombinuje editační ovladač se seznamem. Uživatel může aktualizovat položku v současném záznamu volbou hodnoty z rozbalovacího seznamu nebo zápisem hodnoty. Seznam zobrazených prvků je vlastnost ovladače.
TDBLookupListBox Zobrazuje seznam prvků, ze kterého uživatel může aktualizovat sloupec v současném záznamu. Seznam zobrazených prvků je získán z jiné datové množiny.
TDBLookupComboBox Kombinuje editační ovladač se seznamem. Uživatel může aktualizovat položku v současném záznamu volbou hodnoty z rozbalovacího seznamu nebo zápisem hodnoty. Seznam zobrazených prvků je získán z jiné datové množiny.

Tato sekce je popsána v bodech:

Zobrazování a editace dat v seznamech
TDBListBox zobrazuje rolovatelný seznam prvků, ze kterého uživatel může volit vstup do datové položky. Ovladač seznamu zobrazuje implicitní hodnoty pro položku v současném záznamu a zvýrazňuje svoji současnou hodnotu v seznamu. Jestliže hodnota položky současného řádku není v seznamu, pak v seznamu není zvýrazněna žádná hodnota. Když uživatel vybere prvek seznamu, pak hodnota odpovídající položky v připojené datové množině je změněna.
Pomocí Editoru seznamu řetězců můžeme během návrhu vytvořit ve vlastnosti Items seznam zobrazovaných prvků. Vlastnost Height určuje, kolik prvků je nejednou v seznamu viditelných. Vlastnost IntegralHeight řídí způsob zobrazení seznamu (má-li hodnotu true, pak poslední prvek seznamu je zobrazen celý, při false může být zobrazen neúplný).

Zobrazování a editace dat v kombinovaných ovladačích
TDBComboBox kombinuje funkčnost editačního ovladače a seznamu. Za běhu aplikace uživatel může rozbalit seznam, ve kterém může vybírat z předdefinované množiny hodnot, nebo může zapsat jinou hodnotu.
Vlastnost Items komponenty specifikuje prvky obsažené v seznamu. Tuto vlastnost nastavujeme při návrhu pomocí Editoru seznamu řetězců. Za běhu aplikace, používáme metody vlastnosti Items k manipulaci se svým seznamem řetězců.
Když ovladač je spojen s položkou prostřednictvím vlastnosti DataField, pak ovladač zobrazuje hodnotu položky v současném záznamu a to bez ohledu na to, zda hodnota se nachází v seznamu prvků. Vlastnost Style určuje interakce uživatele s ovladačem. Implicitně Style je csDropDown, což znamená, že uživatel může zadávat hodnoty z klávesnice nebo je volit v seznamu. Následující vlastnosti určují, jak seznam Items je zobrazován za běhu aplikace:

Zobrazování a editace dat ve vyhledávacích seznamech a kombinovaných ovladačích
TDBLookupListBox a TDBLookupComboBox jsou datové ovladače, které odvozují seznam prvků od jednoho z těchto dvou zdrojů: V obou případech, uživatel je omezen seznamem voleb k nastavování přípustných hodnot položky. Když uživatel vybere prvek seznamu, je změněna hodnota odpovídající položky v připojené databázi.
Např. předpokládejme formulář objednávky s položkami z tabulky OrdersTable. OrdersTable obsahuje položku CustNo odpovídající identifikaci zákazníka, ale OrdersTable neobsahuje žádné jiné informace o zákazníkovi. Tabulka CustomersTable obsahuje položku CustNo odpovídající identifikaci zákazníka a také obsahuje další položky s informacemi o zákazníkovi, jako je firma zákazníka, adresa zákazníka apod. Při vyplňování formuláře objednávky je obvykle výhodnější vybírat firmu zákazníka z nějakého seznamu než zadávat identifikaci zákazníka. TDBLookupListBox, který zobrazuje všechna jména firem v tabulce CustomersTable umožňuje uživateli vybrat jméno firmy ze seznamu a nastavit správně CustNo na formuláři objednávky.
V této sekci jsou uvedeny body: Specifikace seznamu na základě vyhledávací položky
Při specifikaci seznamu prvků pomocí vyhledávací položky, datová množina ke které připojujeme ovladač musí mít již vyhledávací položku definovánu. Ke specifikaci vyhledávací položky pro seznam prvků:
  1. Nastavíme vlastnost DataSource seznamu na datový zdroj pro datovou množinu obsahující požadovanou vyhledávací položku.
  2. Zvolíme požadovanou vyhledávací položku v rozbalovacím seznamu vlastnosti DataField.
Když aktivujeme tabulku přiřazenou k vyhledávacímu seznamu, pak ovladač zjistí, že jeho datová položka je vyhledávací položka a zobrazí příslušné hodnoty pro vyhledávání.

Specifikace seznamu na základě sekundárního datového zdroje
Pokud pro datovou množinu nemáme definovanou vyhledávací položku, pak můžeme vytvořit podobný vzájemný vztah pomocí sekundárního datového zdroje a hodnoty položky vracené jako seznam prvků. Pro specifikaci sekundárního datového zdroje pro seznam prvků:

  1. Nastavíme vlastnost DataSource seznamu na datový zdroj pro ovladač.
  2. Zvolíme položku pro vložení vyhledaných hodnot z rozbalovacího seznamu vlastnosti DataField. Nesmíme zvolit vyhledávací položku.
  3. Nastavíme vlastnost ListSource seznamu na datový zdroj pro datovou množinu, která obsahuje položku jejíž hodnotu chceme vyhledat.
  4. Zvolíme položku používanou jako vyhledávací klíč z rozbalovacího seznamu vlastnosti KeyField. Jsou zde zobrazeny položky pro datovou množinu přiřazenou k datovému zdroji specifikovanému v předchozím kroku.
  5. Zvolíme položku jejíž hodnota bude vracena, v rozbalovacím seznamu vlastnosti ListField. Jsou zde zobrazeny položky pro datovou množinu přiřazenou k datovému zdroji specifikovanému v kroku 3.
Když aktivujeme tabulku přiřazenou k ovladači vyhledávacího seznamu, pak ovladač ví, že seznam prvků je odvozen od sekundárního zdroje a zobrazí příslušné hodnoty z tohoto zdroje.

Nastavování vlastností vyhledávacího seznamu a vyhledávacího kombinovaného ovladače
Následující tabulka obsahuje seznam důležitých vlastností vyhledávacího seznamu a vyhledávacího kombinovaného ovladače.
 
Vlastnost Význam
DataField Specifikuje položku v hlavní datové množině, která poskytuje hodnotu klíče pro vyhledávání ve vyhledávací datové množině. Tato položka je modifikována, když uživatel vybere prvek seznamu nebo kombinovaného ovladače. Pokud DataField je nastavena na vyhledávací položku, pak vlastnosti KeyField, ListField a ListSource nejsou použity.
DataSource Specifikuje datový zdroj pro ovladač. Pokud výběr v ovladači je změněn, pak tato datová množina je uvedena do stavu dsEdit.
KeyField Specifikuje položku ve vyhledávací datové množině odpovídající DataField. Ovladač hledá hodnotu pro DataField v KeyField vyhledávací datové množiny. 
ListField Specifikuje položku ve vyhledávací datové množině pro zobrazení v ovladači.
ListSource Specifikuje datový zdroj pro sekundární (vyhledávací) datovou množinu. Pořadí prvků zobrazených v seznamu nebo kombinovaném ovladači je určeno indexem specifikovaným vlastností IndexName vyhledávací datové množiny. Nemusí to být stejný index jako je použit vlastností KeyField.
RowCount Pouze pro TDBLookupListBox. Specifikuje počet řádků textu zobrazeného v seznamu. Výška ovladače je upravena k přesnému zaplnění tímto počtem řádků.
DropDownRows Pouze pro TDBLookupComboBox. Specifikuje počet řádků textu zobrazeného v rozbalovacím seznamu.

Inkrementální vyhledávání hodnoty v seznamu
Za běhu aplikace uživatel může použít inkrementální vyhledávání k nalezení prvku seznamu. Když ovladač má zaostření, pak zápisem např. 'ROB' vybereme první prvek seznamu začínající písmeny 'ROB'. Zápisem dalšího 'E' vybereme první prvek začínající 'ROBE', atd. Při hledání se nerozlišuje velikost písmen. Backspace a ESC ruší současný vyhledávací řetězec.

Zpracování hodnot položek pomocí značek
TDBCheckBox je datový ovladač značky. Můžeme jej použít k nastavování hodnot logických položek v datové množině. Např. můžeme tím určovat zda současný záznam má nebo nemá nějakou vlastnost.
Datový ovladač značky spravuje svůj označený nebo neoznačený stav porovnáním hodnoty současné položky s obsahem vlastností ValueChecked a ValueUnchecked. Pokud hodnota položky odpovídá vlastnosti ValueChecked, pak ovladač je označen; když položka odpovídá vlastnosti ValueUnchecked, pak ovladač je neoznačen.
Pozor: Hodnoty vlastností ValueChecked a ValueUnchecked nemohou být identické.
Vlastnost ValueChecked nastavíme na hodnotu zasílanou ovladačem do databáze, při označeném ovladači, když se uživatel přesune na jiný záznam. Implicitně tato hodnota je nastavena na true, ale můžeme ji změnit na libovolnou alfanumerickou hodnotu podle potřeby. Můžeme zde také uvést seznam hodnot oddělených středníky. Jestliže libovolný z těchto prvků odpovídá obsahu položky v současném záznamu, pak značka je označena. Např. můžeme specifikovat řetězec ValueChecked takto:
DBCheckBox1->ValueChecked = "true;Yes;On";
Jestliže položka pro současný záznam obsahuje některou z hodnot: "true", "Yes" nebo "On", pak značka je označena. Při porovnávání řetězců se nerozlišuje velikost písmen. Pokud uživatel označí značku, která má více řetězců ValueChecked, pak do databáze je odeslán první z nich.
Obdobně používáme vlastnost ValueUnchecked. Implicitně její hodnota je false. Vlastnost obsahuje řetězce, které určují neoznačenou značku.
Pokud položka v současném záznamu neobsahuje některou z hodnot řetězců ze seznamu z vlastností ValueChecked a ValueUnchecked, pak značka je zakázána. Pokud položka, ke které je značka přiřazena je logická hodnota, pak označení značky je určeno přímo hodnotou položky. V tomto případě vlastnosti ValueChecked a ValueUnchecked nemají žádný efekt.
Určení hodnot položky voliči
TDBRadioGroup je databázová verze ovladače skupiny voličů. Umožňuje nastavit hodnotu datové položky ovladači voličů, když je omezen počet možných hodnot pro položku. Skupina voličů obsahuje jeden volič pro každou možnou hodnotu položky. Uživatel může nastavit hodnotu datové položky výběrem určeného voliče.
Vlastnost Items určuje počet voličů, které jsou zobrazeny ve skupině. Items je seznam řetězců. Pro každý řetězec v Items je zobrazen jeden volič a tento řetězec je zobrazen napravo od voliče jako popis voliče.
Jestliže aktuální hodnota položky přiřazené ke skupině voličů odpovídá hodnotě některého řetězce ve vlastnosti Items, pak odpovídající volič je vybrán. Např. pokud ve vlastnosti Items jsou uvedeny tři řetězce: "Red", "Yellow" a "Blue" a příslušná položka současného záznamu obsahuje hodnotu "Blue", pak je označen třetí volič.
Poznímka: Pokud položka neobsahuje žádný řetězec z Items, pak volič může být přesto vybrán, jestliže obsah položky odpovídá řetězci ve vlastnosti Values. Jestliže hodnota položky neodpovídá žádnému řetězci v Items nebo Values, pak žádný volič není vybrán.
Vlastnost Values může obsahovat nepovinný seznam řetězců, které mohou být vraceny datové množině, když uživatel vybere volič a odešle záznam. Řetězce jsou přiřazeny po řadě k voličům. První řetězec je přiřazen k prvnímu voliči, druhý řetězec k druhému voliči atd. Např. předpokládejme, že Items obsahuje "Red", "Yellow" a "Blue" a Values obsahuje "Magenta", "Yellow" a "Cyan". Pokud uživatel vybere volič "Red", pak do databáze je odesláno "Magenta".
Pokud řetězce pro Values nejsou poskytnuty, pak do databáze jsou zasílány řetězce z Items.

Navigování a manipulace se záznamy

TDBNavigator poskytuje uživateli jednoduchý způsob pro procházení záznamy v datové množině a pro manipulaci se záznamy. Navigátor obsahuje řadu tlačítek, které umožňují uživateli přejít na následující nebo předchozí záznam, přejít na první nebo poslední záznam, vložit nový záznam, aktualizovat existující záznam, odeslat datové změny, zrušit datové změny, zrušit záznam a obnovit zobrazení záznamu.
Všechna tato tlačítka nemusí být zobrazena vždy (viz Volba zobrazení tlačítek navigátora).
V následující tabulce jsou popsána tlačítka navigátora (zleva doprava):
 
Tlačítko Význam
First Volá metodu First datové množiny k nastavení současného záznamu na první záznam.
Prior Volá metodu Prior datové množiny k nastavení současného záznamu na předchozí záznam.
Next Volá metodu Next datové množiny k nastavení současného záznamu na následující záznam.
Last Volá metodu Last datové množiny k nastavení současného záznamu na poslední záznam.
Insert Volá metodu Insert datové množiny k vložení nového záznamu před současný záznam a uvádí datovou množinu do stavu dsInsert.
Delete Ruší současný záznam. Pokud vlastnost ConfirmDelete je true, pak jsme dotázání na potvrzení před zrušením.
Edit Uvádí datovou množinu do stavu dsEdit, což umožňuje modifikaci současného záznamu.
Post Zapisuje změny v současném záznamu do databáze.
Cancel Ruší provedené změny v současném záznamu a vrací datovou množinu do stavu dsBrowse.
Refresh Vyprazdňuje zobrazovací vyrovnávací paměti datových ovladačů a potom obnoví obsah těchto vyrovnávacích pamětí z fyzické tabulky nebo dotazu. Je to užitečné, pokud data mohou být měněna jinou aplikací.
Volba zobrazení tlačítek navigátora
Když při návrhu umístíme TDBNavigator na formulář, pak všechna jeho tlačítka jsou viditelná. Vlastnost VisibleButtons můžeme použít  k vypnutí tlačítek, které nechceme zobrazovat. Např. na formuláři, který chceme používat k prohlížení a ne editování, můžeme zakázat tlačítka Edit, Insert, Delete, Post a Cancel.
V této sekci jsou uvedeny body: Skrývání a zobrazování tlačítek navigátora při návrhu
Vlastnost VisibleButtons v Inspektoru objektů je zobrazena se znakem +, což znamená, že ji můžeme expandovat k zobrazení logických hodnot pro každé tlačítko navigátora. Viditelnost tlačítka je indikována logickou hodnotou. Pokud hodnota je nastavena na true, tak příslušné tlačítko je zobrazeno.
Poznámka: Při nastavení na false, tlačítko je z navigátora na formuláři odstraněno a zbývající tlačítka jsou rozšířena tak, aby zaplnily šířku ovladače.

Skrývání a zobrazování tlačítek navigátora za běhu
Za běhu aplikace můžeme skrývat nebo zobrazovat tlačítka navigátora v reakci na akce uživatele nebo stavu aplikace. Např. předpokládejme použití jednoho navigátora pro navigování dvou různých datových množin, jedné s možností editace záznamů a druhé pouze pro prohlížení. Podle toho, kterou datovou množinu navigujeme potřebujeme na navigátoru různá tlačítka. Můžeme to zajistit např. následující obsluhou události:
void __fastcall TForm1::CustomerCompanyEnter(TObject *Sender)
{
  if (Sender == (TObject *)CustomerCompany)
  {
    DBNavigatorAll->DataSource = CustomerCompany->DataSource;
    DBNavigatorAll->VisibleButtons.Clear();
    DBNavigatorAll->VisibleButtons<<nbFirst << nbPrior << nbNext << nbLast;
  }
  else
  {
    DBNavigatorAll->DataSource = OrderNum->DataSource;
    DBNavigatorAll->VisibleButtons << nbInsert << nbDelete << nbEdit
                                   << nbPost << nbCancel << nbRefresh;
  }
}

Zobrazování nápovědy
K zobrazování nápovědy pro každé tlačítko navigátora za běhu aplikace, nastavíme vlastnost navigátora ShowHint na true. Pokud ShowHint je true, pak navigátor zobrazuje nápovědu, když se zastavíme kurzorem myši nad tlačítkem. ShowHint je implicitně false.
Vlastnost Hints určuje texty nápovědy pro všechna tlačítka. Implicitně Hints je prázdný seznam řetězců. Když Hints je prázdné,  pak pro každé tlačítko je zobrazován implicitní text. Pro zadání svých vlastních textů nápovědy pro navigační tlačítka použijeme Editor seznamu řetězců k zadání textů pro každé tlačítko ve vlastnosti Hints.
Použití jednoho navigátora pro více datových množin
Stejně jako u ostatních datových ovladačů, vlastnost navigátora DataSource určuje datový zdroj, který připojuje ovladač k datové množině. Změnou této vlastnosti za běhu aplikace můžeme přejít k řízení jiné datové množiny.
Předpokládejme formulář obsahující dva editační ovladače spojené s datovými množinami CustomersTable a OrdersTable prostřednictvím datových zdrojů CustomersSource a OrdersSource. Když uživatel používá editační ovladač připojený ke CustomersSource, pak vyžaduje aby navigátor byl také přepnut na CustomersSource a když pracuje s editačním ovladačem připojeným k OrdersSource, pak chce aby navigátor byl také přepnut na OrdersSource. Můžeme vytvořit obsluhu události OnEnter pro jeden editační ovladač a potom sdílet tuto obsluhu s ostatními editačními ovladači. Např.
void __fastcall TForm1::CustomerCompanyEnter(TObject *Sender)
{
  if (Sender == (TObject *)CustomerCompany)
    DBNavigatorAll->DataSource = CustomerCompany->DataSource;
  else
    DBNavigatorAll->DataSource = OrderNum->DataSource;
}

  1. Další aplikace, kterou se budeme zabývat ukazuje jak v databázové aplikaci použít více formulářů. Bude zde také použita komponenta TDBNavigator. Hlavní formulář naší aplikace je jednoduchý. Obsahuje pouze nabídku a komponentu TDBNavigator. Velikost formuláře upravíme tak, aby obsahoval pouze tyto komponenty. Vlastnost Name formuláře změníme na fmToolBar. Nabídka obsahuje volby File (s volbou Close), Record (s volbami First, Next, Prior, Last, Delete, Insert a Cancel) a Help (s volbami About a Messages). Formulář obsahuje následující veřejné metody:

  2. void virtual __fastcall SetNavigator(const TDataSource* ds);
    void __fastcall UpdateMenu();
    Implementace těchto metod je:
    void __fastcall TfmToolBar::SetNavigator(const TDataSource* ds)
    {
      if(DBNavigator1->DataSource != ds){
        if(Messages1->Checked)
          ShowMessage(AnsiString("Changing DBNavigator's datasource to ") + ds->Name);
        DBNavigator1->DataSource = (TDataSource*) ds;
        UpdateMenu();
       }
    }
    void __fastcall TfmToolBar::UpdateMenu()
    {
      First1->Enabled = !DBNavigator1->DataSource->DataSet->Bof;
      Next1->Enabled = !DBNavigator1->DataSource->DataSet->Eof;
      Prior1->Enabled = !DBNavigator1->DataSource->DataSet->Bof;
      Last1->Enabled = !DBNavigator1->DataSource->DataSet->Eof;
      Insert1->Enabled=DBNavigator1->DataSource->DataSet->State==dsBrowse;
      Delete1->Enabled=DBNavigator1->DataSource->DataSet->State==dsBrowse;
      Cancel1->Enabled=DBNavigator1->DataSource->DataSet->State==dsEdit ||
                       DBNavigator1->DataSource->DataSet->State==dsInsert;
    }
    Volby v nabídce tvoří příkazy: Pro volbu First:
    DM1->Customer->First();
    UpdateMenu();
    Volba Next:
    DM1->Customer->Next();
    UpdateMenu();
    Volba Prior:
    DM1->Customer->Prior();
    UpdateMenu();
    Volba Last:
    DM1->Customer->Last();
    UpdateMenu();
    Volba Delete:
    DM1->Customer->Delete();
    UpdateMenu();
    Volba Insert:
    DM1->Customer->Insert();
    UpdateMenu();
    Volba Cancel:
    DM1->Customer->Cancel();
    UpdateMenu();
    Volba Close: Close();
    Volba About: fmAboutBox->ShowModal();
    Volba Messages: Messages1->Checked = !Messages1->Checked;
    Tím je hlavní formulář hotov. Uložíme jej do souboru ToolBar.
  3. Pro přístup k datům budeme používat datový modul. Vytvoříme jej volbou File | New Data Module a vložíme do něj dvě komponenty TTable a dvě komponenty TDataSource. Vlastnost Name datového modulu změníme na DM1 a uložíme jej do souboru DM. U první TTable nastavíme vlastnost Name na Customer, vlastnost DatabaseName na BCDEMOS, TableName na Customer.DB, vlastnost IndexName na ByCompany a vlastnost Active na True. První komponentu TDataSource nazveme CustomerSource a nastavíme u ní Dataset na Customer.  U druhé komponenty TTable to bude obdobné: Name na Orders, DatabaseName na BCDEMOS, TableName na Orders.DB, vlastnost IndexName na CustNo a vlastnost MasterSource na CustomerSource. Dvojitým kliknutím na vlastnosti Master Fields zobrazíme dialogové okno Field Link Designer, v obou horních seznamech vybereme CustNo a stiskneme tlačítko Add. Tím máme definovánu vazbu mezi tabulkami. U druhé TTable nastavíme ještě Active na true. Druhou TDataSource nazveme OrdersSource a nastavíme u ní Dataset na Orders. Datový modul je hotov.
  4. Formulář fmAboutBox je zobrazen na následujícím obrázku. Neobsahuje žádný kód a vytvořte jej tedy sami. Uložte jej do souboru About.

  5. Aplikace je dále tvořena dalším formulářem. Přidáme tedy k aplikaci další formulář. Změníme jeho vlastnost Name na fmCustomer, vlastnost Caption na Customer a Visible na true. Vložíme na něj komponentu TDBGrid, která bude zabírat většinu plochy formuláře. U TDBGrid nastavíme vlastnost DataSource na DM->CustomerSource. Pro formulář vytvoříme ještě tři obsluhy událostí: obsluha OnActivate je tvořena:

  6. fmToolBar->SetNavigator(DM1->CustomerSource);
    Obsluhu OnCreate tvoří:
    fmToolBar->SetNavigator(DM1->CustomerSource);
    a obsluha OnShow obsahuje příkaz:
    fmToolBar->UpdateMenu();
    Formulář je hotov a uložíme jej do souboru CustData.
  7. K aplikaci patří ještě jeden formulář. Vytvoříme jej a změníme u něj Name na fmCustOrd, Caption na Data Navigation a Visible na true. K hornímu okraji formuláře vložíme komponentu TDBEdit a nastavíme u ní DataSource na DM1->CustomerSource a DataField na Company. Zbývající plochu formuláře bude zabírat TDBGrid u které nastavíme DataSource na DM1->OrdersSource. Vytvoříme ještě dvě obsluhy událostí: Obsluha OnActivate formuláře je tvořena příkazem:

  8. if(ActiveControl == DBGrid1)
      DBGrid1Enter(NULL);
    a obsluhu OnEnter datové mřížky tvoří příkaz:
    fmToolBar->SetNavigator(DM1->OrdersSource);
    Formulář uložíme do souboru CustOrds. Tím je naše aplikace téměř hotova. Je nutno vložit ještě několik hlavičkových souborů. Dokončete její vývoj sami. Zjistěte, co ovládáme volbou Help | Messages?

  9. Podíváme se ještě na jednu hotovou aplikaci. Podobá se naši předchozí aplikaci (pouze se jedná o MDI aplikaci). Nalezneme ji v adresáři Program Files\Borland\CBuilder X\Examples\DBTasks\NavMDI. Aplikaci vyzkoušejte a podívejte se jak je vytvořena.
8. Práce s datovými ovladači