Použití databázových ovládacích prvků

Pro zobrazení a modifikaci dat v databázi používáme prvky ze skupiny "Data Controls" (databázové ovládací prvky) z palety prvků. K těmto prvkům je přiřazena i třída TDBGrid umožňující zobrazení a modifikaci všech zadaných záznamů a sloupců tabulky a TDBNavigator pro přesun mezi záznamy, zrušení záznamů i předání nových nebo změněných záznamů do databáze.

Následující tabulka podává přehled databázových ovládacích prvků, tak jak jsou zleva doprava umístěny v paletě prvků.

PrvekPopis
TDBGrid Zobrazuje informace z databáze v mřížce typu tabulkového procesoru. Sloupce jsou vytvořeny podle struktury databázové tabulky nebo je lze definovat ručně nebo programově.
TDBNavigator Obsahuje tlačítka pro pohyb v zobrazovaných datech. Při tvorbě programu lze zadat výběr z tlačítek pro pohyb, modifikaci a předání záznamů i pro obnovení zobrazení dat.
TDBText Zobrazuje data ze zadané položky aktuálního záznamu.
TDBEdit Používá editační pole k zobrazení a modifikaci dat ze zadané položky aktuálního záznamu.
TDBMemo Zobrazuje víceřádková textová data. Může obsahovat i BLOB (binary large object -- binární objekty) data.
TDBImage Zobrazuje grafická nebo binární data ze zadané položky aktuálního záznamu.
TDBListBox Zobrazuje seznam hodnot, jimiž lze aktualizovat zadanou položku aktuálního záznamu.
TDBComboBox Kombinuje prvek třídy TDBEdit s připojeným seznamem. Uživatel může modifikovat zadanou položku aktuálního záznamu buď zápisem hodnoty nebo výběrem hodnoty z menu.
TDBCheckBox Zobrazuje zaškrtávací volbu přiřazenou k dvojici hodnot uložených v databázi. Data mohou být logická nebo mohou být jiného typu.
TDBRadioGroup Nabízí ve formě přepínače výběr z disjunktní množiny voleb, které lze zadat do příslušné položky aktuálního záznamu.
TDBLookupList Zobrazuje seznam položek, jimiž lze aktualizovat zadanou položku aktuálního záznamu. Seznam položek je převzat ze zadané položky v jiné datové množině.
TDBLookupCombo Kombinuje prvek třídy TDBEdit s rozbalovací verzí prvku třídy TDBLookupList. Uživatel může modifikovat zadanou položku aktuálního záznamu buď zápisem hodnoty nebo výběrem hodnoty z menu, jehož položky jsou převzaty ze zadané položky v jiné datové množině.

Většina databázových ovládacích prvků jsou doplněné verze standardních ovládacích prvků. Odlišují se od nich dvě třídy: TDBGridTDBNavigator, které nemají svou paralelu mezi standardními ovládacími prvky. Všechny tyto prvky odvozují zobrazovanou hodnotu z databáze existující mimo aplikaci a mohou rovněž předávat (vracet) upravená data do původního zdroje. Vazba na databázi funguje i při tvorbě programu, což znamená, že lze prvek při tvorbě aplikace připojit na aktivní databázi a bezprostředně sledovat v ovládacím prvku živá data. Lze použít Editor položek k procházení databáze a ověřit tak při tvorbě programu bez nutnosti překládat a spouštět program, že se aplikace připojuje na správnou databázi; nelze však data při tvorbě programu modifikovat.

V této kapitole jsou nejprve popsány základní společné rysy všech databázových ovládacích prvků a potom je popsán smysl a způsob použití jednotlivých tříd.

Základní vlastnosti databázových ovládacích prvků

Databázové ovládací prvky jsou připojeny k databázovým tabulkám pomocí vlastnosti DataSource. Tato vlastnost udává jméno prvku třídy TDataSource, z něhož ovládací prvek získává data. Prvek třídy TDataSource je dále připojen k datové množině (TTable nebo TQuery), která je zase připojena k databázové tabulce. Datová množina je seskupením prvků třídy TField, které mohou být buď vytvořeny dynamicky při běhu programu, nebo zadány staticky pomocí Editoru položek při jeho tvorbě. Bližší informace o třídách TDataSource, TTable a TQuery a o Editoru položek viz kap. "Použití prvků a nástrojů pro přístup k datům".

Databázové ovládací prvky mohou pracovat pouze s položkami tabulek, pro něž existuje odpovídající prvek třídy TField. Pokud je pomocí Editoru položek omezena datová množina na podmnožinu sloupců dané tabulky, prvky třídy TField existují pouze pro tyto sloupce. Většina databázových ovládacích prvků má vlastnost DataField, kde lze specifikovat prvek třídy TField, k němuž je databázový ovládací prvek připojen.

Při vytváření formuláře pro práci s daty je třeba do aplikace umístit alespoň jednu datovou množinu, alespoň jeden prvek třídy TDataSource a jeden nebo více databázových ovládacích prvků. Datové množiny a prvky třídy TDataSource můžeme umístit i do běžného formuláře, je však dobrým zvykem je umísťovat do samostaného modulu. Delphi tento přístup podporuje zavedením tzv. datových modulů (Data Module), což je ale víceméně běžný formulář, který není zobrazován při běhu programu a do kterého umísťujeme prvky sloužící pro přístup k datům.

Pro umístění databázového ovládacího prvku do formuláře a pro jeho připojení na datovou množinu je třeba provést následující kroky:

  1. Umístit ovládací prvek do formuláře.
  2. Nastavit jeho vlastnost DataSource na jméno existujícího prvku třídy TDataSource. Jméno lze zapsat přímo nebo vybrat z menu (je-li formulář s ním zpřístupněn uvedením ve frázi uses).
  3. Nastavit vlastnost DataField na jméno prvku třídy TField. Jméno položky lze zapsat nebo vybrat z menu.

Poznámka: Dvě třídy databázových ovládacích prvků, TDBGridTDBNavigator, pracují se všemi dostupnými položkami datové množiny a nemají tedy vlastnost DataField. V těchto případech vynecháme poslední bod.

Pokud je databázový ovládací prvek připojen k datové množině, udává jeho vlastnost Enabled, zda prvek zobrazuje příslušná data a zda zpracovává události od myši, klávesnice nebo časovače. Ovládací prvky jsou zablokovány i v případě, že má hodnotu false vlastnost Enabled připojeného TDataSource nebo má-li hodnotu false vlastnost Active datové množiny.

Modifikace položek

Většina databázových ovládacích prvků implicitně umožňuje modifikaci položek. Právo modifikace obecně závisí na vlastnostech ReadOnly ovládacího prvku i prvku třídy TField a hodnotě vlasntosti CanModify datové množiny. Vlastnost ReadOnly má implicitně hodnotu false, modifikace je tedy implicitně možná.

Kromě toho je třeba, aby pro provedení modifikace byla datová množina ve stavu "Editace". Vlastnost AutoEdit prvků třídy TDataSource (s implicitní hodnotou true) zajišťuje, že datová množina přejde do stavu "Editace", když připojený ovládací prvek zahájí modifikaci dat pomocí klávesnice nebo myši.

Ve všech databázových ovládacích prvcích kromě třídy TDBGrid je při modifikaci položky tato změna přenesena do připojeného prvku třídy TField až tehdy, opustíme-li prvek (např. klávesou Tab). Stiskneme-li předtím klávesu Esc, Delphi zruší všechny provedené změny a hodnota položky se vrátí na hodnotu před začátkem modifikace. V prvku třídy TDBGrid se modifikace provede, pokud dojde ke změně aktuálního záznamu; stisk klávesy Esc v kterékoliv položce záznamu před změnou záznamu znamená zrušení všech změn provedených v daném záznamu.

Po předání záznamu do databáze Delphi kontroluje všechny datově vázané ovládací prvky připojené k datové množině ohledně změny stavu. Pokud vzniknou problémy při modifikaci některé položky, Delphi generuje výjimku a modifikace v databázi se neprovedou.

Zobrazení dat jako textů třídou TDBText

Třída TDBText představuje ovládací prvek neumožňující zápis, který je analogický třídě TLabel ze standardní stránky palety prvků. Prvek třídy TDBText získává zobrazovaná data ze zadané položky aktuálního záznamu datové množiny. Protože tato třída získává data z datové množiny, zobrazovaný text je dynamický -- text se při pohybu uživatele v tabulce mění. Text zobrazovaný prvkem třídy TDBText tedy nelze zadat při tvorbě programu, tak jak to děláme u prvku třídy TLabel. Pokud je však prvek třídy TDBText připojen při tvorbě programu k nějaké položce, zobrazuje aktuální hodnotu této položky.

Ovládací prvky třídy TDBText jsou vhodné pro zobrazení chráněných dat ve formuláři umožňujícím jinak modifikaci dat. Předpokládejme například, že máme formulář pracující se seznamem zákazníků a že jakmile uživatel zadá kód státu, automaticky se stát vyhledá v samostatném číselníku. Lze tedy použít prvek třídy TDBText vázaný na číselník států, který zajistí v daném formuláři zobrazení správného názvu státu (ten ale nejde editovat).

Poznámka: Při vytváření prvku třídy TDBText je vhodné se ujistit, že vlastnost AutoSize má (implicitní) hodnotu true a že se tedy velikost prvku mění podle velikosti zobrazovaných dat. Pokud má vlastnost AutoSize hodnotu false a prvek je příliš malý, zobrazovaná data jsou oříznuta.

Zobrazování a modifikace položek třídou TDBEdit

Třída TDBEdit je datově vázaná verze třídy TEdit. Zobrazuje aktuální hodnotu připojené položky. Hodnotu zobrazovanou prvkem lze změnit.

Mějme například prvek třídy TDataSource se jménem DataSource1, aktivní a připojený k otevřené datové množině (TTable) se jménem ZAKAZNIK. Vytvoříme prvek třídy TDBEdit se jménem DBEditZakaznik a nastavíme jeho vlastnosti následujícím způsobem:

Prvek DBEdit1 zobrazí hodnotu položky CISLO_ZAK tabulky ZAKAZNIK pro aktuální záznam, a to jak při tvorbě, tak i při běhu programu.

Modifikace položky

Uživatel může pomocí prvku třídy TDBEdit aktualizovat položku databáze, pokud:

  1. Datová množina je ve stavu "Editace".
  2. Vlastnost CanModify datové množiny má hodnotu true.
  3. Vlastnost ReadOnly editačního pole má hodnotu false.

Zobrazování a modifikace dat pomocí třídy TDBGrid

Třída TDBGrid umožňuje prohlížet a aktualizovat všechny záznamy dané datové množiny v tabulkovém formátu.

Chování prvku třídy TDBGrid závisí na tom, zda jsou prvky třídy TField pro datovou množinu vytvářeny dynamicky při běhu programu, nebo zda byl použit Editor položek k vytvoření trvalé množiny prvků třídy TField, jejichž vlastnosti lze při tvorbě programu definovat pomocí Editoru objektů. Množinu zobrazovaných sloupců, jejich hlavičky, barvy a některé další vlastnosti lze dále ovlivnit Editorem sloupců dostupným z menu zobrazovaného pravým tlačítkem myši nad danou mřížkou.

Pokud jsou položky pro datovou množinu vytvářeny dynamicky, je použito implicitní řazení položek a implicitní zobrazovací a editační formáty. Většinou však potřebujeme pořadí položek a jejich zobrazování ovlivnit. Pro tento účel používáme Editor položek, jehož prostřednictvím při tvorbě programu vytvoříme prvky třídy TField a nastavíme jejich vlastnosti.

Použití Editoru položek datové množiny a Editoru sloupců mřížky umožňuje převzít kontrolu nad vzhledem záznamů zobrazených v této mřížce. Pořadí, ve kterém jsou zleva doprava zobrazovány položky, je dáno řazením sloupců v tabulce (není-li stanoveno jinak), řazením prvků třídy TField v seznamu "Fields" Editoru položek (není-li stanoveno v Editoru sloupců) nebo řazením sloupců v Editoru sloupců. Podobně vlastnosti DisplayFormatEditFormat prvku třídy TField ovlivňují formát jednotlivých položek jak při zobrazení, tak i při editaci. Nastavením vlastnosti Required pro položku nového záznamu lze vynutit zadání hodnoty do této položky. Zabránit zobrazení položky v mřížce lze buď nastavením vlastnosti Visible daného prvku třídy TField na hodnotu false nebo neuvedením sloupce v Editoru sloupců. Bližší informace o použití Editoru položek k nastavení vlastností prvků třídy TField viz kap. "Použití prvků a nástrojů pro přístup k datům".

Pro vytvoření prvku třídy TDBGrid a pro jeho umístění do formuláře je třeba:

  1. Vytvořit ve formuláři tento prvek.
  2. Nastavit jeho vlastnost DataSource na jméno existující datové množiny.

Nastavení prvků třídy TDBGrid

Vlastnost Options třídy TDBGrid lze použít při tvorbě programu k řízení chování prvku a ovlivnění jeho vzhledu při běhu programu. Při prvním umístění prvku třídy TDBGrid do formuláře při tvorbě programu je vlastnost Options v Editoru objektů zobrazena se znaménkem plus (+), což znamená, že vlastnost Options lze expandovat na posloupnost samostatně nastavitelných logických vlastností. Zobrazení a nastavení těchto vlastností zahájíme dvojitým kliknutím na vlastnost Options. V Editoru objektů se objeví pod vlastností Options seznam nastavitelných voleb. Znaménko + se změní na znaménko minus (-), což znamená, že seznam vlastností lze opět dvojitým kliknutím na vlastnost Options schovat.

Následující tabulka shrnuje vlastnosti Options a popisuje jejich vliv na zobrazení položky při běhu programu.

VolbaÚčel
dgEditing Hodnota true (implicitní) umožňuje editaci, vkládání a rušení záznamů v tabulce, hodnota false nikoliv
dgAlwaysShowEditor Hodnota true převádí po výběru položku automaticky do editačního režimu, hodnota false (implicitní) nikoliv.
dgTitles Hodnota true (implicitní) vede k zobrazení hlaviček sloupců, v opačném případě se nezobrazují. Hlavičkou je buď jméno položky nebo text zadaný v Editoru sloupců.
dgIndicator Hodnota true (implicitní) vede k zobrazení indikačního sloupce a ukazatele aktuálního záznamu (šipkou) na levé straně tabulky. Při vkládání se šipka změní na hvězdičku. Při editaci se šipka změní na znak "I". V opačném případě není indikační sloupec zobrazován.
dgColumnResize Hodnota true (implicitní) umožňuje upravit šířku sloupců přetažením hranic sloupců v záhlaví tabulky. V opačném případě nelze velikost sloupců měnit.
dgColLines Hodnota true (implicitní) vede k zobrazení svislé dělicí čáry mezi sloupci, hodnota false nikoliv.
dgRowLines Hodnota true (implicitní) vede k zobrazení vodorovné dělicí čáry mezi řádky, hodnota false nikoliv.
dgTabs Hodnota true (implicitní) umožňuje přecházet mezi položkami záznamu pomocí klávesy Tab, v opačném případě vede klávesa Tab k opuštění mřížky.
dgRowSelect Hodnota true vede k zvýrazňování celého zobrazovaného řádku, v opačném případě (implicitní) je zvýrazněna vždy jednotlivá položka.
dgAlwaysShowSelection Hodnota true (implicitní) vede k zvýraznění položky nebo řádku, i když je aktivní jiný ovládací prvek formuláře. V opačném případě je označená část zvýrazněna pouze když je prvek aktivní.
dgConfirmDelete Hodnota true vede při zrušení záznamu k zobrazení dialogu vyžadujícího potvrzení zrušení záznamu, hodnota false nikoliv.

Modifikace dat v mřížce

Při běhu programu lze použít prvek třídy TDBGrid k modifikaci existujících dat a ke vkládání nových záznamů, pokud jsou splněny obě následující (implicitně platné) podmínky:

  1. Vlastnostt CanModify datové množiny má hodnotu true.
  2. Vlastnost ReadOnly dané mřížky má hodnotu false.

Ve většině databázových ovládacích prvků jsou změny položky předány do databáze, jakmile se přesuneme do jiného ovládacího prvku. V mřížky jsou implicitně změny a vkládané položky předávány do databáze při změně aktuálního záznamu. Při předávání záznamu do databáze kontroluje Delphi všechny datově vázané prvky připojené k datové množině ohledně změny stavu. Při problémech s modifikací kterékoliv položky obsahující aktualizovaná data generuje Delphi výjimku a modifikace záznamu se neprovede.

Všechny změny v aktuálním záznamu lze zrušit před přechodem k jinému záznamu stiskem klávesy Esc.

Změna pořadí sloupců při běhu programu

Při běhu programu může uživatel přemístit sloupec na jiné místo, pokud je vlastnost DragMode mřížky nastavena na hodnotu dmManual. Přetažení sloupce na jiné místo nemění pořadí sloupců ve fyzické tabulce v databázi.

Změně pořadí sloupců lze zabránit nastavením vlastnosti DragMode na hodnotu dmAutomatic.

Zobrazování položek mřížky

Lze ovlivňovat i způsob vykreslení jednotlivých buněk mřížky, které je řízeno vlastností DefaultDrawing. Má-li tato vlastnost hodnotu true, použije Delphi pro zobrazení jednotlivých buněk i zobrazovaných dat implicitní kreslicí procedury. Data jsou tedy zobrazována na základě vlastností DisplayFormatEditFormat příslušného prvku třídy TField připojeného k danému sloupci.

Má-li vlastnost DefaultDrawing hodnotu false, Delphi nekreslí buňky tabulky ani jejich obsah a je třeba dodat vlastní kreslicí procedury zapsané do události OnDrawDataCell dané mřížky.

Událostí při práci s mřížkou

Chování mřížky lze měnit zapsáním kódu do událostí reagujících na konkrétní akce prováděné s mřížkou. Protože mřížka typicky zobrazuje současně více položek i záznamů, vyskytnou se někdy hodně specifické nároky na reakce na změnu jednotlivých sloupců. Příkladem je požadavek blokovat nebo odblokovat tlačítko někde ve formuláři při vstupu do konkrétního sloupce mřížky.

Následující tabulka shrnuje události třídy TDBGrid dostupné Editorem objektů. Využití těchto událostí je poměrně pestré - lze například napsat takovou obsluhu události OnDblClick, která vyvolá zobrazení seznamu hodnot, které lze do daného sloupce zadat. Tato obsluha vyžaduje použití vlastnosti SelectedField k určení aktuálního sloupce a záznamu. Bližší informace o událostech a vlastnostech třídy TDBGrid lze najít v on-line helpu.

VolbaÚčel
OnColEnter Obsahuje činnost při vstupu do sloupce.
OnColExit Obsahuje činnost při opuštění sloupce.
OnDblClick Obsahuje činnost při dvojitém kliknutí na mřížku.
OnDragDrop Obsahuje činnost při přetahování dat uvnitř mřížky.
OnDragOver Obsahuje činnost při přetažení dat mimo mřížku.
OnDrawDataCell Uživatelské kreslení buněk mřížky.
OnEndDrag Obsahuje činnost při ukončení přetahování dat v mřížce.
OnEnter Obsahuje činnost při aktivaci dané mřížky.
OnExit Obsahuje činnost při opuštění mřížky.
OnKeyDown Obsahuje činnost při stisku klávesy nebo kombinace kláves.
OnKeyPress Obsahuje činnost při stisku alfanumerické klávesy.
OnKeyUp Obsahuje činnost při uvolnění klávesy.

Práce se záznamy pomocí třídy TDBNavigator

Třída TDBNavigator poskytuje uživateli jednoduchý prostředek pro řízení pohybu v datové množině a pro manipulaci se záznamy. Navigátor je tvořen posloupností tlačítek, která umožňují pohyb o jeden záznam dopředu nebo dozadu a na první nebo poslední záznam, umožňují vkládat nový záznam nebo modifikovat existující, předávat změny do databáze nebo tyto změny rušit, zrušit záznam a obnovit obsah zobrazovaných záznamů z databáze.

Tlačítka navigátoru popisuje následující tabulka (zleva doprava):

TlačítkoÚčel
První Vyvolá metodu First datové množiny pro nastavení kurzoru na první záznam.
Předcházející Vyvolá metodu Prior datové množiny pro nastavení kurzoru na předcházející záznam.
Další Vyvolá metodu Next datové množiny pro nastavení kurzoru na následující záznam.
Poslední Vyvolá metodu Last datové množiny pro nastavení kurzoru na poslední záznam.
Vlož Vyvolá metodu Insert datové množiny pro vložení nového záznamu před aktuální záznam a převede datovou množinu do stavu "Vkládání".
Zruš Ruší aktuální záznam. Má-li vlastnost ConfirmDelete hodnotu true, je před zrušením záznamu vyžádáno potvrzení.
Oprav Převede datovou množinu do stavu "Editace", takže lze aktuální záznam změnit.
Předej Zapisuje změny provedené v aktuálním záznamu do databáze.
Zpět Ruší změny provedené v aktuálním záznamu a převádí datovou množinu zpět do stavu "Prohlížení".
Obnov Maže zobrazovací paměti ovládacího prvku a obnoví je z datové množiny. Použije se v případě, kdy mohlo dojít ke změně zobrazovaných dat jiným uživatelem.

Potlačení zobrazení tlačítek navigátoru

Při prvním umístění navigátoru do formuláře jsou zobrazena všechna jeho tlačítka. Vlastnost VisibleButtons lze použít k potlačení těch tlačítek, která nechceme ve formuláři používat. Pokud je například formulář určen k prohlížení a nikoliv k editaci, je vhodné potlačit zobrazení tlačítek Oprav, Vlož, Zruš, PředejZpět.

Vlastnost VisibleButtons je v Editoru objektů zobrazena se znaménkem plus (+), což znamená, že ji lze expandovat tak, aby zobrazila logickou hodnotu pro každé z tlačítek navigátoru. Zobrazení a nastavení těchto hodnot zahájíme dvojitým kliknutím na vlastnost VisibleButtons. Znaménko + se změní na znaménko minus (-), což znamená, že dvojitým kliknutím na vlastnost VisibleButtons lze tento seznam opět schovat.

Viditelnost tlačítka je dána logickou hodnotou přiřazenou k tomuto tlačítku. Má-li hodnotu true, tlačítko je v navigátoru zobrazeno. Má-li hodnotu false, tlačítko není v navigátoru obsaženo, ani při tvorbě programu ani při jeho běhu.

Poznámka: Při nastavení na hodnotu false jsou odpovídající tlačítka odstraněna z navigátoru zobrazeného ve formuláři a zbývající tlačítka jsou roztažena tak, aby zaplnila celý prvek. Velikost celého prvku lze potom upravit.

Zobrazení "obláčkové" nápovědy

Navigátor umí zobrazovat "obláčkovou" nápovědu při nastavení kurzoru myši na některé tlačítko navigátoru. Zobrazení nápovědy je řízeno vlastností ShowHint, která je implicitně nastaven na hodnotu false. Pro zobrazení nápovědy nastavíme tuto vlastnost na hodnotu true.

Zobrazení a změna delších textů pomocí třídy TDBMemo

Třída TDBMemo představuje datově vázané prvky -- odvozené ze standardního prvku TMemo -- umožňující zobrazení delších textů i BLOB dat. Prvek třídy TDBMemo zobrazuje víceřádkový text a umožňuje víceřádkový text i zadat. Třídu TDBMemo lze například použít k zobrazení položek typu "Memo" tabulek formátu Dbase nebo Paradox a textových dat uložených v položkách typu BLOB.

Třída TDBMemo implicitně umožňuje uživateli měnit zobrazený text. Vlastnost MaxLength umožňuje omezit maximální počet znaků zapsatelných do dané položky. Pro zamezení vstupu do prvku třídy TDBMemo nastavíme jeho vlastnost ReadOnly na hodnotu true.

Pomocí několika vlastností této třídy lze ovlivnit vzhled prvku a způsob zadávání textu. Pomocí vlastnosti ScrollBars lze doplnit prvek o posuvné lišty. Automatický přechod textu na další řádek lze potlačit nastavením vlastnosti WordWrap na hodnotu false. Nastavením vlastnosti WantTabs na hodnotu true povolíme používání tabulátorů uvnitř textu. Vlastnost Alignement ovlivňuje způsob zarovnávání textu -- možné volby jsou taLeftJustify (implicitní hodnota), taCentertaRightJustify.

Při běhu programu může uživatel kopírovat a přenášet text z a do prvku třídy TDBMemo. Totéž lze provést programově pomocí metod CutToClipboard, CopyToClipboardPasteFromClipboard.

Protože prvky třídy TDBMemo mohou zobrazovat velká množství dat, natažení dat při běhu programu může trvat nezanedbatelnou dobu. Pro urychlení pohybu v databázové tabulce lze použít vlastnost této třídy se jménem AutoDisplay. Má-li tato vlastnost hodnotu false, prvek třídy TDBMemo zobrazuje místo dat pouze jméno položky. Zobrazení dat potom provedeme dvojitým kliknutím na daný prvek.

Poznámka: Prvky třídy TDBMemo generují výjimku, pokud se pokusíme pracovat s položkou obsahující více než 32kB dat nebo pokud data přesáhnou při editaci tuto velikost.

Zobrazení grafických BLOB objektů pomocí třídy TDBImage

Třída TDBImage je třída datově vázaných prvků zobrazujících grafické bitové mapy uložené v položkách typu BLOB. Čtou grafiku z datové množiny a uloží ji ve formátu .DIB systému Windows.

Implicitně umožňuje tato třída, aby uživatel obraz editoval kopírováním a přenášením do a ze schránky nebo dodanými editačními metodami. Totéž lze realizovat programově použitím metod CutToClipboard, CopyToClipboardPasteFromClipboard. Prvek třídy TDBImage lze chránit proti změně nastavením vlastnosti ReadOnly na hodnotu true.

Protože prvky třídy TDBImage mohou zobrazovat velká množství dat, natažení dat při běhu programu může trvat nezanedbatelnou dobu. Pro urychlení pohybu v databázové tabulce lze použít vlastnost této třídy se jménem AutoDisplay. Má-li tato vlastnost hodnotu false, prvek třídy TDBImage zobrazuje místo dat pouze jméno položky. Zobrazení dat potom provedeme dvojitým kliknutím na daný prvek.

Použití menu a rozbalovacích menu

V Delphi existují čtyři datově vázané varianty standardních seznamů. Tyto velmi užitečné prvky umožňují při běhu programu vybrat hodnotu z připraveného seznamu hodnot. Tyto třídy popisuje následující tabulka.

Poznámka: Tyto prvky lze připojit pouze k prvkům třídy TTable. Zdrojem dat nemohou být prvky třídy TQuery.

Jméno třídy Popis
TDBListBox Zobrazuje seznam hodnot, kterými lze aktualizovat příslušnou položku aktuálního záznamu.
TDBComboBox Kombinuje prvek třídy TDBEdit s připojeným seznamem. Uživatel může modifikovat příslušnou položku aktuálního záznamu buď zápisem hodnoty nebo výběrem hodnoty z rozbalovacího menu.
TDBLookupListBox Zobrazuje seznam hodnot, kterými lze aktualizovat příslušnou položku aktuálního záznamu. Seznam je vytvořen na základě hodnot zadané položky jiné datové množiny.
TDBLookupComboBox Kombinuje prvek třídy TDBEdit s rozbalovací verzí prvku třídy TDBLookupListBox. Uživatel může modifikovat příslušnou položku aktuálního záznamu buď zápisem hodnoty nebo výběrem hodnoty z rozbalovacího menu, které je vytvořen na základě hodnot zadané položky jiné datové množiny.

Poznámka: Delphi obsahuje i třídy TDBLookupListTDBLookupCombo. Najdeme je v paletě Win3.1, jsou však v Delphi ponechány jen z důvodů zpětné kompatibility a jejich používání se nedoporučuje. Prvky se liší v některých vlastnostech, pozor proto na případnou záměnu.

Třída TDBComboBox

Prvky třídy TDBComboBox jsou podobné prvkům třídy TDBEdit, s tím rozdílem, že při běhu programu může uživatel "rozbalit" předdefinovaný seznam přípustných hodnot.

Vlastnost Items (typu TStrings) tohoto prvku obsahuje položky obsažené v rozbalovacím seznamu. Hodnoty do tohoto seznamu zadáváme pomocí Editoru seznamu řetězců nebo programově metodami třídy TStrings.

Při běhu programu může uživatel buď vybrat hodnotu ze seznamu (v závislosti na hodnotě vlastnosti Style) nebo (jinou) hodnotu přímo zapsat. Je-li prvek připojen pomocí vlastnosti DataField ke konkrétní položce datové množiny, zobrazuje hodnotu této položky v aktuálním záznamu bez ohledu na to, je-li obsažena v seznamu Items či nikoliv.

Způsob zobrazení seznamu Items při běhu programu je dán následujícími vlastnostmi:

Třída TDBListBox

Třída TDBListBox je funkčně shodná s třídou TDBComboBox, místo rozbalovacího seznamu však trvale zobrazuje seznam možných hodnot. Pokud uživatel vybere hodnotu, je tato hodnota prvku přiřazena. Na rozdíl od prvku TDBComboBox uživatel nemůže zapsat hodnotu, která není uvedena v seznamu.

Při pohybu v datové množině zobrazuje prvek třídy TDBListBox hodnoty v příslušné položce zvýrazněním odpovídající hodnoty v menu. Pokud hodnota z aktuálního záznamu není obsažena v seznamu Items, nezvýrazňuje prvek třídy TDBListBox hodnotu žádnou. Výběr hodnoty vede ke změně hodnoty uložené v databázi a je ekvivalentní zápisu příslušné hodnoty do prvku třídy TDBEdit.

Vlastnost IntegralHeight ovlivňuje způsob zobrazení seznamu. Má-li hodnotu true (implicitní hodnota), spodní okraj seznamu se posune nahoru na spodní okraj poslední položky, která se do prvku vejde celá. Má-li hodnotu false, spodní okraj seznamu je pevně dán hodnotou vlastnosti ItemHeight a spodní položka nemusí být zobrazena celá.

Třída TDBLookupComboBox

Třída TDBLookupComboBox je obdobná třídě TDBComboBox, s tím rozdílem, že seznam hodnot je dynamicky odvozen při běhu programu z druhé datové množiny. Pomocí tohoto prvku lze zajistit, že uživatel zadá do formuláře platnou hodnotu, tím, že mu poskytneme výběr pouze z platných hodnot.

Seznam hodnot prvku třídy TDBLookupComboBox musí být odvozen z jiné datové množiny. Potřebujeme-li zobrazit hodnoty z téže tabulky databáze, umístíme do aplikace druhý prvek třídy TDataSource a druhou datovou množinu a připojíme je ke stejným datům jako je připojena původní tabulka.

Vzhled a funkci prvku třídy TDBLookupComboBox ovlivňují hlavně tři vlastnosti této třídy:

Jako jednoduchý příklad uveďme formulář objednávek, kde je prvek třídy TDBLookupCombo použit k zadání čísla zákazníka, který poslal objednávku. Uživatel může místo toho, aby si pamatoval číslo zákazníka, kliknout na položku seznamu. Zobrazenou hodnotou bude nejspíše jméno nebo název zákazníka.

Vytvoření formuláře sestává z následujících kroků:

  1. Zvolíme "File" | "New Form" pro vytvoření nového formuláře.
  2. Umístíme do formuláře prvek třídy TTable a zadáme jeho vlastnost Name jako "TB_Objednavky", vlastnost DatabaseName jako "FIS", vlastnost TableName jako "OBJEDNAV.DB" a vlastnost Active nastavíme na hodnotu true.
  3. Umístíme do formuláře prvek třídy TDataSource a zadáme do jeho vlastnosti Name hodnotu "DS_Objednavky".
  4. Umístíme do formuláře další prvek třídy TTable a zadáme jeho vlastnost Name jako "TB_Zakaznik", vlastnost DatabaseName jako "FIS", vlastnost TableName jako "ZAKAZNIK.DB" a vlastnost Active nastavíme na hodnotu true.
  5. Umístíme do formuláře další prvek třídy TDataSource a zadáme jeho vlastnost Name jako "DS_Zakaznik".
  6. Umístíme do formuláře prvek třídy TDBGrid a připojíme ho na prvek DS_Objednavky, takže zobrazuje obsah tabulky OBJEDNAV.
  7. Umístíme do formuláře prvek třídy TDBLookupComboBox a zadáme jeho vlastnost DataSource jako "CISLO_ZAK". Vyhledávací seznam je nyní připojen ke sloupci CISLO_ZAK tabulky OBJEDNAV.
  8. Zadáme vyhledávané hodnoty prvku třídy TDBLookupComboBox:
    • Nastavíme vlastnost ListSource na hodnotu "DS_Zakaznik" (tím vyhledáváme v tabulce ZAKAZNIK).
    • Nastavíme vlastnost KeyField na hodnotu "CISLO" (takže získáváme hodnoty položky CISLO).
    • Do vlastnosti ListField zapíšeme hodnotu "Nazev;Adresa" (takže zobrazujeme v menu jméno a adresu zákazníka).

Při běhu programu zobrazuje prvek třídy TDBLookupComboBox menu názvů a adres zákazníků. Vybere-li uživatel zákazníka, prvku je přiřazena hodnota odpovídající číslu zákazníka (CISLO_ZAK). Jakmile uživatel opustí zpracovávanou objednávku v tabulce objednávek, Delphi předá nové číslo zákazníka do příslušného řádku databáze.

Třída TDBLookupListBox

Třída TDBLookupList je funkčně stejná jako třída TDBLookupComboBox, ale seznam možných hodnot zobrazuje trvale. Když si uživatel při běhu programu vybere nějakou položku, prvku je přiřazena odpovídající hodnota. Stejně jako u třídy TDBListBox nelze zapsat hodnotu, která není uvedena v seznamu.

Při pohybu v datové množině zvýrazňuje prvek třídy TDBLookupList položku, která odpovídá hodnotě v aktuálním záznamu. Pokud hodnota z aktuálního záznamu není obsažena v odkazované tabulce, prvek třídy TDBLookupList nezvýrazňuje žádnou položku. Výběr položky vede ke změně hodnoty v odpovídajícím sloupci databázové tabulky a je ekvivalentní zápisu hodnoty do prvku třídy TDBEdit.

Třída TDBCheckBox

Třída TDBCheckBox je datově vázaná varianta standardní třídy TCheckBox. Lze jí použít k zadání hodnot do položek datové množiny. Například formulář faktur může obsahovat volbu, která, je-li zatržena, označuje nárok zákazníka na speciální slevu, a naopak.

Stejně jako ostatní databázové ovládací prvky je prvek třídy TDBCheckBox připojen ke konkrétní položce datové množiny pomocí vlastností DataSourceDataField. Pro zobrazení textu příslušné volby ve formuláři slouží vlastnost Caption.

Pokud je položka datové množiny logického typu, odpovídá hodnota true zaškrtnuté volbě, hodnota false nezaškrtnuté volbě. Pro logické položky nemají řetězce zadané do vlastností ValueCheckedValueUnchecked žádný vliv.

Prvek třídy TDBCheckBox může odpovídat i textové položce. Hodnoty odpovídající zaškrtnuté volbě obsahuje vlastnost ValueChecked, hodnoty odpovídající nezaškrtnuté volbě obsahuje vlastnost ValueUnchecked.

Implicitně je hodnotou vlastnosti ValueChecked hodnota "true", ale může to být kterákoliv jiná textová hodnota odpovídající dané situaci. Vlastnost ValueChecked může obsahovat i seznam více hodnot oddělených středníky. Pokud obsah položky odpovídá kterékoliv položce takového seznamu, je volba zatržena. Hodnota ValueChecked může mít například tvar

     DBCheckBox1.ValueChecked := 'True; Yes; Ano';

Pokud položka aktuálního záznamu obsahuje hodnotu "True", "Yes" nebo "Ano", volba je zatržena. Porovnání řetězců ValuChecked nerozlišuje malá a velká písmena. Pokud uživatel zatrhne volbu, která má vícepoložkovou hodnotu vlastnosti ValueChecked, do databáze je předána první z těchto hodnot.

Obdobně se zachází s hodnotami zadanými do vlastnosti ValueUnchecked.

Prvek třídy TDBCheckBox je blokován, pokud hodnota příslušné položky aktuálního záznamu obsahuje hodnotu, která není uvedena ani ve vlastnosti ValueChecked, ani ve vlastnosti ValueUnchecked.

Třída TDBRadioGroup

Třída TDBRadioGroup je datově vázaná varianta standardní třídy TRadioGroup. Umožňuje nastavit pomocí přepínače jednu z malého počtu možných hodnot dané položky. Přepínač obsahuje jedno tlačítko pro každou z hodnot, kterých může položka nabývat.

Prvek třídy TDBRadioGroup je přiřazen ke konkrétní položce datové množiny pomocí vlastností DataSourceDataField. Pro každý řetězec uvedený v seznamu Items je ve formuláři zobrazeno jedno tlačítko přepínače, přičemž samotný řetězec je zobrazen jako návěští tohoto tlačítka po jeho pravé straně.

Pokud položka aktuálního záznamu přiřazená přepínači odpovídá některému řetězci ve vlastnosti Items, je zvoleno toto odpovídající tlačítko. Máme-li například v seznamu Items tři řetězce "červená", "žlutá" a "modrá" a položka aktuálního záznamu má hodnotu "modrá", potom je navoleno třetí tlačítko přepínače.

Poznámka: Tlačítko může být navoleno i v případě, že položka neodpovídá žádnému z řetězců v seznamu Items, ale odpovídá hodnotě uvedené ve vlastnosti Values. Pokud položka neodpovídá některému řetězci uvedenému ve vlastnostech Items nebo Values, není navoleno žádné tlačítko.

Vlatnost Values může volitelně obsahovat seznam řetězců, které budou vráceny do databáze, pokud uživatel navolí příslušné tlačítko a předá záznam do databáze. Řetězce jsou tlačítkům přiřazeny podle běžného očíslování. První řetězec je přiřazen prvnímu tlačítku, druhý řetězec druhému tlačítku atd. Pokud budeme pokračovat v příkladu se třemi tlačítky označenými "červená", "žlutá" a "modrá" a v seznamu Values jsou uvedeny řetězce "fialová", "žlutá" a "zelená" a pokud uživatel navolí první tlačítko (označené "červená"), Delphi předá do databáze hodnotu "fialová".

Pokud není zadána vlastnost Values, při předání záznamu do databáze je předána hodnota uvedená jako návěští navoleného tlačítka přepínače. Uživatel může změnit hodnotu položky v databázi kliknutím na příslušné tlačítko přepínače. Při přechodu k jinému záznamu předá Delphi odpovídající hodnotu do databáze.