Umíme to s Delphi: 81. díl – zajímavé databázové komponenty

V minulých dílech seriálu jsme se zabývali různými aspekty tvorby databázových aplikací. Dnes zůstaneme v „nadplatformní“ rovině; nezačneme se ještě zabývat dalšími databázovými platformami, ale vysvětlíme si několik zajímavých, obecně využitelných databázových komponent, jejichž použití nám nejen pomůže při vytváření uživatelského rozhraní, ale také nám značně usnadní práci např. v situacích, kdy potřebujeme automatizovaný mechanismus pro nahrazení nicneříkajících identifikačních čísel třeba jmény zákazníků.
V předchozích dílech seriálu jsme se seznámili již s řadou databázových komponent, přestože se skoro všechny týkaly přístupu k databázím pomocí BDE. V dnešním dílu se k BDE ještě krátce vrátíme (vysvětlíme si několik málo dalších komponent určených výhradně pro BDE), a pak se budeme zabývat komponentami, které je možné využít bez ohledu na zvolenou platformu.

Krátký návrat k BDE

Kromě komponent Table, Query, StoredProc a DataSource najdeme na paletě DataAccess několik dalších komponent. Vysvětlíme si je jen velmi stručně:

  • Database: jak už bylo uvedeno dříve, Database náleží do vrstvy fyzického připojení k databázi. Při práci s BDE ji ovšem nemusíme používat; pokud ji i přesto použijeme, mělo by to být pouze v situacích, které vyžadují např. stálé (perzistentní) spojení s databází, nestandardní přihlašování k databázi, kontrolu transakcí, případně práci s lokálními (tedy nikoliv napevno nastavenými) databázovými aliasy. Zajímá-li vás, z jakého důvodu není nutné Database použít, vězte, že je to proto, že Delphi v případě absence komponenty Database vytvoří za běhu programu dočasnou instanci třídy Tdatabase (použije v podstatě komponentu Database implicitně) a naplní ji default hodnotmi všech vlastností. Database může výt účelně použita i v případě, kdy se připojujeme opakovaně k téže databázi v několika formulářích. Jak bylo uvedeno, Database se používá i k nastavení lokálního aliasu (tedy aliasu, který se používá pouze v programu). Po nastavení tohoto lokálního aliasu (vlastnost AliasName) se mohou komponenty Table a Query („připíchnuté“ k této databázi) odkazovat na lokální alias databáze. V souvislosti s komponentou Database stojí za to uvést ještě jednu maličkost (také z různých diskusních příspěvků je patrné, že aliasy uživatele BDE skutečně trápí): BDE používá pro přístup k databázím aliasy, které „ukazují“ na některý databázový soubor či adresář. Nové aliasy je možné definovat zupůsobem, který jsme si vyzkoušeli (BDE Administrator), ale kromě toho je možné použít i programový kód. Pokud zavoláme metodu AddStandardAlias a AddAlias globálního objektu Session, můžeme alias vytvořit programově (jen podotýkám, že objekt Session je definován v jednotce DBTABLES, kterou stačí přidat do sekce Uses). Chceme-li definovat alias trvale, zavoláme posléze metodu SaveConfigFile.
  • Session: komponenta Session poskytuje aplikaci globální kontrolu nad databázovými spojeními, a to včetně seznamu stávajících databází a aliasů.
  • BatchMove: používá se pro provádění dávkových operací, jako např. kopírování, připojování, aktualizace nebo mazání hodnot v jedné nebo ve více databázích.
  • UpdateSQL: komponenta umožňuje zapisovat příkazy SQL, jejichž prostřednictvím je možné v databázové komponentě provádět různé aktualizační činnosti za použití read-only dotazu. Tato komponenta je používána jako hodnota vlastnosti UpdateObject tabulek nebo dotazů.

Tolik tedy k BDE. V dalších odstavcích si ukážeme komponenty sloužící především pro vytváření uživatelského rozhraní, tedy komponenty, které lze (lépe či hůře) použít při práci s různými databázovými platformami a komponentami.

Další databázové komponenty

Dejme tomu, že jsme úspěšně vytvořili všechny vrstvy databázové aplikace, které jsou zodpovědné za připojení k databázi a za získání a poskytnutí dat. Zbývá tedy vyřešit uživatelské rozhraní. Pro tento účel disponují Delphi celou řadou výkonných komponent. Každý už asi ví, že tyto komponenty se podobají „normálním“ (ve smyslu „nedatabázovým“) komponentám a jediným rozdílem je, že dokáží pracovat s databázovými údaji (např. DBEdit namísto Edit, DBMemo namísto Memo apod.). Všechny tyto komponenty uživatelského rozhraní se nalézají v záložce DataControls palety komponent.

Všechny níže uvedené komponenty spolupracují s nějakým datovým zdrojem (s nějakou komponentou DataSource), a to s tím, který je definován v jejich vlastnosti DataSource. Některé z komponent se vztahují k celé databázi (typicky DBNavigator), jiné se týkají jen konkrétní položky (DataField). Některé podrobnosti o datových položkách jsou uvedeny v minulém dílu seriálu. Po výběru vlastnosti DataField se v Object Inspectoru zobrazí seznam možných hodnot.

Mřížka – DBGrid

Už víme, že mřížka (DBGrid) dokáže zobrazit celou tabulku najednou, DBGrid jsme použili v několika předchozích příkladech. Protože se jedná o poměrně klíčovou komponentu, uvedeme si dále několik jejích dalších, dosud neprozkoumaných vlastností.

Vlastnosti a chování mřížky můžeme upravovat prostřednictvím vlastnosti Options. Se sloupci mřížky lze manipulovat pomocí vlastnosti Column. Při práci s mřížkou může uživatel vkládat data (stisknutím klávesy Insert), mazat záznamy (stisknutí Ctrl-Del) apod. V rámci vlastnosti Options je možné určit, že mřížka bude/nebude pořád v režimu editace (dgAlwaysShowEditor), že se v záhlaví sloupců budou/nebudou zobrazovat titulky (dbTitles), že se v levém úzkém sloupci bude/nebude zobrazovat indikátor aktuálního záznamu, že se v mřížce budou/nebudou zobrazovat linky mezi sloupci/řádkami, že se otevře/neotevře dialogový box požadující potvrzení výmazu záznamu apod.

Vlastnost Columns je kolekce, v níž si lze zvolit sloupec tabulky, jež se má/nemá v mřížce zobrazovat. Kromě možnosti kontrolovat zobrazená data je výhodou možnost nastavovat pro sloupce jejich vlastnosti (např. písmo, barvu, zarovnání, šířku) apod.

Zajímavou alternativou komponenty DBGrid je komponenta DBCtrlGrid. Jedná se o mřížku s více záznamy, která může obsahovat panely s ostatními databázovými ovládacími prvky. Tyto ovládací prvky se duplikují pro každý záznam databázové komponenty.

Práce s textovými databázovými údaji

Pro zobrazování textových údajů z databáze lze použít některou z následujících komponent:

  • DBText: zobrazuje obsah položky, kterou nesmí uživatel upravovat. Jedná se o databázovou alternativu komponent Label nebo StaticText. Je asi zbytečné dodávat, že vzhledem k tomu, že DBEdit zobrazuje databázové údaje, není možné v době návrhu napsat text, který má být v komponentě DBText zobrazen.
  • DBEdit: umožňuje zobrazení textového údaje, který uživatel smí měnit. DBEdit je alternativou komponenty Edit a setkali jsme se s ní v řadě příkladů v předchozích dílech.
  • DBMemo: umožňuje uživateli prohlížet a ediovat víceřádkové údaje, podobně jako Memo z palety Standard. Na zobrazený text je možné použít pouze jeden druh písma.
  • DBRichEdit: databázová podpora Delphi sahá až tak daleko, že je k dispozici alternativa komponenty RichEdit pro zobrazení formátovaného textu. DBRichEdit je možné použít k zobrazení údajů z databází dBASE a Paradox a k zobrazení textových dat uchovávaných v polích typu BLOB (Binary Large Object Data).

Databázové seznamy

Potřebujeme-li zobrazit seznam různých hodnot, použijeme některou ze seznamových komponent. Stejně jako v „nedatabázových“ aplikacích, i pro databázové jich nabízí Delphi hned několik. Všechny se podobají ve způsobu, jakým uchovávají řetězce určené k zobrazení v seznamu: poskytují vlastnost Items:

  • DBListBox: alternativa klasického seznamu ListBox. Umožňuej výhradně výběr z předem daných položek (uživatel nemůže zadat nový, dosud neexistující údaj).
  • DBComboBox: tento seznam se od DBListBox liší v několika ohledech. Především – je možné zobrazit pouze jednu řádku a rozbalení seznamu provést až na přání. DBComboBox kromě toho umožňuje zadat dosud neexistující (novou) hodnotu – samozřejmě pouze v případě, že to není zakázáno pomocí vlastnosti Style.
  • DBRadioGroup: také tuto komponentu lze zařadit mezi „seznamové“ komponenty, neboť s její pomocí lze zobrazit několik položek a dát uživateli možnost vybrat jednu z nich. Databázová verze komponenty RadioGroup obsahuje také zajímavou možnost ukládat do databáze jiné údaje než ty, které jsou zobrazené jako popisky tlačítek (a to bez nutnosti řešit tento úkol programově): stačí vhodně nastavit tzv. mapování položek. A jak DBRadioGroup funguje? Po jeho vložení na formulář je nutné nastavit vlastnost DataSource a DataField. Popisky, které hodláme zobrazit vedle tlačítek, zadáme pomocí známého editoru do vlastnosti Items. Hodnoty, které mají být ukládány do databáze do daného datového pole, zadáme do vlastnosti Values. Od toho okamžiku, jakmile uživatel za běhu zvolí některou možnost (vybere některé tlačítko), bude do databáze uložena hodnota, která je ve vlastnosti Values na stejné pozici, jako popisek daného tlačítka ve vlastnosti Items. Příklad: dejme tomu, že máme vlastnost Items obsahující následující tři řetězce: “jedna”, “dva”, “tři”. Dále máme vlastnost Values, která obsahuje následující tři řetězce: “a”, “b”, “c”. Vlastnost DataField je nastavena na sloupec jmenující se např. “odpověď”. Za běhu se vedle tlačítek objeví popisky „jedna“, „dva“, „tři“, což je dáno vlastností Items. Pokud uživatel vybere třeba tlačítko „dva“, bude do aktuálního záznamu do sloupce „odpověď“ uložena hodnota „b“. Dodejme, že pokud nejsou specifikovány žádné hodnoty (prázdná vlastnost Values), jsou ukládány do databáze přípo popisky (vlastnost Items).

Zaškrtávací pole

Další zajímavou komponentou je DBCheckBox. Ten se používá k zobrazení (a přepínání) volby odpovídající logické hodnotě. Má tedy dcě možné hodnoty (štíhlá: ano, ne), případně neurčitý stav. Podobně jako RadioGroup umožňuje zvolit hodnoty, které se mají posílat do databáze při zvolení jednotlivých přepínacích tlačítek, I DBCheckBox umožňuje stanovit, které hodnoty se ukládají do databáze při zaškrtnutém, resp. nezaškrtnutém políčku. Tyto hodnoty se nastavují pomocí vlastností ValueChecked, resp. ValueUnchecked.

Ovládací prvky pro vyhledávání

Pokud potřebujeme pro určitou položku zvolit záznam z jiné databázové komponenty, použijeme tzv. vyhledávací seznamové komponenty – DBLookupListBox, resp. DBLookupComboBox.

Dejme např. tomu, že vytvoříme objednávkovou aplikaci se standardním formulářem pro přijímání objednávek. Objednávka je svázána s tabulkou OrdersTable, která obsahuje jako jedno z polí číslo zákazníka, jenž objednávku odeslal. OrdersTable neobsahuje žádné jiné informace než číslo zákazníka. Dále máme tabulku CustomerTable, která obsahuje kromě čísla zákazníka řadu dalších údajů o něm, např. jméno, firmu, adresu, apod. Jistě by bylo pohodlné umožnit obchodníkovi při tvorbě faktury zvolit zákazníka podle jeho jména nebo firmy, nikoliv podle nicneříkajícícho čísla zákazníka. Díky komponentě DBLookupListBox nebo DBLookupComboBox je řešení tohoto problému nepříliš obtížné.

Tyto komponenty se totiž dají připojit ke dvěma datovým zdrojům současně. Jeden zdroj přitom obsahuje aktuální (sktečná) data, druhý pak obsahuje data, jež se zobrazují. Komponenty disponují následujícími vlastnostmi (vybíráme jen ty klíčové):

  • DataSource: zdroj skutečných dat
  • DataField: klasická vlastnost určující datovou položku z DataSource, které se komponenta “týká”
  • ListSource: druhý datový zdroj, který obsahuje data určená k zobrazování v seznamu
  • KeyField: identifikuje pole (položku) v ListSource, která musí odpovídat hodnotě pole specifikovaného DataField
  • ListField: identifikuje položku (nebo více položek oddělených středníkem), jejichž hodnoty se zobrazují v komponentě DBLookupComboBox nebo DBLookupListBox.

Ukážeme si ještě naplnění těchto vlastností daty a vysvětlíme si výsledek. Příklad:

  • DataField = CustNo
  • DataSource = DataSourceOrders
  • KeyField = CustNo
  • ListField = Company
  • ListSource = DataSourceCustomer

Výsledkem tohoto rozložení vlastností bude, že skutečná data budou získávána z datového zdroje DataSourceOrders. V seznamu bychom chtěli zobrazovat pole CustNo, ale nelíbí se nám, proto jej nahradíme polem Company z datového zdroje DataSourceCustomer. Komponenta tedy sama zajistí “zjištění” odpovídajícího jména organizace a vypíše jej v seznamu namísto čísla zákazníka.

Na závěr

Dnešní díl byl sice poněkud teoretický, nicméně v důsledku toho bylo možné popsat mnoho komponent, přičemž některé z nich nám mohou značně usnadnit práci (viz poslední dvě – DBLookupListBox, DBLookupComboBox).

Diskuze (1) Další článek: Celeron 2,4 GHz již v Japonsku

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,