PHP týden PHP týden
Pouze tento týden až 80% sleva na PHP, Nette, Symfony!
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací

Jednoduchá C# kalkulačka v okně

C# .NET Formuláře Windows Forms Jednoduchá C# kalkulačka v okně

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V tomto tutoriálu vytvoříme jednoduchou kalkulačku ve Windows Forms Application.

Jelikož je tento tutoriál pro nováčky, začneme se správným vytvořením nového projektu a nastavením věcí, které budeme potřebovat. Jdeme na to! Po spuštění Visual Studia klikneme na tlačítko vytvořit nový projekt, tam zvolíme Windows Forms Application a dole v okně zadáme název, jak by se měl projekt jmenovat a potvrdíme. Vytvoří se nám nový projekt. Dále v ilustračním obrázku je ukázáno, jak by to mělo vypadat.

Rozložení Visual studia

Kdyby Vám chyběl panel Toolbox, který se nachází vlevo na obrazovce, tak si ho můžete aktivovat nahoře v záložce View. Dále můžeme vidět, že vpravo nahoře v panelu Solution Explorer se nám vytvořila stromová architektura projektu. Dále velice často budeme používat panel Properties, kde jsou nastavení grafických prvků, které budeme přidávat do programu. Kdyby Vám též chyběl, tak si ho aktivujte v záložce View.

Začneme tím, že si vytvoříme vizuální stránku naší kalkulačky. Okno s designovou (vizuální) částí projektu vidíte uprostřed. Je tam už vytvořené prázdné pouzdro našeho programu. Po jednom kliknutí na toto pouzdro se nám zaktivuje panel Properties (vpravo dole), kde nastavujeme a upravujeme jeho vlastnosti. Ty vlastnosti tady nebudu vyjmenovávat, protože je jich poměrně dost, ale měli byste si je projet, abyste věděli, co všechno je možné nastavit. My využijeme jen nastavení Text: kalkulačka , Size: kde určíme rozměry našeho pouzdra a Name:kalkulacka.

Velice zdůrazňuji, že je důležité si pojmenovávat všechny vkládané prvky nějak rozumně. Poslouží to k lepší orientaci, která je v kódu nesmírně důležitá.

Dále do pouzdra přidáme z Toolboxu prvek Textbox, a jeho Name v Properties nastavíme na Name: zadaniTextBox. Také nezapomeneme nastavit Enabled: na False. Je to proto, abychom do toho okna nemohli vpisovat nějaký text. V tomhle kroku, kdo zná trochu ty prvky, může namítnou, proč nepoužijeme prvek Label. Samozřejmě i to je možnost, ale zvolil jsem variantu s Textboxem.

Samozřejmě každá kalkulačka musí obsahovat tlačítka. Ty přidáme obdobným způsobem jako Textbox, akorát tentokrát zvolíme prvek Button a každému nastavíme Text: podle tlačítka.

Ve finále by mohla vizuální stránka programu vypadat například takto:

Ukázka formuláře

Umístění prvků v pouzdře můžeme samozřejmě nastavit jednoduchým ovládáním pomoci myši. Stejně tak jako velikost a tvar (to však jde i v těch Properties jednotlivých prvků).

Teď přejdeme z vizuální stránky do kódové stránky. Uděláme to jednodušše tak, že dvakrát klikneme na naše pouzdro. Automaticky se nám otevře soubor: Form1.cs, kde se nám vytvořil počáteční kód.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class kalkulacka : Form
    {
        public kalkulacka()
        {
            InitializeComponent();
        }

        private void kalkulacka_Load(object sender, EventArgs e)
        {

        }


    }
}

Každý vložený prvek v pouzdře má svoji metodu. V metodě kalkulačka (což je právě to naše pouzdro) definujeme náš Textbox.

public kalkulacka()
{
    InitializeComponent();
    zadaniTextBox.Text = "0";
}

Znamená to, že když náš program se spustí, tak výchozí text v TextBoxu bude "0". Dále definujeme pár proměnných, s kterýma budeme v průběhu pracovat. Pozor!!! Tyto proměnné musí být vně z metody kalkulačka. Takže je jednodušše umístěte pod tělo metody.

int cislo1;
int cislo2;
string funkce;
int c = 0;

Budeme se přepínat mezi vizuální stránkou (dále jen vizuál) a kódovou stránkou (dále jen kód). Ve vizuální vždycky klikneme na prvek a tím se nám v kódu vytvoří automaticky metoda daného prvku.

Takže nyní se vrátíme do vizuálu, kde dvakrát klikneme na prvek: tlačítko 0, automaticky se nám vytvoří v kódu další metoda. Definujeme ji takto:

private void button0_Click(object sender, EventArgs e)
       {
           if (zadaniTextBox.Text != "0")
           {
               zadaniTextBox.Text = zadaniTextBox.Text + ((Button)sender).Text;
           }
           else
           {
               zadaniTextBox.Text = ((Button)sender).Text;
           }
       }

Jak funguje If a Else už jistě víte. Pokud ne, projeďte si předchozí tutoriál C# Kalkulačka v Console verzi. Co je zadání TextBox to víme také, to je prvek TextBox ve vizuálu. Lidsky: když text (obsah) prvku zadání TextBox se nebude rovnat "0", to znamená, že bude vypadat například "10", tak se k tomu textu (obsahu) přidá ((Button)sender)­.Text. To znamená, že se tam vloží Text tlačítka, které zmáčknete. A pokud obsah TextBoxu je "0", to znamená, že je ve výchozí pozici a tím pádem víme, že obsah je prázdný. Můžeme vložit první číslo.

Příklad: zapneme program (mimochodem program se spouští F5), tak uvidíme, že v TextBoxu je napsáno 0, tím pádem po zmáčknutí tlačíka s cifrou např. 5, nula se přepíše. Pokud zmáčkneme zase tlačítko 5, tak se to podívá na obsah TextBoxu a zjistí, že tam není nula, ale pětka a jenom přidá za ní další pětku. Tím pádem vidíme, že metoda pro tlačítko 0 se stává metodou pro každé tlačítko 0-9. (Určitě se ptáte, jak to, že tlačítka od 1-9 nevyužívají svoje metody? Je to jednoduché, protože jim bylo nastaveno ať využívají metodu tlačítka 0.)

Nastavení click události

Nastaví se to v Properties každého tlačítka (nahoře v tom panelu je malý blesk, po zmáčknutí se Vám objeví seznam, kde vyberete CLICK: kde vyberete jakou metodu má to tlačítko využívat).

Dále vyřešíme metody funkcí jako je (+, -, *, /). Jednodušše zase klikneme na tlačítka ve vizuálu a ono nám ty metody vytvoří samo.

private void plusButton_Click(object sender, EventArgs e)
{
    cislo1 = int.Parse(zadaniTextBox.Text);
    zadaniTextBox.Text = "0";
    funkce = "scitani";
}

private void minusButton_Click(object sender, EventArgs e)
{
    cislo1 = int.Parse(zadaniTextBox.Text);
    zadaniTextBox.Text = "0";
    funkce = "odcitani";
}

private void nasobeniButton_Click(object sender, EventArgs e)
{
    cislo1 = int.Parse(zadaniTextBox.Text);
    zadaniTextBox.Text = "0";
    funkce = "nasobeni";
}

private void deleniButton_Click(object sender, EventArgs e)
{
    cislo1 = int.Parse(zadaniTextBox.Text);
    zadaniTextBox.Text = "0";
    funkce = "deleni";
}

Každá metoda uloží do proměnné cislo1 obsah textboxu a poté ho resetuje, aby bylo možné zadat další číslo. Přitom přidá proměnné funkce nějakou hodnotu (sčítání/odčí­tání/násobení/dě­lení).

Znova doporučuji, abyste používali Name tlačítek a tudíž i metod, tak aby dávaly smysl.

private void rovnaseButton_Click(object sender, EventArgs e)
{
    cislo2 = int.Parse(zadaniTextBox.Text);

    if (funkce == "scitani")
    {
        c = cislo1 + cislo2;
    }
    else if (funkce == "odcitani")
    {
        c = cislo1 - cislo2;
    }
    else if (funkce == "nasobeni")
    {
        c = cislo1 * cislo2;
    }
    else if (funkce == "deleni")
    {
        c = cislo1 / cislo2;
    }

    zadaniTextBox.Text = c.ToString();
    funkce = "";
}

Metoda tlačítka "rovná se" zase přidává do proměnné cislo2 aktuální obsah TextBoxu. Dále rozpoznává podmínku o jakou funkci se jedná a následně provádí výpočty, které se ukládají do proměnné c. Poté je c vypisováno do TextBoxu (pro nás je to už výsledek příkladu).

Nesměji samozřejmě chybět metody, které budou zajišťovat tlačítka C a CE.

private void smazatVseButton_Click(object sender, EventArgs e)
{
    zadaniTextBox.Text = "0";
    funkce = "";
}

private void smazatButton_Click(object sender, EventArgs e)
{
    zadaniTextBox.Text = "0";
}

Metoda SmazatVse smaže celý příklad, zatímco metoda Smazat smaže jen aktuální obsah TextBoxu.

Celkový kód vypadá následovně:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace kalkulacka
{
    public partial class kalkulacka : Form
    {
        public kalkulacka()
        {
            InitializeComponent();
            zadaniTextBox.Text = "0";
        }

        int cislo1;
        int cislo2;
        string funkce;
        int c = 0;

        private void button0_Click(object sender, EventArgs e)
        {
            if (zadaniTextBox.Text != "0")
            {
                zadaniTextBox.Text = zadaniTextBox.Text + ((Button)sender).Text;
            }
            else
            {
                zadaniTextBox.Text = ((Button)sender).Text;
            }
        }

        private void plusButton_Click(object sender, EventArgs e)
        {
            cislo1 = int.Parse(zadaniTextBox.Text);
            zadaniTextBox.Text = "0";
            funkce = "scitani";
        }

        private void minusButton_Click(object sender, EventArgs e)
        {
            cislo1 = int.Parse(zadaniTextBox.Text);
            zadaniTextBox.Text = "0";
            funkce = "odcitani";
        }

        private void nasobeniButton_Click(object sender, EventArgs e)
        {
            cislo1 = int.Parse(zadaniTextBox.Text);
            zadaniTextBox.Text = "0";
            funkce = "nasobeni";
        }

        private void deleniButton_Click(object sender, EventArgs e)
        {
            cislo1 = int.Parse(zadaniTextBox.Text);
            zadaniTextBox.Text = "0";
            funkce = "deleni";
        }

        private void rovnaseButton_Click(object sender, EventArgs e)
        {
            cislo2 = int.Parse(zadaniTextBox.Text);

            if (funkce == "scitani")
            {
                c = cislo1 + cislo2;
            }
            else if (funkce == "odcitani")
            {
                c = cislo1 - cislo2;
            }
            else if (funkce == "nasobeni")
            {
                c = cislo1 * cislo2;
            }
            else if (funkce == "deleni")
            {
                c = cislo1 / cislo2;
            }

            zadaniTextBox.Text = c.ToString();
            funkce = "";
        }

        private void smazatVseButton_Click(object sender, EventArgs e)
        {
            zadaniTextBox.Text = "0";
            funkce = "";
        }

        private void smazatButton_Click(object sender, EventArgs e)
        {
            zadaniTextBox.Text = "0";
        }




    }
}

A to je vše :)


 

Stáhnout

Staženo 2775x (45.54 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal joker.a
Avatar
Jak se ti líbí článek?
16 hlasů
Aktivity (1)

 

 

Komentáře
Zobrazit starší komentáře (34)

Avatar
David Dostal
Redaktor
Avatar
David Dostal:22.2.2018 15:13

Metody Remove a Insert na stringu řetězec přímo neupraví, ale vrátí nový upravený řetězec.
Je tedy třeba výsledek znovu přiřadit, například něco ve smyslu

zadanitextBox.Text = zadanitextBox.Text.Remove(0, 1);
zadanitextBox.Text = zadanitextBox.Text.Insert(0,"-");

Mimochodem pokud vím, tak TextBox.Text už je string, takže volat .ToString() je trochu zbytečné.

 
Odpovědět  +1 22.2.2018 15:13
Avatar
Jirka Kouba
Člen
Avatar
Jirka Kouba:22.2.2018 15:14

aha, už chápu. Díky moc

 
Odpovědět 22.2.2018 15:14
Avatar
Martin Michale:21. února 15:32

Zkoušel jsem si u tohoto prográmku pohrát s možnostmi kontrolek, ale u toho zadaniTextBoxu se mi nedaří změnit barva písma. Barva pozadí ano. Ale třeba žluté písmo na černém pozadí neudělám. Přitom na tlačítkách to není problém.
Není třeba ten textbox nějak aktualizovat po každé změně?

 
Odpovědět 21. února 15:32
Avatar
Odpovídá na Martin Michale
Michal Štěpánek:22. února 9:28

Nejsem si jistý, jestli winform umí v TextBoxu měnit barvu písma... WPF myslím, že jo...

Odpovědět 22. února 9:28
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Martin Michale:22. února 12:21

No vlastnost ForeColor by tam byla, ale vůbec nereaguje.

 
Odpovědět 22. února 12:21
Avatar
Marek Uhlik
Člen
Avatar
Odpovídá na Martin Michale
Marek Uhlik:22. února 12:36

A odkud se to snažíš změnit? Pošli kód aby jsme viděli jak se to zkoušíš změnit

 
Odpovědět 22. února 12:36
Avatar
Odpovídá na Marek Uhlik
Martin Michale:22. února 13:07

No zakliknul jsem to v okně Properties. Ve FormDesigner.cz to vygenerovalo toto:
//
// zadaniTextBox
//
this.zadaniTex­tBox.BackColor = System.Drawin­g.Color.Black;
this.zadaniTex­tBox.Enabled = false;
this.zadaniTex­tBox.Font = new System.Drawin­g.Font("Quartz MS", 15.75F, System.Drawin­g.FontStyle.Bol­d, System.Drawin­g.GraphicsUnit­.Point, ((byte)(0)));
this.zadaniTex­tBox.ForeColor = System.Drawin­g.Color.Aqua;
this.zadaniTex­tBox.Location = new System.Drawin­g.Point(10, 10);
this.zadaniTex­tBox.Name = "zadaniTextBox";
this.zadaniTex­tBox.Size = new System.Drawin­g.Size(241, 33);
this.zadaniTex­tBox.TabIndex = 0;

Kromě té vlastnosti ForeColor se všechno nastavilo v pořádku. Samozřejmě psal jsem o žluté a tady je v kódu Aqua, Hrál jsem si s tím všelijak.

 
Odpovědět 22. února 13:07
Avatar
Marek Uhlik
Člen
Avatar
Odpovídá na Martin Michale
Marek Uhlik:22. února 15:36

A když nastavíš vlastnost Enabled na true? Tak to dělá to stejné?

 
Odpovědět 22. února 15:36
Avatar
Martin Michale:25. února 14:31

Ano "Enabled = True" a funguje to. Asi je to bohužel pochopitelné. Aktivní box bude mít normální písmo, Pasivní bude zešedlé. Ale mohla tam být aspoň možnost zvolit jinou barvu. Škoda.
Bohužel s Enabled můžu zase do toho TextBoxu zapisovat a to i text a znaky. Takže asi budu musel hlídat stisknuté klávesy.

 
Odpovědět 25. února 14:31
Avatar
Odpovídá na Martin Michale
Andy Scheuchzer:25. února 16:55

ReadOnly by mělo stačit.

Odpovědět 25. února 16:55
Člověk, co si myslí, že snědl všechnu moudrost světa, i když tomu tak není.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 44. Zobrazit vše