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ě:
-
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.
-
Umístíme datové ovladače ze stránky Data Access Palety
komponent na formulář.
-
Nastavíme vlastnost DataSource ovladače na jméno komponenty
datového zdroje z kterého chceme získávat data.
-
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ě.
-
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:
-
Style určuje styl zobrazení komponenty:
-
csDropDown (implicitní) - zobrazuje rozbalitelný seznam
s editačním ovladačem, ve kterém uživatel může zadávat text. Všechny prvky
jsou řetězce a mají stejnou výšku.
-
csSimple - kombinuje editační ovladač se seznamem
prvků pevné velikosti, který je vždy zobrazen. Když nastavíme Style
na csSimple, pak musíme zvětšit vlastnost Height, aby seznam
mohl být zobrazen.
-
csDropDownList - Zobrazuje rozbalitelný seznam a editační
ovladač, ale uživatel nemůže zadávat nebo měnit hodnotu, která není v seznamu.
-
csOwnerDrawFixed a csOwnerDrawVariable - umožňuje
jiné zobrazení prvků seznamu než řetězce (např. bitové mapy) nebo používání
různých písem pro jednotlivé prvky v seznamu.
-
DropDownCount je maximální počet prvků zobrazených
v seznamu. Pokud počet prvků je větší než DropDownCount, pak uživatel
může seznamem rolovat.
-
ItemHeight určuje šířku každého prvku, když styl je
csOwnerDrawFixed.
-
Sorted určuje zda seznam je zobrazován v abecedním
pořadí.
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ů:
-
vyhledávané položky definované pro datovou množinu
-
sekundárního datového zdroje, datové položky a klíče
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ů:
-
Nastavíme vlastnost DataSource seznamu na datový zdroj
pro datovou množinu obsahující požadovanou vyhledávací položku.
-
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ů:
-
Nastavíme vlastnost DataSource seznamu na datový zdroj
pro ovladač.
-
Zvolíme položku pro vložení vyhledaných hodnot z rozbalovacího
seznamu vlastnosti DataField. Nesmíme zvolit vyhledávací položku.
-
Nastavíme vlastnost ListSource seznamu na datový zdroj
pro datovou množinu, která obsahuje položku jejíž hodnotu chceme vyhledat.
-
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.
-
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;
}
-
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:
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.
-
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.
-
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.
-
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:
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.
-
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:
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?
-
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
|