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.
![](/file/23413/Chip_2002-07_cd1.bin/chplus/cpp/4/PreviousArrow.gif) ![](/file/23413/Chip_2002-07_cd1.bin/chplus/cpp/4/NextArrow.gif) ![](/file/23413/Chip_2002-07_cd1.bin/chplus/cpp/4/WayUpArrow.gif) |
9. Prßce s polo╛kov²mi komponentami
|