Ošetření jednoduché kalkulačky   zodpovězená otázka

VB.NET, WinForms

Zdravím, jelikož jsem začátečník a dostal jsem se ke kapitole seriálu p. Hercega, kde vytváří jednoduchou kalkulačku, tak jsem si ji též zkusil. Můj problém ovšem nastává v okamžiku, kdy chci ošetřit aplikaci tak, že když do TextBoxu 1 či 2 nebo do obou nezadám žádnou hodnotu a rovnou kliknu na sečíst, aby mi například program vyhodil v MsgBoxu hlášku o tom, že jsem zapomněl zadat hodnotu. Určitě se tu najde někdo, kdo ví, jak upravit kód:). Návrh prostředí, které mám úplně stejné můžete shlédnout zde: http://vbnet.cz/clanek--4-vb_net_od_zaca...

Kód pro sčítání je následující:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim a As Integer = CInt(TextBox1.Text)
        Dim b As Integer = CInt(TextBox2.Text)
        Dim c As Integer
        c = a + b
        TextBox3.Text = c
    End Sub

Já se snažil vyřešit tento problém tímto způsobem:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim a As Integer = CInt(TextBox1.Text)
        Dim b As Integer = CInt(TextBox2.Text)
        Dim c As Integer
        If TextBox1.Text = "" Then
            MsgBox("Zapomněli jste zadat hodnotu")
        End If
        If TextBox2.Text = "" Then
            MsgBox("Zapomněli jste zadat hodnotu")
        End If
        c = a + b
        TextBox3.Text = c
    End Sub

Ovšem po tomto kódu na mě vybafne hláška ohledně datového typu String a Integer. Předem děkuju za pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bude to tim, že Kontrola se provádí později, než se pokoušíte String převést na integer.

Asi bych tio upravil takto:

(Jen tak narychlo)

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      
        If TextBox1.Text = "" or TextBox2.Text = "" Then
            MsgBox("Zapomněli jste zadat hodnotu")
          else
            Dim a As Integer = CInt(TextBox1.Text)
            Dim b As Integer = CInt(TextBox2.Text)
            Dim c As Integer
        End If
        
        c = a + b
        TextBox3.Text = c
    End Sub

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Děkuju:), s tímto kódem to opravdu funguje. Akorát ten End If jsm dal až za TextBox3.Text = c, protože když jsem ho nechal tam, kde ho máte, tak mi to nešlo spustit.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Problém je v tom, že se někdo může "ukliknout" a do vstupních textboxů dá něco, co sice nebude prázdným řetězcem, ale nepůjde to převést na integer.

Lepší je tu kontrolu provádět trochu jinak:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim a, b, c As Integer

        If Integer.TryParse(TextBox1.Text, a) And Integer.TryParse(TextBox2.Text, b) Then
            c = a + b
            TextBox3.Text = c
        Else

            MsgBox("Zkontrolujte zadání, prosím!", MsgBoxStyle.Critical)
        End If



    End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jenom pro vysvětlenou:

to

Integer.TryParse(TextBox1.Text, a)

se pokusí text z textbox1.text převést na Integer a pokud se mu to podaří, uloží ho do proměnné a.

Nic ale neláme přes koleno (pokud se mu to náhodou nepodaří když třeba někdo napsal do toho textboxu třeba "ahoj"), pouze uživatele ve své návratové hodnotě (typu boolean) informuje, jak se mu dařilo.

Pokud se převod povedl, vrací TRUE, pokud se nepovedl (z libovolného důvodu), vrátí FALSE, ale, hlavně, nevyvolá žádnou chybovou hlášku.

nahlásit spamnahlásit spam 4 / 4 odpovědětodpovědět

Díky moc, na to jsem nepomyslel, že by ještě někoho mohlo napadnout vkládat tam text. Mno TextBoxy budu určtě využívat často, tak aspoň jsem se díky vám naučil něco nového.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

není zač děkovat - od toho to tady máme, ostatně tuto drobnost mne právě na těchto stránkách před pár měsíci naučil pan Linhart, takže pouze předávám štafetu dál ;-)

P.S. jistě jste si všiml, že začátek toho příkazu tvoří klíčové slovo Integer - a možná Vás tedy napadlo, že stejná metoda bude použitelná i u převodů na jiný číselný typ (pouze místo Integer použijete daný typ)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback