Ukončení procedury při validaci   zodpovězená otázka

VB.NET

Dobrý večer,

o validaci hodnot tu již bylo napsáno hodně, používám validaci v části SET, kde se nastavuje vlastnost proměnné. Proměnné mají samostatnou třídu zatizeni.

Public Class zatizeni
'...
Private _pd1 As Double

Public Property pd1() As Double

        Get

            Return _pd1

        End Get

        Set(ByVal value As Double)

            If value > 0 Then

                _pd1 = value

            Else
                'tady bych chtěl ukončit původní událost
            End If

        End Set

    End Property
'...
End class

V proceduře ve třídě Form1 se provádí výpočty a výsledky se vypíší do rich text boxu. Dá se nějakým způsobem ukončit ta procedura ve Form1, ze která ta proměnná pochází? Tzn. výpočty se zápornou (nebo nulovou) hodnotou se neprovednou, do RTB se nic nevypíše, případně se ještě zobrazí msgbox s chybovou hláškou.

A mimochodem nastavit vlastnosti, když je proměnná pole?

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

No mohl by jste si vytvořit event, pojmenovaný třeba ValidationFailed a ten v té Else části spouštět. Hlavní formulář, ze kterého to celé voláte událost zachytí a příslušně se zachová.

A nebo pokud by jste potřeboval do zachytávat přímo v proceduře ze které voláte toto nastavení, tak můžete jednoduše nastavování této property obalit funkcí

tzn třeba takto:


Public Function SetPD1(Byval value As Double) AS Boolean
(
'tady bude nějaká validace
'pokud bude validace ok, nastavíte property na novou hodnotu a vrátíte True

_pd1=value
Return True


'pokud validace neprojde, nic nenastavíte, ale vrátíte False
Return False

)

Pokud by jste to takto použil, asi by nebylo ještě od věci dát danou property jako Read Only, aby nešlo validaci obejít. To už je ale detail

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

Můžete použít toto:

Set(value As Double)
    If value < 0 Then
        Throw New ArgumentException("Only positive values are allowed.")
    End If
    _property = value
End Set

A ošetřit to při nastavování:

Try
    zatizeni.Vlastnost = -7
Catch ex As Exception
    MessageBox.Show(String.Format("Došlo k chybě při nastavování zatížení: {0}{0}{1}", Environment.NewLine, ex.Message))
End Try
Spocitej(zatizeni)
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Taky bych se přikláněl k vyhození výjimky a tu pak někde ošetříte.

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

Zdravím,

tak nakonec jsme to vyřešil, dle vašich rad, vyhozením vyjímky následovně:

- nastavování proměnných ve třídě:

Private _pd1 As Double
    Public Property pd1() As Double
        Get
            Return _pd1
        End Get
        Set(ByVal value As Double)
            If value > 0 Then
                _pd1 = value
            Else
                Throw New ArgumentOutOfRangeException
            End If
        End Set
    End Property

- a ošetření při přiřazování hodnot do proměnných:

Try
'...
pd1 = Label1.text
'...
Catch exception As ArgumentOutOfRangeException
    MsgBox("Jsou povoleny pouze kladné hodnoty!")
    Exit Sub
End Try

Děkuji.

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

Nemáte za co, jen mi dovolte podotknout, že když berete tu hodnotu z Labelu, měl byste v první řadě přetypovat, a pak až dosadit.

pd1 = Double.Parse(Label1.Text)

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

No popravdě tam mám ještě jedno blok Catch, který ošetřuje vyjímku InvalidCastException.

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

To je jedna možnost, ale je to zbytečné. Totiž, při té validaci ta výjimka nastat může a nebo nemusí, záleží na uživateli, jak ty hodnoty zadá. U toho převodu to lze predikovat - jde pouze o nastavení Strict přepínače a Try-Catch je zbytečný overkill. Pokud to není v cyklu nebo tak, tak to je asi jedno, ale pak už se vyplatí o tom uvažovat, protože Try-Catch něco stojí a měl by se používat opatrně.

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

Jak se na to tak koukám, tak vidím, že jsem udělal chybu ve svém řešení, které jsem tu nastínil. Správně má být samozřjemě:

'...
pd1 = TextBox1.text
'...

Z labelu hodnoty neberu. Nevšimnul jsem si toho ani při dalších - na to navazujících - příspěvcích.

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

Jistě, o to nejde, obě vlastnosti jsou typu String, takže přiřazujete String do Double tak jako tak. Jak jsem říkal, je to celkem fuk, kód proběhne v pořádku, ale já bych provedl konverzi prvně. Jen malá poznámka, o nic samozřejmě nejde.

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

Ok, děkuji za reakce.

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