NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Poggy
Člen
Avatar
Poggy:17.1.2017 17:43

Ahoj, jsem tu nový, zkouším si vytvořit svůj první grafický program v okně. Bohužel mi nefunguje jak bych si přál.
Mám problém s ošetřením zachycení špatného uživatelského vstupu. Konkrétně chci aby se mi při překročení hodnoty int "pocet" (určuje počet náhodně vykreslených tečel v panelu) zobrazila v messageboxu hláška "error2". Tzn. číslo přesahující hodnoti INT16. Stejně při zadání nesprávného čísla do políček barvy (R, G, B) zobrazila stejným způsobem hláška "error1". Číslo vyšší než 255.
V tuto chvíli vše funguje, až na upozornění na chyby.
Celý zdrojový kód jsem nakopíroval sem: http://www.itnetwork.cz/dev-lighter/855

Děkuji za případnou pomoc.

 
Odpovědět
17.1.2017 17:43
Avatar
Ondřej Štorc
Tvůrce
Avatar
Ondřej Štorc:17.1.2017 17:52

Použij NumericUpDown, tomu lze nastavit Min a Max hodnota. https://msdn.microsoft.com/…vs.110).aspx

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
17.1.2017 17:52
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Poggy
Člen
Avatar
Odpovídá na Ondřej Štorc
Poggy:17.1.2017 18:23

To je dobrý nápad. Děkuji.Tím by se to vyřešilo.
Jen jsem chtěl zkusit aplikovat jednu metodu z programu co jsem opsal - výpočet faktoriálu, jsem začátečník. Viz. http://www.itnetwork.cz/dev-lighter/856
Liším se v tom, kde mám definované proměnné. Nevím z jakého důvodu mi to nešlo je definovat před try, v bloku jsem je měl červěne podtržené a tak jsem je definoval před public. V tom bude asi problém. Pokud to nenajdu, použiji tvojí metodu.
Děkuji.

 
Nahoru Odpovědět
17.1.2017 18:23
Avatar
Odpovídá na Poggy
Erik Šťastný:18.1.2017 8:39

Try catch ti sice odchytí problém v programu jako takovém, ale už sám neřekne, v čem uživatelem udělal chybu bez dalšího psaní. Kdežto Ondřejova možnost rovnou uživateli nedovolí tam dát nic mimo to co chceš a uživatel rovnou uvidí co tam může max dát :)

Další možností by byla udělat nějakou akci která se podívá jak je velké číslo a zaokrouhlí ho dolů na nejvyšší možné. Teoreticky přímo na change event.

 
Nahoru Odpovědět
18.1.2017 8:39
Avatar
HONZ4
Člen
Avatar
HONZ4:18.1.2017 18:44

Samozřejmě použít NumericUpDown je dobré řešení.

Jsem sice taky začátečník, ale tvůj pokus se mě nelíbí hlavně ze dvou důvodů:

  1. oznamování chyb není vhodné dávat po událost Paint, protože je tato událost volána i automaticky. Například při maximalizaci okna.
  2. divně řešené oznámení chyby

Trochu méně divně bych to viděl třeba takto:

public partial class Form1 : Form
{
    Random nahoda = new Random();
    string error1 = "Neplatné zadání čísla barvy, opravte zadání.";
    string error2 = "Tolik teček neumím. :-(";
    int pocet = 0;
    SolidBrush stetec = new SolidBrush(Color.Black);

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            int _pocet = Convert.ToInt32(txtpocet.Text);
            if (_pocet > 32766) throw new Exception(error2);

            int _r = Convert.ToInt32(txtcervena.Text);
            int _g = Convert.ToInt32(txtzelena.Text);
            int _b = Convert.ToInt32(txtmodra.Text);

            if(_r < 0 || _r>255 || _g < 0 || _g > 255 || _b < 0 || _b > 255) throw new Exception(error1);

            pocet = _pocet;

            stetec = new SolidBrush(Color.FromArgb(_r, _g, _b));
            panel1.Refresh();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message, "Chyba zadání", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        int maxX = panel1.Width - 1;
        int maxY = panel1.Height - 1;
        e.Graphics.Clear(Color.Silver);
        e.Graphics.DrawRectangle(Pens.Black, 0, 0, maxX, maxY);

        for (int a = 0; a < pocet; a++)
        {
            int x = nahoda.Next(1, maxX);
            int y = nahoda.Next(1, maxY);

            e.Graphics.FillRectangle(stetec, x, y, 1, 1);
        }
    }
}
Editováno 18.1.2017 18:46
 
Nahoru Odpovědět
18.1.2017 18:44
Avatar
HONZ4
Člen
Avatar
HONZ4:18.1.2017 18:53

jo a ještě: kdyby se to konvertovalo na byte, tak by tam nemusela být kontrola
if(_r < 0 || _r>255....
stejně tak u počtu

 
Nahoru Odpovědět
18.1.2017 18:53
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na HONZ4
Ondřej Štorc:18.1.2017 18:56

Jedno malé vylepšení: Nepoužívej třídu Exception na vyhazovaní výjimek. Vždy použij nějakou již existující třídu, která právě z třídy Exception dědí a nebo si vytvoř vlastní a děď z ní taky. V tomto případě by bylo nejlepší použít výjimku ArgumentOutOf­RangeException.

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

je nějaký jednoduchý způsob jak ve VS zobrazit nabídku dostupných Exceptions ? Ty základní si pamatuji z hlavy, ale ty ostatní..

 
Nahoru Odpovědět
18.1.2017 19:02
Avatar
Ondřej Štorc
Tvůrce
Avatar
Ondřej Štorc:18.1.2017 19:07

Já to dělám tak že třeba napíšu Exception a dám ctrl + mezerník. To mi pak vyjede seznam všech tříd co obsahují v názvu slovo Exception :)

Editováno 18.1.2017 19:08
Nahoru Odpovědět
18.1.2017 19:07
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
HONZ4
Člen
Avatar
Odpovídá na Ondřej Štorc
HONZ4:18.1.2017 19:20

To je jasné, ale proklikej se těmi všemi, aby sis přečetl popis...
Ideální by byla nějaká tabulka včetně znění oznámení.
Obvykle se mi nechce s tím zdržovat a raději to si vygeneruji vlastní znění.

 
Nahoru Odpovědět
18.1.2017 19:20
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na HONZ4
Ondřej Štorc:18.1.2017 20:00

Tak vždycky jde o to si říct co vlastně chceš tou výjimkou říct a tím se ti ten okruh možností značně zkratí. Jinak by jsi měl vždycky alespoň trochu popsat co se vlastně stalo:

if (validate && !ValidateString(input))
    throw new ArgumentException("Input is not number", nameof(input));
Nahoru Odpovědět
18.1.2017 20:00
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
HONZ4
Člen
Avatar
Odpovídá na Ondřej Štorc
HONZ4:18.1.2017 20:28

Jasná zpráva, budu se snažit více se snažit přemýšlet o tom jestli nepoužít nějakého potomka Exception.
Na popisu chyby si záležet dávám, nemám rád neurčitá chybová hlášení.

Editováno 18.1.2017 20:28
 
Nahoru Odpovědět
18.1.2017 20:28
Avatar
Poggy
Člen
Avatar
Poggy:19.1.2017 16:37

Děkuji všem za zájem a pomoc.

HONZ4: Moc děkuji za tvojí práci. O tom, že bych neměl dávat oznámení na paint jsem nevěděl. Pro příště napravím dle tvého kódu. S tím typem int16 a byte jsem si hrál včera. Nyní již bych to uděla např. takto a vyhnul bych se tolika počtu podmínek. http://www.itnetwork.cz/dev-lighter/858

Ondřej: Děkuji, toto vyházování vyjímek vyzkouším, nevěděl jsem o ní. Učím se z knižky Radka Vystavěla a tam tuto situaci popisuje takto.

 
Nahoru Odpovědět
19.1.2017 16:37
Avatar
HONZ4
Člen
Avatar
Odpovídá na Poggy
HONZ4:19.1.2017 19:11

není zač, a ano takto nějak jsem to myslel.
Ještě poznámka ke kreslení: protože překreslování probíhá docela často, je dobré tuto událost nezatěžovat ani zbytečnými výpočty.
(Proto jsem odebral globální proměnné R,G,B a rovnou vytvořil štětec, abych jej nemusel znovu vytvářet po každém překreslení, a proměnné R,G,B se uchovávaly v paměti pouze pro účel vytvoření štětce.)
V tomto případě se samozřejmě žádný rozdíl nepozná...

 
Nahoru Odpovědět
19.1.2017 19:11
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 14 zpráv z 14.