Diskuze: Ošetření uživ. vstupů - přetečení int
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Použij NumericUpDown, tomu lze nastavit Min a Max hodnota. https://msdn.microsoft.com/…vs.110).aspx
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.
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.
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ů:
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);
}
}
}
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 ArgumentOutOfRangeException.
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í..
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
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í.
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));
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í.
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.
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á...
Zobrazeno 14 zpráv z 14.