|
[ 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 ] @
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.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|