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:
-
Umístíme datové množiny a datové zdroje do datového modulu
(nebo na formulář).
-
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.
-
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.
-
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:
-
Omezit položky v naší datové množině na podmnožinu sloupců
dostupných v přiřazené databázi.
-
Přidávat položkové komponenty k seznamu trvalých komponent.
-
Odstraňovat položkové komponenty ze seznamu trvalých komponent
k zabránění naší aplikaci v přístupu k jistým sloupcům přiřazené databáze.
-
Definovat nové položky (obvykle nahrazující existující položky)
na základě sloupců v tabulce nebo dotazu připojené datové množiny.
-
Definovat počitatelné položky, které vypočítávají své hodnoty
z ostatních položek datové množiny.
-
Definovat vyhledávací položky, které určují své hodnoty na
základě položek v jiných datových množinách.
-
Modifikovat zobrazovací a editační vlastnosti položkových
komponent.
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:
-
Umístíme datovou množinu do datového modulu.
-
Nastavíme vlastnost DatabaseName datové množiny.
-
Nastavíme vlastnost TableName (pro TTable)
nebo vlastnost
SQL (pro TQuery).
-
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é.
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.
-
V místní nabídce Editoru položek zvolíme Add Fields.
-
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:
-
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.
-
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.
-
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.
-
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.
-
V části Field type zvolíme volič Data.
-
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:
-
Do editačního ovladače Name zadáme jméno počitatelné
položky. Nezadáváme jméno existující položky.
-
V kombinovaném ovladači Type zvolíme datový typ pro
položku.
-
Pokud vytváříme položku typu TStringField, TBytesField
nebo
TVarBytesField, pak do editačního ovladače Size zadáme
velikost.
-
V části Field type zvolíme Calculated.
-
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.
-
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:
-
Vybereme komponentu datové množiny v rozbalovacím seznamu
Inspektora objektů.
-
Přejdeme na stránku událostí Inspektora objektů a dvojitě
klikneme na události
OnCalcFields.
-
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:
-
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.
-
Zvolíme datový typ pro položku v kombinovaném ovladači Type.
-
Pro položky typů TStringField, TBytesField
a TVarBytesField zadáme do editačního ovladače Size velikost
položky.
-
V části Field type zvolíme volič Lookup (tím
umožníme používat kombinované ovladače Dataset a Key Fields).
-
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.
-
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.
-
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).
-
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:
-
Zadáme jméno pro agregovanou položku do editačního ovladače
Name.
Nesmíme zadat jméno existující položky.
-
V kombinovaném ovladači Type zvolíme pro položku agregovaný
datový typ.
-
V části Field type zvoláme Aggregate.
-
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.
-
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ě:
-
Dvojitým kliknutím na datové množině vyvoláme Editor položek.
-
Vybereme položku, pro kterou chceme nastavovat vlastnosti.
-
Nastavíme požadované vlastnosti pro položku v Inspektoru
objektů.
-
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:
-
Dvojitě klikneme na datovou množinu k vyvolání Editoru položek.
-
Vybereme položky na které chceme aplikovat množinu atributů.
-
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:
-
Vyvoláme Editor položek pro datovou množinu obsahující položku.
-
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:
-
Vybereme komponentu v Editoru položek nebo Inspektoru objektů.
-
Přejdeme na stránku vlastností Inspektora objektů.
-
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]);
-
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.
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
|