Jednoduchá C# kalkulačka v okně

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

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 2528x (45.54 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal joker.a
Avatar

Jak se ti líbí článek?
Celkem (14 hlasů) :
55555


 


Miniatura
Předchozí článek
Kontrolky Windows Forms počtvrté
Miniatura
Všechny články v sekci
Okenní aplikace v C#
Miniatura
Následující článek
Vlastní ovládací prvky v C# .NET

 

 

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

Avatar
JeneCapek
Člen
Avatar
JeneCapek:

To proč je to pro plus ve zdrojáku takto:

private void plusButton_Clic­k(object sender, EventArgs e)
{
if (funkce != "")
rovnaseButton_Clic­k(sender, e);
cislo1 = int.Parse(zada­niTextBox.Tex­t);
zadaniTextBox.Text = "";
funkce = "scitani";
}

 
Odpovědět 18.5.2013 17:30
Avatar
Petr Čech (czubehead):

Díky. Tole měl být první díl okenních aplikací.

Odpovědět 18.8.2013 20:11
Why so serious? -Joker
Avatar
leblr
Člen
Avatar
leblr:

Prosím, začínám s C# mohl bys doplnit tu "jednoduchou" podmínku pro ošetření dělení nulou?
Mám za to že se bude muset změnit i výstup z int na text aby to mohl vypsat třeba "chyba"

Děkuju

 
Odpovědět 24.3.2014 21:26
Avatar
coolboytom
Člen
Avatar
coolboytom:

Potřeboval bych poradit, jak napsat tlačítko +/- (Pokud mě tedy chápete :) )

 
Odpovědět 11.5.2014 19:45
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na coolboytom
Theodor Johnson:

Myslíš

±

nebo jak řešit tu funkci?

Odpovědět 11.5.2014 19:49
Přecházím na "Cross-Platform Development"
Avatar
Odpovídá na coolboytom
Ondřej Štorc:

Například toto:

private void buttonPlusMinus_Click(object sender, EventArgs e)
         {

zadaniTextBox.Text = int.Parse(zadaniTextBox.Text) * -2

         }

Nezkoušel jsem to, ale mělo by to fungovat..

Odpovědět 11.5.2014 19:56
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
coolboytom
Člen
Avatar
Odpovídá na Ondřej Štorc
coolboytom:

Děkuji za radu, ale já to už udělal takto :) -

private void btnpm_Click(object sender, EventArgs e)
{
cislo1 = cislo1 * (-1);
txtzad.Text = cislo1.ToString();
}

Editováno 13.5.2014 5:06
 
Odpovědět 13.5.2014 5:06
Avatar
coolboytom
Člen
Avatar
Odpovídá na Theodor Johnson
coolboytom:

Myslel jsem to tlačítko co je na všech kalkulačkách a když na něj kliknete, dá to před číslo mínus (dá ho do záporu) a když na něj kliknete znova, bude to číslo opět kladné.

 
Odpovědět 13.5.2014 5:08
Avatar
qwertyW
Redaktor
Avatar
Odpovídá na coolboytom
qwertyW:

od čísla odečteš dvojnásobek jeho hodnoty.

Odpovědět 6.7.2014 9:34
Programuji, tedy jsem.
Avatar
Marek Mžyk
Člen
Avatar
Marek Mžyk:

Čau chlapi,co se vkládá do CLICKU u +,-,/,*,=,CE a C? Díky

 
Odpovědět 5. června 0:09
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 33. Zobrazit vše