Visual Basic [exceptions?]

[Venom]

Početnik
Poruka
46
Poz,

Radio se o formi na kojoj postoje INPUT (doubles, integers) i OUTPUT polja. Podaci se upisuju u formatu brojeva u textbox a posle proces/kalkulacije rezultat se pojavljuje u drugom textbox-u. U input polja trebaju da se upisu brojevi kako bi program izracuno sto treba, medjutim u ta polja mogu da se upisu i slova kao i ostali karakteri tako da dolazi go greske tokom izvodjenja operacija.

Kako bih mogao da se izvede neki "exeption" ili bilo sta drugo sto bi prilikom unosenja "nebrojeva" i ostalih pogresnih karaktera opomenilo korisnika da mora da unese brojeve u pravilnom formatu?

Na primer, da se pojavi message box koji opominje korisnika sta mora da unese.

valjda sam bio dovoljno jasan
 
mozes
1.i da postavis event koji ce da reaguje kada se upisuje znak u ta polja pa, pre nego sto se znak upise, proveri se da li je to broj i ako jeste upise se a ako nije izbaci se poruka ili se znak jednosravno ne upise

2. da postavis event na izlazak iz kontrole (tj kad druga kontrola preuzme fokus) da proveris da li je sadrzaj polja dobar

3. kada se unesu vrednosti u sva polja pre nego sto se odradi racun proveri se za svako polje da li je unos dobar i ako nije izbaci se poruka

za 1 proveravas da li je uneti znak, koji treba da se upise, 1 - 9
za 2 i 3 proveravas da li u stringovima postoji bar jedan znak koji nije broj. to bi uradio nekako ovako

dok i=0 do duzina_stringa i string_dobar radi
ako string nije 1,2,3,4,5,6,7,8,9,0 onda string_dobar = netacno
i=i+1

ne stojim dobro sa basicom, ako ti nesto znaci mogu da ti iskucam u pascalu ili c-u, eventualno odradim program u delphiju pa uci na primeru
 
e da, inace je cesta potreba da se proveri da li je unet string validna brojna vrednost

u pascalu postoji procedura koja moze to da odredi, val(string,integer,greska);
string je string koji se proverava, integer je int vrednost u koju se upisuje konverzija ako moze da se odradi, greska je integer koji je -1 ako je konverzija moguca, odnosno broj polja u stringu u kojem je doslo do greske.
mozda sam malo pomesao ali tako nekako radi.
pogledaj u helpu, mozda postoji nesto tako i u basicu

u delphiju postoji trystrtoint koja vraca true ako moze string da se pretvori u int i false ako ne moze.
za strtofloat mislim da nema. u svakom slucaju radio sam jednom prilikom testiranje string u float konverzije i to upravo prolaskom kroz string i ispitivanjem znakova i brojanjem zareza, tj. tacki (zavisno od regionalnog podesavanja)
 
Mozda ima u VB neka takozvana PICTURE clauzula, koja kod unosa u GET polje jednostavno ignorise bilo sta sto nije numerik (ako je namesteno tako)
KAo primer u xHarbouru unos polja ima otprilike ovakav izgled:
REDEFINE oGet1 VAR nNekiBroj PICTURE "999,999.99" ID 103 OF oDlg
Mozda nesto slicno postoji i u VB?
 
u al je ruzno....

vidis tako prostog resenja se nisam setio ;)

a u visual c++ kad sam nekad davno poceo da ucim (pa batalio, losa knijga) chini mi se da je bilo da se podesi koji tip vraca Edit box, sto znaci da samo taj tip moze da se upise
 
Mozda ima u VB neka takozvana PICTURE clauzula, koja kod unosa u GET polje jednostavno ignorise bilo sta sto nije numerik (ako je namesteno tako)
KAo primer u xHarbouru unos polja ima otprilike ovakav izgled:
REDEFINE oGet1 VAR nNekiBroj PICTURE "999,999.99" ID 103 OF oDlg
Mozda nesto slicno postoji i u VB?

Postoji IsNumeric(expression) Funkcija koja vraca True ili False u zavisnosti od toga kakav unos korisnik upisuje:
Kod:
MyVar = "459.95"             [COLOR="DarkGreen"]' Dodela vrednosti[/COLOR]
MyCheck = IsNumeric(MyVar)   [COLOR="darkgreen"]' Vraca True.[/COLOR]

MyVar = "45 Help"            [COLOR="darkgreen"]' Dodela vrednosti sa stringom.[/COLOR]
MyCheck = IsNumeric(MyVar)   [COLOR="darkgreen"]' Vraca False.[/COLOR]

I Islo bi ovako:
Kod:
[COLOR="Navy"]Private Sub[/COLOR] Text1_KeyPress(KeyAscii As Integer)
    [COLOR="DarkGreen"]'Dozvoljeni su samo brojevi i ","[/COLOR]
    [COLOR="darkgreen"]'KeyAscii ("44" -> "," - za zarez; "46" -> "." - za tacku; "8" -> za backspace)[/COLOR]
    [COLOR="navy"]If[/COLOR] IsNumeric(Chr(KeyAscii)) = [COLOR="navy"]False And[/COLOR] KeyAscii <> 44 [COLOR="navy"]And[/COLOR] KeyAscii <> 8 [COLOR="navy"]Then[/COLOR]
        KeyAscii = 0
        MsgBox "Dozvoljen je samo unos brojeva od ""0-9"" i "",""", vbExclamation, "Pogresan unos!"
    [COLOR="navy"]End If[/COLOR]
[COLOR="navy"]End Sub[/COLOR]

@[Venom] Ako ovo nije resenje - ako i ovo kod tebe ne radi (mada bi trebalo jer ovde nisam filozofirao), postavi kod ili deo koda koji ti pravi problem pa da vidimo gde si zapeo.

P.S. Pogledaj u MSDN-u detalje o IsNumeric F'ji.
 
Samo Visual Basic, tek sam poceo za programiranjem tako da je sada najteze.

sist_ing nece da reaguje tvoj kod. Zar ne treba to nekako povezati sa textbox ili variable? :?

Ako hoces mogu ja da uploadujem celi projekat pa ti vidi ako imas vremena. Jako je mali kod, samo matemticke funkcije izmedju polja i nista vise.
 
[Venom];5342057:
Poz,

Radio se o formi na kojoj postoje INPUT (doubles, integers) i OUTPUT polja. Podaci se upisuju u formatu brojeva u textbox a posle proces/kalkulacije rezultat se pojavljuje u drugom textbox-u. U input polja trebaju da se upisu brojevi kako bi program izracuno sto treba, medjutim u ta polja mogu da se upisu i slova kao i ostali karakteri tako da dolazi go greske tokom izvodjenja operacija.

Kako bih mogao da se izvede neki "exeption" ili bilo sta drugo sto bi prilikom unosenja "nebrojeva" i ostalih pogresnih karaktera opomenilo korisnika da mora da unese brojeve u pravilnom formatu?

Na primer, da se pojavi message box koji opominje korisnika sta mora da unese.

valjda sam bio dovoljno jasan

Овако, додаш функцију за догађај "текст у пољу се променио"( како се тај event зове у VB-у не сећам се) и провериш који је знак унесен. Ако је број или тачка онда је ок а ако није онда "одсечеш" задњи карактер из текст поља. Остаје проблем у томе што корисник може да copy/paste неки текст у текст поље па би могао да заобиђе ову проверу на тај начин. То можеш да решиш тако што ћеш у неку променљиву да памтиш пређашњи текст па ако се нови текст у још неком сем у задњем карактеру разликује од претходног, мораш да идеш "пешке" кроз сваки знак и провераваш дал је број и ако није да га избациш.
 
...мораш да идеш "пешке" кроз сваки знак и провераваш дал је број и ако није да га избациш.

Evo peske:
Ovaj kod proverava svaki znak kome dozvoljavamo unos i on se nalazi u samom
event-u "Change" tako da ga proverava cak i ako korisnik ide "Copy/Paste"... aj' reci da ni ovo ne radi:shock:
Kod:
[COLOR="navy"]Private Sub[/COLOR] Text1_Change()
[COLOR="navy"]Dim[/COLOR] unos [COLOR="navy"]As String[/COLOR]
[COLOR="DarkGreen"]'[/COLOR]
[COLOR="darkgreen"]'Uzimamo zadnji broj kako bi smo ga proveravali[/COLOR]
unos = Right(Text1.Text, 1)
    [COLOR="darkgreen"]'[/COLOR]
    [COLOR="navy"]If[/COLOR] unos = "0" [COLOR="navy"]Or[/COLOR] unos = "1" [COLOR="navy"]Or[/COLOR] unos = "2" [COLOR="navy"]Or[/COLOR] unos = "3" [COLOR="navy"]Or[/COLOR] unos = _
    "4" [COLOR="navy"]Or[/COLOR] unos = "5" [COLOR="navy"]Or[/COLOR] unos = "6" [COLOR="navy"]Or[/COLOR] unos = "7" [COLOR="navy"]Or[/COLOR] unos = "8" [COLOR="navy"]Or[/COLOR] unos = "9" _
    [COLOR="navy"]Or[/COLOR] unos = "," [COLOR="navy"]Or[/COLOR] unos = "." [COLOR="navy"]Or[/COLOR] unos = " " [COLOR="navy"]Or[/COLOR] unos = "" [COLOR="navy"]Then[/COLOR]
        [COLOR="darkgreen"]'[/COLOR]
        [COLOR="darkgreen"]'Ako je sve ispravno, odradjuje ovaj blok koda[/COLOR]
        Label1.Caption = "Ispravan unos!"
    [COLOR="navy"]Else[/COLOR]
        [COLOR="darkgreen"]'[/COLOR]
        [COLOR="darkgreen"]'Ako nije u redu, odradjuje drugi blok[/COLOR]
        MsgBox "Pogresan unos", vbExclamation, "Greska!"
        Label1.Caption = "Neispravan unos!"
    [COLOR="navy"]End If[/COLOR]
    [COLOR="darkgreen"]'[/COLOR]
[COLOR="Navy"]End Sub[/COLOR]

Venom:
sist_ing nece da reaguje tvoj kod. Zar ne treba to nekako povezati sa textbox ili variable?

Treba povezivati samo preimenuj kontrolu Text1 u ime za TextBox koje ti koristis u kodu.
 
Jos jedan od razloga sto VB nikada nece biti ozbiljan jezik
Pa te kontrole unosa postoje u nekim jezicima od samog pocetka i sve se svodi na jednu jedinu liniju (i unos i kontrola i validacija i farbanje i vrsta fonta i formatiranje cifara ili teksta ili datuma)....
U VB koliko vidim treba da se napise par strana koda za validaciju jednog unosa? Mozda gresim jer ne radim u VB odavno, od kad sam video sta sve ne moze... :)
 
...U VB koliko vidim treba da se napise par strana koda za validaciju jednog unosa?...

Pa nije bas par strana, dovoljna je samo jedna strana:-D. U sustini, taj problem je resen [post=5343505]na ovaj nacin[/post] koji sam ovde izneo ali coveku nece to da radi iz, meni, nepoznatih razloga. Jeste, VB nema tu ugradjenu inteligenciju koju noviji jezici imaju. U VB-u si u nekim situacijama prinudjen da to odradis deo po deo. Ali je prednost u njemu sto moze da se prosiri i da onaj ko ga koristi moze kreirati sopstvene objekte koje kasnije samo nalepi i podesi svojstva.
Dakle od ovog sto sam dole napisao moze se napraviti nova kontrola koja ce u buduce pozluziti u te svrhe i koja se moze vremenom dopuniti.

P.S. Oba primera koje sam dole dao (7 i 11 post) odradjuju isti zadatak samo sam drugacije pristupio problemu.
 
Malo skretanje sa teme:
Da li je poslednja verzija (ma koja to bila) VB-a, kompletan OO jezik? Mislim da ima ograniceno baratanja klasama, koliko mi je poznato. Ne mozes sam kreirati klase, subclassing, encapsulation itd?

Ne, VB nije potpuno OO jezik ali je "objektno baziran". Mogu se kreirati klase (moduli klase) koje se kasnije koriste iz bilo kog dela u projektu. Za podklase neznam:oops:
 
Хех, човек па што не кажеш одма :D

Види 'вако, када оћеш да читаш вредност из неког TextBox-a и да је конвертујеш у на пример double, урадиш прво ово:
if( Double.TryParse( txtWidth.Text, width) == false) -- uradi šta hoćeš kada unos nije dobar --
где је width нека променљива типа Double. Ако није добар стринг онда ће функција TryParse да врати false.

И ето га...

Још да додам, ја мислим да је С# лакши од Visual Basic .NET-a, ако ништа друго код је неупоредиво лепши :)
 
Ajd da dodam i ja stogod!!! Evo ti jedan primercic u VB.NET-u kako da u text box-u dozvolis unos samo brojeva i decimalne tacke. Pored toga je dozvoljen enter i backspace.

Private Sub txt_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt.KeyPress

Select Case e.KeyChar
Case CChar("0") To CChar("9"), ControlChars.Back

e.Handled = False
Case ControlChars.Cr

txt2.Focus()
e.Handled = False
Case CChar(".")
If InStr(txt.Text, ".") = 0 Then
e.Handled = False
Else
e.Handled = True
End If
Case Else
e.Handled = True
End Select
End Sub

Ali ti predlazem da za takva polja koristis masked text box. Nadam se da sam bio od pomoci.
 
Наравно. Али пази, приложени код проверава само задњи унети карактер, не све карактере, тако да ако корисник paste-ује нпр "блабл1" програм неће видети грешку у уносу... ;)
 
е зато најбоље да се тек кад треба да се користи тај стринг провери да ли може да се конвертује (тачније, тек кад се кликне на тастер који нешто ради са вредностима у тим пољима)
 

Back
Top