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

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

 

Komponenty v C# - Panelový indikátor

Google       Google       3. 2. 2008       20 411×

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 Nový IT hráč na českém trhu

Nový IT hráč na českém trhu

V roce 2015 otevřela v Praze na Pankráci v budově City Tower své kanceláře společnost EPAM Systems (NYSE:EPAM), jejíž centrála se nachází v USA. Společnost byla založená v roce 1993 a od té doby prošla velkým vývojem a stále roste.

Reklama
Reklama
Obrázek ke článku České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace (CRA) pořádají druhý ročník CRA IoT Hackathonů. Zájemci z řad vývojářů a fanoušků moderních technologií mohou změřit své síly a během jediného dne sestrojit co nejzajímavější funkční prototyp zařízení, které bude komunikovat prostřednictvím sítě LoRa. CRA IoT Hackathony se letos uskuteční ve dvou fázích, na jaře a na podzim, v různých městech České republiky. Jarní běh se odstartuje 31. března v Brně a 7. dubna v Praze.

Obrázek ke článku Cloud computing je využíván stále intenzivněji

Cloud computing je využíván stále intenzivněji

Využívání cloud computingu nabývá na intenzitě. Jen v letošním roce vzroste podle analytiků trh se službami veřejného cloudu o 18 %, přičemž o téměř 37 % vzrostou služby typu IaaS. Růst o více než pětinu pak čeká služby poskytování softwaru formou služby, tedy SaaS. Aktuálním trendům v oblasti využívání cloudu se bude věnovat konference Cloud computing v praxi, která se koná 23. března. 2017 v pražském Kongresovém centru Vavruška na Karlově náměstí 5.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý