[ smal @ 12.07.2010. 21:01 ] @
Treba mi rešenje za InputBox da prihvata unos samo numeric (i cele i decimalne brojeve) vrednosti sa tastature.

Imam već proceduru sa proverom da li je uneta vrednost numerik, i poništavanjem unosa ukoliko to nije slučaj, ali pošto se radi o kasi i unosu količina, zaključio sam da je to samo gubljenje dragocenog vremena... Dakle, kako uvesti restrikciju na unos slova i ostalih nenumeričkih znakova u InputBox-u?

Napominjem da InputBox pozivam na F12, nešto otprilike kao:
Code:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyF12
Me.Koliko = InputBox("KOLIČINA?", "Unesi koliko", 1)
End Select
End Sub
[ banem @ 12.07.2010. 21:25 ] @
Probaj sa OnChange polja i proveri IsNumeric(NazivPolja.Text) = True, npr.

Public dblPrethVrednost As Double '(na vrhu modula)

OnChange

If IsNumeric(NazivPolja.Text) = False Then
NazivPolja = dblPrethVrednost
Else
dblPrethVrednost = NazivPolja.Text
End If


Promenljiva dobija vrednost samo ako je unet broj, inače se vraća dotadašnja vrednost. Možda treba i da pozicioniraš kurzor na kraj unosa, ali to je ideja.

Na kraju unosa resetuj vrednost promenljive na Null (OnLostFocus).
[ smal @ 12.07.2010. 21:57 ] @
Ovo funkcioniše, ako se vrednost unosi u direktno u TextBox, ali to nije moj slučaj.

Da pojasnim, na glavnoj formi postoje dva TextBox-a. Jedan se zove txtKoliko, koji je lockovan (dakle nema OnChange, OnLostFocus itd) i čija je default vrednost = 1, a kasir je menja sa F12 (InputBox), ako želi ručno da unese potrebnu količinu za sledeći artikl. Unos se vrši kroz polje txtUnos, preko barkoda ili šifre, a onda se lista pakuje u nevezanu subformu ispod.

Dakle, nema direktnog unosa podataka u subformu, i artikli se upisuju samo preko jednog polja na glavnoj formi.
[ banem @ 12.07.2010. 22:11 ] @
Sad tek ne razumem. :)

Da li ti želiš da kontrolišeš ono što se kuca u InputBox-u? Ako je to, to ne može.
[ smal @ 12.07.2010. 22:17 ] @
Citat:
banem: Da li ti želiš da kontrolišeš ono što se kuca u InputBox-u?

Da, to je bilo pitanje i u naslovu teme
Citat:
Ako je to, to ne može.

Damn!
[ Trtko @ 12.07.2010. 22:25 ] @
A zašto si ne napraviš jednu malu formu na kojoj bi stavio txtbox i postavio format da se mogu unesti samo brojevi sa deimalama



nekako ovako

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyF12
DoCmd.OpenForm "Unoskol", , , , , acDialog ' program čeka da se zatvori otvorena forma, NE izvrsava kod ispod
' na on close forme Unoskol napunis forms!glavnaforma.koliko= unesena vrijednost
' Me.Koliko = InputBox("KOLIČINA?", "Unesi koliko", 1)
End Select
End Sub


i rijesio si si sve muke

[ banem @ 12.07.2010. 22:30 ] @
Nikakav problem - imitiraj InputBox formom.
[ smal @ 12.07.2010. 22:41 ] @
OK ljudi, u pravu ste. Biće onda formica :)
[ izonic @ 29.07.2010. 11:33 ] @
Function UnesiNumeric()
Dim Podatak As String


Start:
Podatak = InputBox("Unesi numerički podatak", "Num podatak", 0)
If IsNumeric(Podatak) Then
Else
GoTo Start
End If
end function
[ smal @ 29.07.2010. 12:05 ] @
Zahvaljujem, mada, već na početku sam rekao da imam i koristim sličnu funkciju.

U stvari, namera mi je bila da napravim nešto po ugledu na program rađen u C# koji sam video. Tamo su pri unosu količina nenumerički tasteri zaključani, i ako korisnik pokuša da ih koristi, neće mu uspeti, a pritom se začuje i zvučno upozorenje iz PC spikera. To je u praksi zgodno kada je gužva na kasi, a kasir je sklonio pogled sa tastature i promašio numeričku tastaturu, ili isključio Num Lock i tako to, jer štedi dragoceno vreme.

Sve u svemu, nije nešto preterano bitno, pa može da ostane i ovako.
[ banem @ 29.07.2010. 12:15 ] @
Hm, nešto ne štima tu:

Function UnesiNumeric() As Double
Dim Podatak As String
Podatak = InputBox("Unesite broj", "Broj", 0)
If IsNumeric(Podatak) Then
UnesiNumeric = CDbl(Podatak)
Else
UnesiNumeric = 0
End If
End Function

Funkcija vraća nešto, Sub ne.
[ Zidar @ 29.07.2010. 14:26 ] @
Citat:
Tamo su pri unosu količina nenumerički tasteri zaključani, i ako korisnik pokuša da ih koristi, neće mu uspeti, a pritom se začuje i zvučno upozorenje iz PC spikera.

Mozda moze da se programski blokira numericka tastatura, sa onom OnKey eventima? Ne znam da li moze, samo ideja...

[ Zoran.Eremija @ 29.07.2010. 14:29 ] @
@smal, da li ste pogledali primer od ranije, ako se odlucite za svoju formu http://www.elitesecurity.org/t380325-0#2427961
[ Zidar @ 29.07.2010. 15:44 ] @
Evo kod koji prepoznaje sta je otkucano i prihvata samo unapred definisane karaktere. Neka na formi imate text box po imenu Text0. KeyPress event ce odbiti sve zankove kojee ne zelimo da prihvatimo.
Code:

Private Sub Text0_KeyPress(KeyAscii As Integer)
Dim sList As String
sList = "1234567890,."
'Ovde definisamo znakove koje zelimo da prihvatimo
If InStr(sList, Chr(KeyAscii)) = 0 Then
    'Ako promenimo KeyAscii,
    'znak koji smo upravo uneli nece biti prikazan
    KeyAscii = 0
End If
End Sub


:-)
[ smal @ 29.07.2010. 15:50 ] @
Citat:
Zoran.Eremija: @smal, da li ste pogledali primer od ranije, ako se odlucite za svoju formu http://www.elitesecurity.org/t380325-0#2427961

Ma znao sam ja da može :) Što je najgore, jesam video taj primer, ali nisam skontao da tu ima ono što mi treba :)
Dodao sam samo još samo "Or KeyAscii = 46", da prihvata i decimalni zarez, i to mu je to.

Hvala!

Naknadno videh Zidarevo rešenje, i ono je super!

Opet mala dopuna - u ovom drugom rešenju nedostaje Backspace taster u listi. Kako to dodati?

[Ovu poruku je menjao smal dana 29.07.2010. u 17:04 GMT+1]
[ Zidar @ 29.07.2010. 17:51 ] @
Code:

Private Sub Text0_KeyPress(KeyAscii As Integer)
Dim sList As String
'Ovde definisamo znakove koje zelimo da prihvatimo
'ACSII za Backspace = 8
sList = "1234567890,." & Chr(8)


If InStr(sList, Chr(KeyAscii)) = 0 Then
    'Ako promenimo KeyAscii,
    'znak koji smo upravo uneli nece biti prikazan
    KeyAscii = 0
End If

End Sub


Kyy_Press event moze da se odradi na nivou forme. To je u slucaju da imas vise ovakvih kontrola koje smeju da prime samo odredjene karaktere, pa da ne pises isti kod za svaku od njih.

[ smal @ 29.07.2010. 18:38 ] @
Hm, nešto se ipak čudno događa. Ako mi je izabrana Sr (Serbian Latin) tastatura, dozvoljava mi upis YU slova (čćšđž) u formu. Ako je tastatura En (USA), ne propušta unos ;'[]/ karaktera, koji su na istoj poziciji tastera.

U Zoranovom primeru nema toga, tj. restrikcija radi bez obzira na izbor tastature.
[ izonic @ 29.07.2010. 22:11 ] @
Private Sub inputb_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
'
Case 48 To 57
'
Case 96 To 105
'
Case 188
'
Case 190
'
Case 110
'
Case 8
'
Case 46
'
Case Else
KeyCode = 0
End Select

End Sub
[ Getsbi @ 30.07.2010. 05:37 ] @
Kada koristiš proceduru na događaj On Key Down, onda treba postaviti osobinu Key Preview na Yes, inače se procedura neće odvijati. Ja koristim ovakav kod:
Code:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyEscape:
                            KeyCode = 0
                            DoCmd.Close
        Case vbKeyTab:
                            KeyCode = 0
                            Me![Maloprodajne kalkulacije subform].SetFocus
        Case vbKeyDelete:
                            If var_knjizeno = True Then
                               KeyCode = 0
                            End If
        Case vbKeyF1:
                            KeyCode = 0
                            DoCmd.OpenForm "Help_poruka"
        Case vbKeyF2:
                            KeyCode = 0
                            Me![NoviDok].SetFocus
                            SendKeys "{ENTER}"
        Case vbKeyF3:
                            KeyCode = 0
                            Me![Pregled].SetFocus
                            SendKeys "{ENTER}"
        Case vbKeyF5:
                            KeyCode = 0
                            Me![Knjizenje].SetFocus
                            SendKeys "{ENTER}"
        Case vbKeyF6:
                            KeyCode = 0
                            Me![Brisanjeprok].SetFocus
                            SendKeys "{ENTER}"
        Case vbKeyF7:
                            KeyCode = 0
                            Me![BrisanjeDok].SetFocus
                            SendKeys "{ENTER}"
     Case vbKeyF10:
                            KeyCode = 0
                            Me![KnjiziGlavnu].SetFocus
                            SendKeys "{ENTER}"
    End Select

End Sub


Za bliže, pogledaj Keycode Constants u Helpu.