Komponenty v C# - Panelový indikátor
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

Komponenty v C# - Panelový indikátorKomponenty v C# - Panelový indikátor

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno

Komponenty v C# - Panelový indikátor

Google       Google       3. 2. 2008       21 929×

V nedávné době jsem potřeboval pro jednu aplikaci zobrazit stav zařízení podobně jako na průmyslových kartách. Připadalo mi nepraktické vytvářet pro každý indikátor sadu standardních komponentů, takže jsem si vyzkoušel, jak se vytváří komponenta uživatelská.

Reklama
Reklama

Úvod

Visual Studio 2005 (dále jen VS) nabízí výborné nástroje, jak si zpříjemnit programování. Jedním z nich je i nástroj pro vytváření komponent a ovládacích prvků (souhrnně, i když nesprávně, je budu nazývat komponentou). Následující řádky mohou být shrnutím informací, které lze po pár hodinách obdržet na internetové databázi MSDN.

Vytvoření komponenty

Při vytváření projektu ve VS se nám nabízí hned několik možností, od klasických oken, přes třídy až po komponenty. Vizuální prvky zastřešuje přednastavený projekt User Control, zvolíme tedy název projektu a necháme vytvořit základ pro naši komponentu. Tím je obdélníková oblast, která umožňuje vkládání standardních ovládacích prvků z toolboxu.

Abyste měli představu, o co se jedná, na následujícím obrázku je prvek, který jsem si vytvořil:

Podobně jako v projektech Windows Forms přidáme požadované standardní prvky, upravíme jejich rozmístění a základní vlastnosti a potom v kódu vytvoříme rozhraní naší komponenty tak, aby se dalo přistupovat k jejím vlastnostem (případně událostem) tak, jak jsme zvyklí u standardních ovládacích prvků.

Pro projekt panelového indikátoru jsem vybral název poněkud zastaralejšího rázu – SignalLamp, ale svým způsobem vystihuje použití. Požadavkem na komponentu je obrázek napodobující krytku žárovky, který mění barvu podle nastaveného stavu a text zobrazující krátký popis zobrazovaného stavu.

Použitými standardními prvky je tedy PictureBox a Textbox, nebo lépe Label. Na MSDN najdete spoustu doporučení, jak zlepšit chování vašich aplikací a komponent, např. využívání TableLayoutPanel kvůli pozdější změně velikosti komponent ať už při návrhu aplikace, nebo za běhu. Další vhodnou pomůckou může být ImageList, který poskytuje správu kolekcí obrázků a pro práci s PictureBoxem se výborně hodí.

Následující obrázek ukazuje, jak komponenta může vypadat. Základem je tabulka TableLayoutPanel, PictureBox a Label. Tabulka má nastavenou poměrnou šířku sloupců v procentech, kvůli případné změně velikosti. Samozřejmě jsem nastavil parametry PictureBoxu i Labelu tak, aby vyplnili každý svou buňku tabulky (vlastnost Dock, hodnota Fill). Pokud se vám stane, že prvek Label není zarovnán vhodně, pohrajte si s vlastností Anchor, bez problémů se chová nastavení pouze na Left. Stejně jako TableLayoutPanel poslouží i SplitContainer (obrázek).

Další práce spočívá v naplnění prvku ImageList skutečnými obrázky. Tu nastupuje práce grafika a jeho schopnosti napodobit vzhled žárovky nebo diody. Lepší je hned na začátku vytvořit více barevných variant, aby se později dala komponenta využít i v dalších aplikacích se specifickými požadavky.

Vlastnosti

Posledním, ale zato nejdůležitějším úkolem je vytvoření rozhraní. Je zřejmé, že hlavním parametrem bude barva žárovky, dalším bude text popisu. Další parametry nejsou potřeba, i když to už závisí na dalších vylepšeních komponenty, např. blikání žárovky s určitou frekvencí, zobrazení ToolTipu, apod.

Pokud programujete v C#, bude vám blízký následující kód pro vytvoření vlastnosti (property):

[Category("Text"), Bindable(true), Description("Label text")]
        public string Label
        {
            set
            {
                label1.Text = value;
                this.Invalidate();
            }
            get
            {
                return label1.Text;
            }
        }

Od klasického zápisu pro vlastnost má tento zápis pár odlišností. Hned první je uvedení atributů těsně před deklarací vlastnosti. Atributy nejsou nezbytné, ale je vhodné je nastavit, zejména kvůli pozdější práci s komponentou v Návrháři VS. Základní atributy jsou uvedeny v příkladu: parametr atributu Category je název kategorie v seznamu vlastností (Properties), Bindable předává parametr o propojitelnosti s datovými zdroji, Description udává základní popis vlastnosti v seznamu vlastností. Na MSDN lze nalézt ještě další atributy, např. pro automatické vytvoření události reagující na změnu vlastnosti, atp. Výsledek uvidíte až při použití komponenty v nové aplikaci a vypadá následovně:

Důležitým prvkem vlastnosti, která má co do činění se vzhledem komponenty, je uvedení this.Invalidate() do těla metody pro nastavení hodnoty. To zabezpečí, že změna hodnoty vlastnosti se projeví okamžitě po změně. Jinak by se změna vlastnosti projevila až při dalším překreslení nadřazené oblasti (např. okna). Samozřejmě je možné do této metody přidat ověření hodnoty, např. délku řetězce, znaky apod., ale nezapomínejte, že jakékoliv omezení může být později na závadu, a to v době, kdy už se nebudete chtít (nebo moci) ke kódu komponenty vrátit.

Pokud jsem se zmínil o vlastnostech, musím připomenout jednu důležitou věc: vlastnost není datová položka!

Data se nemohou ukládat do vlastnosti, vlastnost poskytuje pouze rozhraní pro jinou datovou položku.

V příkladu je datovou položkou label1.Text, tedy řetězec textu textového pole. Pokud vytváříte vlastnost, ujistěte se, že pro ni máte datovou položku. V případě že ne, vytvořte ji jako soukromou, přístup k ní budou poskytovat právě metody vaší vlastnosti.

Naznačím ještě možné řešení změny barvy indikátoru. Nejvhodnější mi připadalo vytvořit veřejný enumerátor, který bude obsahovat všechny dostupné barvy. Pomocí enumerátoru pak elegantně můžu měnit barvu indikátoru v aplikaci bez toho, abych si musel pamatovat použitelné barvy. Kód pro vlastnost barvy indikátoru může vypadat následovně:

public enum LampColorEnum { Red, Green, Blue, Yellow, Pink, Orange, Violet, Black, Gray, White, BlinkRed }
private LampColorEnum lampColorValue;
[Description("Main lamp status - color"),Category("Behavior")]
        public LampColorEnum LampColor                                           
        {
            set 
            {
                lampColorValue = value;
                switch(lampColorValue)
                {
                    case LampColorEnum.Red:
                        pictureBox1.Image = imageList1.Images[1];
                        break;
                    case LampColorEnum.Green:
                        pictureBox1.Image = imageList1.Images[2];
                        break;
                    case LampColorEnum.Blue:
                        pictureBox1.Image = imageList1.Images[3];
                        break;
                    case LampColorEnum.Yellow:
                        pictureBox1.Image = imageList1.Images[4];
                        break;
                    case LampColorEnum.Pink:
                        pictureBox1.Image = imageList1.Images[5];
                        break;
                    case LampColorEnum.Orange:
                        pictureBox1.Image = imageList1.Images[6];
                        break;
                    case LampColorEnum.Violet:
                        pictureBox1.Image = imageList1.Images[7];
                        break;
                    case LampColorEnum.Black:
                        pictureBox1.Image = imageList1.Images[8];
                        break;
                    case LampColorEnum.Gray:
                        pictureBox1.Image = imageList1.Images[9];
                        break;
                    case LampColorEnum.White:
                        pictureBox1.Image = imageList1.Images[0];
                        break;
                    default:
                        break;
                }
                this.Invalidate();
            }
            get { return lampColorValue; }
        }

Nebudu uvádět celý kód, ale na vyzkoušení vám zde nechávám komponentu ke stažení. Lze si vyzkoušet chování komponenty při návrhu, nastavení vlastností apod. Závěrem tohoto článku vás chci popohnat k vytváření vlastních komponent, protože později při návrhu aplikací vám to ušetří práci. Jak jste viděli, žádná věda to není a i amatér jako já to zvládne. Výsledek potom může vypadat následovně:

Link na komponentu ke stažení: SignalLamp.dll

Na závěr ještě malá nápověda na MSDN:

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Ing. Matěj PáchaAutor je studentem doktorského studia na Elektrotechnické fakultě Žilinské univerzity, obor Elektrická trakce. Mezi koníčky patří hudba a hra na baskytaru.
Web    

Nové články

Obrázek ke článku NVIDIA shrnuje přehled novinek na E3 2018

NVIDIA shrnuje přehled novinek na E3 2018

Společnost NVIDIA si u příležitosti E3 2018 připravila řadu novinek, které uvádí v kompletním přehledu, Například nové hry s podporou NVIDIA Highlights, která je součástí aplikace GeForce Experience, i nadále nabírá na obrátkách. Kromě výše zmíněné Shadow of the Tomb Raider získaly podporu také hry Dirty Bomb a Switchblade.

Reklama
Reklama
Obrázek ke článku SODAT vidí budoucnost datové bezpečnosti ve strojovém učení

SODAT vidí budoucnost datové bezpečnosti ve strojovém učení

Firmy chrání svá citlivá data často nedostatečně. Podle průzkumu společnosti SODAT se v minulém roce setkalo až 80 % z nich s bezpečnostním incidentem ztráty nebo úniku dat. Jedna z pilotních firem, která testovala novou verzi řešení SODAT Protection & Analytics 2.0pro bezpečností analýzu a monitoring dat díky novince zjistila, kdo z disku smazal důležité výkresy a mohla na incident včas reagovat.

Obrázek ke článku Kontrolujete pracovní emaily i na dovolené? 7 tipů odborníka, jak nepřijít o data

Kontrolujete pracovní emaily i na dovolené? 7 tipů odborníka, jak nepřijít o data

Letní měsíce jsou pro většinu zaměstnanců spojené s každoroční dovolenou. Z údajů Českého statistického úřadu vyplývá, že v roce 2017 podnikli Češi přes 13 milionů delších cest (tzn. s více než čtyřmi noclehy). Přitom právě na období července, srpna a září připadá více než 7,5 milionů z nich. Nicméně tradiční představu o dovolené jako o čase, kdy má práci na starost někdo jiný, Češi boří. 

Obrázek ke článku 10 SEO mýtů, které už nemusíte v roce 2018 řešit

10 SEO mýtů, které už nemusíte v roce 2018 řešit

„Kolik má být na stránce klíčových slov?“, „Nemáš vyplněný meta tag keywords, to nebude fungovat.“, „Katalogy jsou mrtvý“. Také jste už slyšeli některé z těchto otázek? Pojďme si na ně konečně jednou provždy odpovědět.

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032018 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý