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

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

 

Komponenty v C# - Panelový indikátor

Google       Google       3. 2. 2008       25 783×

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á.

Ú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 Stavebnice umělé inteligence 1

Stavebnice umělé inteligence 1

Článek popisuje první část stavebnice umělé inteligence. Obsahuje lineární a plošnou optimalizaci.  Demo verzi je možné použít pro výuku i zájmovou činnost. Profesionální verze je určena pro vývojáře, kteří chtějí integrovat popsané moduly do svých systémů.

Obrázek ke článku Hybridní inteligentní systémy 2

Hybridní inteligentní systémy 2

V technické praxi využíváme často kombinaci různých disciplín umělé inteligence a klasických výpočtů. Takovým systémům říkáme hybridní systémy. V tomto článku se zmíním o určitém typu hybridního systému, který je užitečný ve velmi složitých výrobních procesech.

Obrázek ke článku Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Vedení týmu v oboru informačních technologií se nijak zvlášť neliší od jiných oborů. Přesto však IT manažeři čelí výzvě v podobě velmi rychlého rozvoje a tím i rostoucími nároky na své lidi. Udržet pozornost, motivaci a efektivitu týmu vyžaduje opravdu pevné manažerské základy a zároveň otevřenost a flexibilitu pro stále nové výzvy.

Obrázek ke článku Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Za poslední rok se podoba práce zaměstnanců změnila k nepoznání. Především plošné zavedení home office, které mělo být zpočátku jen dočasným opatřením, je pro mnohé už více než rok každodenní realitou. Co ale dělat, když se při práci z domova ztrácí motivace, zaměstnanci přestávají komunikovat a dříve fungující tým se rozpadá na skupinu solitérů? Odborníci na personalistiku dali dohromady několik rad, jak udržet tým v chodu, i když pracovní podmínky nejsou ideální.

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