[ Sija @ 20.05.2007. 15:05 ] @
Znaci svi ostali unosi da se zabrane. |
[ Sija @ 20.05.2007. 15:05 ] @
[ steve585 @ 20.05.2007. 15:18 ] @
Pokusaj ovako.
Code: Private Sub TextBox1_Change() Upit=TextBox1.Text If Upit<>0 Or Upit<>1 Or Upit <>2 Then TExtBox1.Text="" End If End Sub Imao sam negdje bas kod za ovo, potraziti cu, pa poslati. krcko: dodati CODE tagovi [Ovu poruku je menjao Aleksandar Ružičić dana 20.05.2007. u 22:57 GMT+1] [ steve585 @ 20.05.2007. 15:22 ] @
Nasao sam
Code: Private Sub Text7_KeyPress(KeyAscii As Integer) Dim strValid As String Dim Duzina Duzina = Len(Text7.Text) If Duzina > 4 And KeyAscii > 26 Then KeyAscii = 0 End If strValid = "0123456789" If KeyAscii > 26 Then If InStr(strValid, Chr(KeyAscii)) = 0 Then KeyAscii = 0 End If End If End Sub Osim sto se omogucava samo unos brojeva ovaj kod brani unos vise od 5 karaktera. krcko: dodati CODE tagovi [Ovu poruku je menjao Aleksandar Ružičić dana 20.05.2007. u 22:57 GMT+1] [ Eurora3D Team @ 20.05.2007. 16:57 ] @
Ovo vam je mnogo bolje i brze jer izbegavate stalna proveravanja.
U deklaracionom delu forme stavite ove deklaracije funkcija Code: ' Funkcije za promenu stila. textboxa napr Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const GWL_STYLE = (-16) Private Const ES_NUMBER = &H2000& ili u nekom modulu ovo (da bi moglo da se koristi iz celog programa) Code: ' Funkcije za promenu stila. textboxa napr Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Const GWL_STYLE = (-16) Public Const ES_NUMBER = &H2000& i onda u Load ili bolje Activate eventu forme stavite ovaj kod da promenite ponasanje text box-a Code: ' txtDraw je ime text box-a Dim lng As Long lng = GetWindowLong(txtDraw.hwnd, GWL_STYLE) SetWindowLong txtDraw.hwnd, GWL_STYLE, lng Or ES_NUMBER Ovo se izvodi samo jednom za razliku od ovih VB if-ova koji se izvode svaki put kad se pritisne taster. Pozdrav [ steve585 @ 20.05.2007. 17:11 ] @
Da li moze samo kratko pojasnjenje koda. Bar prvi dio sa "Declare ..."
[ Sija @ 20.05.2007. 17:27 ] @
Prvo da se izvinem: Pogrijesio sam naslov teme. Nisam sjeo za komp i nesto pravio ima godina.. Nisam mislio na numericku nego na vrijednost koja se unosi kao kod kalkulatora. Znaci mora se moci unijeti i zarez ali samo jedan put i mora se omoguciti unos predznaka "-" na pocetku.
U svakom slucaju hvala! Na osnovu onog prvog koda sam nesto sastavio: Code: Dim strValid As String Dim intBroj As Integer strValid = "0123456789,-" If KeyAscii > 26 Then If InStr(strValid, Chr(KeyAscii)) = 0 Then KeyAscii = 0 End If End If If Len(Text7.Text) = 1 And Text7.Text = "-" And KeyAscii = 44 Then KeyAscii = 0 If Text7.Text = "" And KeyAscii = 44 Then KeyAscii = 0 Else For intBroj = 1 To Len(Text7.Text) If InStr(1, Text7.Text, ",") > 0 Then If KeyAscii = 44 Or KeyAscii = 45 Then KeyAscii = 0 End If End If Next End If Je li ovo o.k. ? [ steve585 @ 20.05.2007. 17:36 ] @
Probao sam kod i moguce je unjeti slova.
[ Ero S Ovoga Sveta @ 20.05.2007. 17:44 ] @
Evo kako sam ja rijesio taj problem.
Code: Private Sub Text1_Change() Dim C As Currency On Error GoTo Nije_Broj If Text1.Text <> "" Then C = Text1.Text End If Exit Sub Nije_Broj: MsgBox "Mozete upisivati samo brojeve", 64, "Greska" End Sub Znaci ako promjenjivoj C pokusas da dodijelis nesto drugo osim brojeva i zareza, pojavit ce se greska i program ce otici na Nije_broj. To nije "najbolje" rjesenje ali funkcijonise. [ steve585 @ 20.05.2007. 17:57 ] @
Evo nesto nepopularno, ali radi. Iskoristi prvi kod, unositi ces samo cijele brojeve u TextBox bez zareza.
Postojecem kodu dodaj sljedeci kod Code: Private Sub Text7_LostFocus() Text7.Text = Round(Text7.Text / 100, 2) Text7.Refresh End Sub krcko: dodati CODE tagovi [Ovu poruku je menjao Aleksandar Ružičić dana 20.05.2007. u 22:59 GMT+1] [ Sija @ 20.05.2007. 18:21 ] @
Sve je to manje vise o.k. ali znaci moraju se moci upisivati i negativni brojevi, a zaokruzivanje ne smije biti unaprijed definisano tj. ako se pogrijesi mjesto zareza mora se moci jednostavno izbrisati. Znaci mora se moci upistai nesto ovako "-12555455,126796465"
Kao da imate na POS-u kolicinu ili cijenu koja moze ici u minus.(Sta cete nisam nikada POS napravio) [ Eurora3D Team @ 20.05.2007. 19:08 ] @
Ovo ce da ti radi.
Prekopiraj kod u Formu i stavi na Formu jedan TextBox sa imenom Text1 Decimalni znak zavisi od regionalnih podesavanja Windowsa (kod nas je zarez). Pozdrav Code: Dim str As String ' temp promenjiva Private Sub Form_Load() Text1.Text = "" End Sub Private Sub Text1_Change() On Error GoTo err ' ako tekst ne moze da se pretvori u broj izazivamo error i idemo na err Dim n As Double n = CDbl(Text1.Text) ' ako je double izlazimo Exit Sub err: Text1.Text = str ' ako je unet drugi znak tako da od teksta ne moze da se napavi broj Text1.SelStart = Len(str) ' upisujemo zadnju tacnu vrednost teksta i namestamo kursor posle zadnjeg znaka End Sub Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) 'uzimamo tekst pre nego sto je dodat novi znak str = Text1.Text End Sub [ Marko_L @ 20.05.2007. 20:40 ] @
Mislim da je ovako najjednostavnije
Code: Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 48 To 57 'ako je u pitanju bilo koji broj Exit Sub Case 45 'ako je minus If Text1.SelStart <> 0 Then KeyAscii = 0 'ako nije na prvom mestu u textbox-u zabrani upis Exit Sub Case 44 'ako je zarez If InStr(1, Text1.Text, ",") > 0 Then KeyAscii = 0 'dozvoli upis samo jednom Exit Sub Case 8 'ako je backspace Exit Sub Case Else 'u bilo kom drugom slucaju zabrani upis KeyAscii = 0 End Select End Sub Može i kraće ako se izbace Exit Sub-ovi Code: Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 48 To 57 'ako je u pitanju bilo koji broj Case 45 'ako je minus If Text1.SelStart <> 0 Then KeyAscii = 0 'ako nije na prvom mestu u textbox-u zabrani upis Case 44 'ako je zarez If InStr(1, Text1.Text, ",") > 0 Then KeyAscii = 0 'dozvoli upis samo jednom Case 8 'ako je backspace Case Else 'u bilo kom drugom slucaju zabrani upis KeyAscii = 0 End Select End Sub i to će raditi, ali meni je profesionalna deformacija da volim sve eksplicitno da naglasim, što zbog preglednosti, što zbog sigurnosti, što zbog brzine, jer kad se jednom dobije ono što je traženo, bolje izaći iz procedure, jer tu nema šta više da se proverava... mada u ovom konkretnom slučaju sve to ne igra preveliku ulogu. Takođe, se uz manju intervenciju može postići da ne može da se upiše nula kao prvi broj, samo treba zameniti Code: Case 48 To 57 'ako je u pitanju bilo koji broj sa Code: Case 48 If Val(Text1.Text) = 0 Then KeyAscii = 0 Case 49 To 57 'ako je u pitanju bilo koji broj [ Sija @ 21.05.2007. 20:06 ] @
Hvala Vam svima puno! Ovo mi je puno pomoglo. Ipak ja ne mogu to tako jednostavno kao profesionalci, ja to zakomplikujem pravo.
P.S. Pored toga sto mi je pomoglo ovaj kod cu da nabijem na nos jednom programeru koji mi nije htjeo pomoci. Zastitio to u svom programu tj. napravio ActivexControl sa imenom firme od toga. Jos jednom hvala! [ bukwa @ 26.11.2009. 13:38 ] @
@Ero s ovoga sveta
radim u vs2005 i morao sam promijeniti currency (ne prepoznaje) u decimal (automatski prijedlog, tj integer - moj izbor) i sve radi super, samo bi mi trebalo da dodam jos mogucnost unosa znaka "/" i "-". kako to napraviti? thx [ Aleksandar Vasic @ 26.11.2009. 14:01 ] @
Obrati se na forumu .NET
[ Marko_L @ 26.11.2009. 17:23 ] @
Pa sa tim rešenjem koje si izabrao, nikako. Inače je namerno izazivanje errora da bi zabranio neki unos totalno nepraktičan pristup. Dakle, hendluj svaki uslov zasebno i tako ćeš imati kontrolu nad tim charovima. pogledaj ono moje rešenje, zatim pronađi ASCII vrednosti za te charove koji ti trebaju i dodaj izuzetke sa CASE (kao što sam dodao za zarez, minus i slično).
[ bukwa @ 27.11.2009. 08:46 ] @
Probao sam prvo tvoje rjesenje i ne radi, tj mogu upisati bilo koji znak u to polje..samo ne znam zasto.
[ dava @ 27.11.2009. 10:42 ] @
@bukwa ovdje se raspravlja o VB6 a ti radis u vs2005.
[ bukwa @ 27.11.2009. 11:16 ] @
da, znam...postavio sam pitanje u .net sekciji ali sam odgovorio Marku kad mi je vec ponudio rjesenje...moje isprike ako sam pogrijesio
[ Marko_L @ 27.11.2009. 11:44 ] @
Pa ja sam ti skrenuo pažnju na rešenje koje je u VB6, misleći da ćeš umeti to da prilagodiš VB.NET-u kad već radiš u njemu, a ionako nije neka velika razlika u pitanju. Sve što treba jeste da zameniš Select Case KeyAscii sa Select Case Asc(e.KeyChar), a tamo gde piše KeyAscii = 0 staviš e.KeyChar = "", a umesto Text1.SelText, staviš Text1.SelectionText (ili kako ti se već zove textbox kontrola) i to je to. Takođe, ne znam tačno šta pokušavaš da napraviš, ali postoje i druge opcije. Recimo, ako unos mora da bude u odgovarajućem formatu koji je uvek isti, možeš da iskoristiš MaskedTextBox. Ako je bilo kakva numerička vrednost, imaš NumericUpDown koja će ti dozvoliti isključivo korišćenje numeričkih vrednosti i decimal separatora i naravno backspace. Ako je u pitanju unošenje datuma (pošto vidim pominješ neke kose crte), onda možeš da iskoristiš DatePicker. Što bi se reklo, right tool for the right job ;)
[ DankoH @ 07.12.2009. 10:31 ] @
Code: Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case vbKey0 To vbKey9 Case vbKeyBack, vbKeyClear, vbKeyDelete, 44 Case vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab Case Else KeyAscii = 0 Beep End Select Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|