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 830×

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 Firmy musejí s nástupem Průmyslu 4.0 více dbát na kyberbezpečnost. V ohrožení je i jejich know-how.

Firmy musejí s nástupem Průmyslu 4.0 více dbát na kyberbezpečnost. V ohrožení je i jejich know-how.

Destabilizace firmy či ukradené know-how. To jsou možná hlavní budoucí rizika spojená s nedostatečnou kybernetickou bezpečností průmyslových firem, na která upozorňují experti. Vzhledem k postupující digitalizaci výrobních či technologických procesů a přechodu k takzvanému Průmyslu 4.0 může těchto hrozeb postupně přibývat. Varují před nimi i nejnovější průzkumy. 

Reklama
Reklama
Obrázek ke článku Nový CEBIT je připraven: Pochopit digitální dnešek a objevit digitální zítřek

Nový CEBIT je připraven: Pochopit digitální dnešek a objevit digitální zítřek

Nový veletrh  CEBIT je připraven. V polovině června začne v Hannoveru evropský festival obchodu s radikálně změněnou koncepcí věnovaný inovacím a digitalizaci.  CEBIT jedinečnou formou spojuje obchod v digitálním hospodářství 
s festivalovými prvky a posouvá do středu pozornosti téma digitální transformace hospodářství a společnosti.  

Obrázek ke článku Black Swan Security Congress ukáže, jak se chránit před největšími hrozbami na internetu

Black Swan Security Congress ukáže, jak se chránit před největšími hrozbami na internetu

Dva dny plné přednášek a diskusí na téma často podceňovaných bezpečnostních rizik na internetu pořádá Paralelní polis v pražských Holešovicích. Akce s názvem Black Swan Security Congress bude od pátku 18. do soboty 19. května hostit etické hackery a experty na IT bezpečnost převážně z Česka a Slovenska. Ti účastníkům vysvětlí, jaká rizika nese fenomén „černé labutě a jak se před ním mohou chránit.

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