
Dělám to dobře ?
Štastný 1. svátek, včera před večeří jsem napsal tenhle prográmek (odpočítavadlo) v visual basicu. Ale musel jsem hodně kod kopírovat a vkládal hlavně:
NumericUpDown1.Value = 0
NumericUpDown2.Value = 0
NumericUpDown3.Value = 0
A tak bych se chtěl zeptat zda by jste mi ho mohli zkouknout a popřípadě mi vytknout špatné postupy, učím se tak. :) Díky za chvílku vašeho času.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If (Button1.Text = "Start!") Then
Timer1.Start()
Button1.Text = "Stop"
Label1.Text = "Běží..."
Else
Button1.Text = "Start!"
Timer1.Stop()
Label1.Text = "Zvol čas..."
End If
If (NumericUpDown1.Value = -1) Then
NumericUpDown1.Value = 0
End If
If (NumericUpDown2.Value = -1) Then
NumericUpDown2.Value = 0
End If
If (NumericUpDown3.Value = -1) Then
NumericUpDown3.Value = 0
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
NumericUpDown1.Value = NumericUpDown1.Value - 1
If (NumericUpDown1.Value < 0) Then
NumericUpDown1.Value = 59
NumericUpDown2.Value = NumericUpDown2.Value - 1
End If
If (NumericUpDown2.Value < 0) Then
NumericUpDown2.Value = 59
NumericUpDown3.Value = NumericUpDown3.Value - 1
End If
If (NumericUpDown3.Value < 0) Then
NumericUpDown1.Value = 0
NumericUpDown2.Value = 0
NumericUpDown3.Value = 0
Timer1.Stop()
MsgBox("Čas vypršel!", , "Konec")
Button1.Text = "Start!"
Label1.Text = "Zvol čas..."
Beep()
End If
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
If (ComboBox1.Text = "Vynulovat") Then
NumericUpDown2.Value = 0
End If
If (ComboBox1.Text = "Vajička na měkko") Then
NumericUpDown2.Value = 4
End If
If (ComboBox1.Text = "Vajička na tvrdo") Then
NumericUpDown2.Value = 8
End If
If (ComboBox1.Text = "Omeleta :)") Then
NumericUpDown2.Value = 10
End If
NumericUpDown1.Value = 0
NumericUpDown3.Value = 0
End Sub
End Class
no pouzivas az moc IF :) ale tak vo VB to nie je ziadna tragedia.
Skus pri vybere z comboboxu namiesto IF pouzit CASE, bude to vyzerat lepsie.
Nerozumiem presne co su tie argumenty => ByVal sender As System.Object, ByVal e As System.EventArgs
A inak ak mas v podmienke len jeden prikaz, mozes to hodit na jeden riadok a nepotrebujes END IF.
Napriklad:
prepises na
A dá se teda tohle nějak zrátit např pomocí for ?
fuj, milion ifů a endifů..
edit: sám si ověř, na kterém stupínku hierarchie právě jsi: j-h-wrld.htm
A jak to teda zkrátit ?
Co třeba nepoužít if-then, ale select-case?
Jinak mi přijde ten kód jako otřesně otrocky napsaný, co tak trochu optimalizace? Ty v zásadě měníš (aspoň co jsem se tak zběžně díval a co se pamatuju na VB) data přímo v ovládacích prvcích, což mi nepřipadne jako zrovna dobrý nápad.
Pochopil-li jsem to správně, děláš jakousi "minutku" na vaření vajec.
edit: abych byl přesnější: celý hlavní program lze napsat nějak takto (psáno bez vazby na nějaký programovací jazyk):
Sleep radšej nie (aj bez väzby na nejaký programovací jazyk).
Podľa mňa je asi najviac zlé napr. to, že sa rozhoduješ podľa textových hodnôt tlačidla a čas máš uložený len v tých NumericUpDown a v žiadnej premennej alebo aspoň prístupný v nejakej vlastnosti.
Pridal by som vlastnosť formulára Time, ktorá by slúžila na zistenie a nastavenie času vo formulári (hodnoty v NumericUpDown).
Pri kliknutí na tlačidlo Štart/Stop by som sa rozhodoval podľa timer.Enabled (a nie podľa textu "Štart"/"Stop"). To nastavenie na 0 v prípade -1 by som odtiaľ vyhodil (ani by som nedovolil, aby sa tam taká hodnota mohla dostať).
V obsluhe ticku pre timer by bolo iba Time = Time.Subtract(TimeSpan.FromSeconds(1)) a za tým kontrola, či nie je čas rovný nule. O celú logiku toho, že minúta má 60 sekúnd sa potom nemusíš starať a nastavenie hodnôt v NumericUpDown-och sa spraví v tom nastavení vlastnosti Time.
Combobox s predvolenými hodnotami by som naplnil v konštruktore formulára (alebo v OnLoad) tak, aby jeho položky mali vo vlastnosti Tag hodnotu typu TimeSpan (prípadne by som sa k tomu času dostal z nejakého poľa podľa indexu zvoleného prvku). Pri zmene by sa potom už len vlastnosť formulára Time nastavila podľa tejto hodnoty a nie podľa reťazca.
Edit: Nerozmýšľal si nad tým, že by si začal radšej jazykom C#?