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

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

Komponenty v C# - Panelový indikátor

Google       Google       3. 2. 2008       23 674×

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 Konference: Moderní informační systémy podporují automatizaci

Konference: Moderní informační systémy podporují automatizaci

Současná situace v šíření onemocnění Covid-19 klade na řadu firem nové nároky a mnohé z nich jsou nyní více než kdy jindy závislé na nejmodernějších informačních technologiích. Proto i v oblasti podnikových informačních systémů vidíme rostoucí důraz na automatizaci nebo na důslednou integraci. Také o těchto trendech se bude mluvit na konferenci Firemní informační systémy, která se koná 24.9.2020 v pražském Kongresovém centru Vavruška na Karlově náměstí.

Reklama
Reklama
Obrázek ke článku Nebezpečí ukrytá v USB: z nuly na škvarek za pět sekund

Nebezpečí ukrytá v USB: z nuly na škvarek za pět sekund

Za cenu šesti dolarů lze celkem bez obtíží koupit nový, líbivě vyhlížející flash disk. Přidaná hodnota, které se vám spolu s ním dostane, už tak moc líbivá není. To, co se před pár sekundami tvářilo jako externí disk, se po připojení k počítači změní v důmyslné elektrické křeslo, které vaše zařízení v onen příslovečný škvarek promění za pár sekund. Cílovou skupinou pro koupi takových zařízení by mohli být záškodníci, kteří by tímto způsobem osnovali pomstu třeba vůči záletnému partnerovi. 

Obrázek ke článku Znalosti, dovednosti i prestižní titul MBA: Jde to i moderně a online

Znalosti, dovednosti i prestižní titul MBA: Jde to i moderně a online

Snad nikdy není špatná příležitost na investici do hodnotného vzdělání. Obzvlášť v případě, že absolvent dovede teoretické poznatky přetavit v praktické dovednosti, využitelné při řešení problémů i v komunikaci. Právě na to se specializuje studijní program MBA Řízení informačních technologií, vyučovaný na Business Institutu.

Obrázek ke článku Coding Bootcamp Praha: Obor IT krize nepoznamenala, žádaní jsou weboví vývojáři

Coding Bootcamp Praha: Obor IT krize nepoznamenala, žádaní jsou weboví vývojáři

Pandemie Covid-19 otřásla trhem práce v základech. Dopady krize pocítilo celkově až 45 % zaměstnanců. Není divu, že čím dál větší jistotu přináší obor IT. Ten zůstal krizí téměř nepoznamenán a při nutnosti začít dělat věci na dálku se ještě více ukázalo, jak moc mnohé firmy kvalitní IT potřebují. Do IT nyní přicházejí začátečníci, kteří v něm vidí lukrativní budoucnost a jistotu, ale i freelanceři a zaměstnanci z oborů zasažených krizí

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