Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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

:-)

Předmět Autor Datum
no pouzivas az moc IF :) ale tak vo VB to nie je ziadna tragedia. Skus pri vybere z comboboxu namies…
wam_Spider007 25.12.2009 10:36
wam_Spider007
A dá se teda tohle nějak zrátit např pomocí for ? NumericUpDown1.Value = 0 NumericUpDown2.Value =…
Programátorcotoneumí 25.12.2009 10:43
Programátorcotoneumí
fuj, milion ifů a endifů.. edit: sám si ověř, na kterém stupínku hierarchie právě jsi: j-h-wrld.htm
touchwood 25.12.2009 10:38
touchwood
A jak to teda zkrátit ? ;-)
Programátorcotoneumí 25.12.2009 10:42
Programátorcotoneumí
Co třeba nepoužít if-then, ale select-case? Jinak mi přijde ten kód jako otřesně otrocky napsaný, c…
touchwood 25.12.2009 10:52
touchwood
Sleep radšej nie (aj bez väzby na nejaký programovací jazyk). :-)
los 25.12.2009 12:18
los
Podľa mňa je asi najviac zlé napr. to, že sa rozhoduješ podľa textových hodnôt tlačidla a čas máš ul… poslední
los 25.12.2009 12:18
los

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:

If (NumericUpDown3.Value = -1) Then
            NumericUpDown3.Value = 0
        End If

prepises na

If (NumericUpDown3.Value = -1) Then NumericUpDown3.Value = 0

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):

mincount=minuty
sekcount=sekundy
for i in ((minuty*60)+sekundy)
   sleep 1s
   if sekcount<1 then
      mincount=mincount-1
      sekcount=59
   else
      sekcount=sekcount-1
   endif
   "update window values"  
next
run_alarm

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#?

Zpět do poradny Odpovědět na původní otázku Nahoru