محدود کردن کاربر به وارد کردن عدد ( نه حروف) در TextBox در ویژوال بیسیک

Dark Man

Member
يه سوال در VB6

دوستان من میخوام بدونم که در VB6 چطوری میتونم کاری کنم که در یک TextBox فقط داده هایی از نوع Integer وارد بشه و در صورتی که حروف ( داده های String ) وارد شد با یک پیغام به کاربر اطلاع بده!
اگه جواب مو بدین ممنون میشم...
 

Dark Man

Member
ميشه يه كم بيشتر توضيح بدي!اين MaskEdBox كجاست و چطوري ميشه ازش استفاده كرد؟
ممنون
 
نحوه تشخيص عدد از حرف و عدد اعشاري

سلام

من يه برنامه حدس عدد نوشتم و ميخوام يه جوري بشه كه وقتي چيزي بجز عدد صحيح وارد ميكنه قبول نكنه و پيغام بده.

ممنون
:razz::razz::razz::razz::razz::razz:
 

fazist

New Member
اگر وی بی منظورته کد زیر را در پنجره کد وارد کن دیگه فقط میشه عدد وارد کرد و با کلیدهای جهت حرکت کرد:
کد:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii >= 58 Or (KeyAscii <= 47 And KeyAscii <> 45 And KeyAscii <> 8 And KeyAscii <> 13) Then
      KeyAscii = 0
'[COLOR="SeaGreen"]payam[/COLOR]      
   End If
   
End Sub
اگر خواستی پیام بده هم داخل کدها دستور پیام را بنویس.

مرجع ها:
http://www.dreamincode.net/code/snippet107.htm
http://www.thescripts.com/forum/thread14378.html
http://www.developerfusion.co.uk/show/147/
 
آخرین ویرایش:

Majid 3D

Member
با سلام خدمت همه ی بروبچ مجید آن لاین ...
چه جوری میشه در برنامه نویسی vb به کاربر اجازه داد تا فقط در تکست باکس مورد نظر فقط بتونه عدد وارد کنه و نتونه حروف توی تکست باکس بنویسه.
 

the_king

مدیرکل انجمن
شما برای محدود کردن کاراکتر هایی که صفحه کلید در TextBox وارد می کند بایستی در داخل رخداد KeyPress و
Change، کاراکترهای غیر مجاز را فیلتر کنید.
اگر فقط اینکار را در KeyPress انجام دهید، کاربر می تواند از Copy و Paste برای انتقال کاراکتر های غیر مجاز استفاده کند.
اگر فقط اینکار را در Change انجام دهیم، کاراکترهای غیر مجاز ابتدا به متن اضافه می شوند و سپس دوباره حذف خواهند شد
که باعث پر پر زدن TextBox و جابجایی بی مورد مکان نما (Cursor) می شود.

کد:
Private Const CharSet As String = "0123456789"

Private Sub Text1_Change()
    Dim Pos As Long, Str As String, Text As String
    Dim SelStart As Long
    With Text1
        Text = .Text
        SelStart = .SelStart
        For Pos = 1 To Len(Text)
            If InStr(CharSet, Mid(Text, Pos, 1)) > 0 Then
                Str = Str & Mid(Text, Pos, 1)
            End If
        Next
        .Text = Str
        .SelStart = SelStart
    End With
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
    If InStr(CharSet, Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub

در این کدی که من نوشتنم، ما فرض می کنیم که نام TextBox ما Text1 است و می خواهیم کاراکترهای 0 الی 9
قابل قبول باشند. شما می توانید هر کاراکتر دیگری را هم که قابل قبول است به عبارت رشته ای CharSet اضافه کنید.
 

Majid 3D

Member
خیلی خیلی ممنونم.
فکرش هم نمیکردم که همچین کدی لازم داشته باشه ... آخه من با ام ام بی هم کار میکنم و میدونید که برای یه تکس باکس که ایجاد میشه ، میتونید انتخاب کنید که کاربر بتونه حرف یا عدد یا هر دو رو وارد کنه ... گفتم شاید تو ویژوال هم راحت باشه.





راستی یه مسئله ی دیگه ای که هست ... توی این اسکریپتی که شما نوشتید کاربر دیگه نمیتونه از دکمه ی BackSpace برای پاک کردن اعدادی که نوشته استفاده کنه، راهی برای حل این مشکل هست ؟
 

the_king

مدیرکل انجمن
صد البته، کد رخداد KeyPress را برای قبول کردن Backspace ویرایش کردم :

کد:
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii <> vbKeyBack Then
        If InStr(CharSet, Chr(KeyAscii)) = 0 Then KeyAscii = 0
    End If
End Sub
 

uu99

Member
با سلام !
734ad6p.gif


پس نقش "توابع بررسی داده ها " چیه ؟

آیا نمیشه از این توابع برای کنترل اطلاعاتی که کاربر وارد میکنه استفاده کرد؟

کاربرد اینگونه توابع کجاست؟

isDate()
IsEmpty()
IsNull()
IsNumeric()


Thanks
20ge1pi.gif
 

the_king

مدیرکل انجمن
تابع ()isDate مشخص می کنه که آیا پارامتر ورودی اش (از هر نوعی یعنی Variant) قابلیت تبدیل به تاریخ (Date) را داره یا نه.

تابع ()IsEmpty برای داده های Variant کارایی داره که اگه مقدارش می تواند Empty باشد، متغیرهای Variant غیر از اینکه
می توانند شامل انواع داده های مختلف باشند، می توانند خالی باشند یعنی Empty.
تابع ()IsEmpty اعلام می کنه که آیا این متغیر ورودی Variant ما خالی است یا نه.
تابع ()IsNull برای اعلام اینه که آیا متغیر مقداری دارد یا نه، Null با Empty فرق داره.
این حالت فاقد مقدار بودن در متغیرهای Variant توسط Null اعلام میشه که یک حالت خاص برای Variant است.
نباید Null بودن را به شکل زیر بررسی کرد چون همیشه حاصل آن False است زیرا Null خودش یک مقدار است
و متغیری که Null است مقداری ندارد :

کد:
If Var = Null Then

تابع ()IsNumeric بررسی می کنه که آیا پارامتر ورودی (از هر نوعی یعنی Variant) قابلیت تبدیل به عدد را دارد یا نه.

این تابع هایی که شما مثال زدید مناسب نیستند، به یک دلیل مهم :

آنها فقط بررسی می کنند که مقداری قابلیت تبدیل به فلان نوع داده را دارد یا نه یا فلان حالت است یا نه،
اما نمی توانند مقدارش را در صورتی که شرط برقرار نبود فیلتر کنند تا شرط برقرار شود.
مثلا اگر "123ali" را به تابع IsNumeric بدهید می گوید که عدد نیست، اما نمی تواند "ali" را از آخر عبارت حذف کند تا
عدد بشود.
ولی ما به توابعی احتیاج داریم که در عبارت ورودی ما کاراکترهای غیر مجاز را حذف کند، نه اینکه فقط بگوید عبارت مجاز نیست.
 

uu99

Member
جناب علی سعید، از محبت شما یک دنیا ممنونم.
7xcuu83.gif



اگر براتون امکان داره این قسمت از کدهایی که نوشتین تفسیر کنید.

With Text1
Text = .Text
SelStart = .SelStart
For Pos = 1 To Len(Text)
If InStr(CharSet, Mid(Text, Pos, 1)) > 0 Then
Str = Str & Mid(Text, Pos, 1)
End If
Next
.Text = Str
.SelStart = SelStart
End With
End Sub

در مورد With مقداری توضیح بنویسید .
نقطه ای که قبل از Text و SelStart استفاده کردین، چه معنایی داره.



با تشکر فراوان
20ge1pi.gif
 

the_king

مدیرکل انجمن
With این امکان رو به ما می ده که یک مجموعه یا Object یا ساختار داده ای پیشفرض رو معرفی کنیم،
در فاصله مابین آن With تا جایی که با End With انتهای اونو مشخص کنیم.
این عمل دو ویژگی مثبت داره، اول اینکه لازم نیست واسه عضوهای مجموعه بصورت مداوم نام مجموعه اصلی
را تکرار کنیم. مثلا اگر من سه عضو A و B و C را در مجموعه MyDataType صدا بزنم اصولا می نویسم :

کد:
MyDataType.C = MyDataType.A + MyDataType.B + MyDataType.C

اما با استفاده از With از نام مجموعه فاکتور گیری می کنم :

کد:
With MyDataType
.C = .A + .B + .C
End With

طبیعی است که استفاده از With هم کد را خلاصه می کنه و هم امکان اشتباه رو کم می کنه چون وقتی شما
کاراکتر نقطه (.) را در هنگام کد نویسی تایپ می کنید، مجموعه عضوهای MyDataType به نمایش درمیاد.

دومین خاصیت مثبت With اینه که سرعت اجرا شدن کد را افزایش می ده، مخصوصا اگر مجموعه ها تو در تو باشند،
چون ارجاع غیر مستقیم ما را به یک ارجاع مستقیم تبدیل می کنه و از قسمت از ارجاع فاکتور گیری میشه.

در ادامه کدی که من نوشته بودم بایستی متن فعلی داخل Text1 فیلتر بشه تا کاراکترهای غیر مجاز حذف شوند.
اما دو نکته وجود داره، نکته اول اینه که ممکنه در همون زمان که ما داریم متن رو فیلتر می کنیم، کاربر هم متن
داخل TextBox را عوض کنه، و این عمل کاربر روی عملکرد روتین ما تاثیر منفی داره.
پس ما قبل از انجام هر گونه عملیاتی، یک کپی از متن فعلی Text1 می گیریم و اونو فیلتر می کنیم و نه متن Text1 را.
نکته دوم این است که وقتی شما متنی را در یک TextBox قرار می دهید، مکان نما (Cursor) بصورت خودکار در اول
متن قرار می گیرد (موقعیت صفر). و البته که این عمل دلخواه ما نیست، ما نمی خواهیم با هر بار تایپ یک کاراکتر،
مکان نما به اول متن برگردد، این حالت از نظر کاربر غیر طبیعی است و مشکل ساز است.
برای همین ما نه تنها از متن داخل Text1 کپی می گیریم، بلکه موقعیت فعلی مکان نما را هم ذخیره می کنیم تا بعد
از اتمام عملیات، دوباره مکان نما را به آن نقطه برگردانیم.
بقیه کد هم یک حلقه است که کاراکتر به کاراکتر از متن Text را در رشته CharSet جستجو می کند. CharSet یک رشته است
که تمامی کاراکترهایی که از نظر ما مجازند داخل وجود دارند. اگر کاراکتر مورد نظر در آن وجود داشت، به رشته Str
اضافه می شود ولی اگر غیر مجاز بود این عمل صورت نمی پذیرد.
در انتهای این حلقه Str برخلاف Text فقط شامل کاراکترهای مجاز است و بقیه در آن وجود ندارند.
طبق نکته دومی که گفتم پس از انتقال Str به داخل Text1، موقعیت مکان نما را هم به وضعیت اصلی برمی گردانیم.
 

uu99

Member
با سلامی دوباره .
734ad6p.gif


جناب علی سعید دوباره من اومدم
270.gif


در حلقه ای که شما نوشتین،
با اینکار محدودیت رو برداشتین ؟

یعنی هر تعداد کاراکتری که کاربر دلش بخواد میتونه وارد کنه؟

و اگر ما بخواهیم کاربر مجاز باشه فقط 4 کاراکتر در جعبه متن وارد کنه مینویسم
PHP:
 1 to 4
اگر امکان داره در مورد InStr و مشخصات اون توضیح بفرمایید . موارد داخل پرانتز به ترتیب بیانگر چه چیزهایی هستند؟






For Pos = 1 To Len(Text)
If InStr(CharSet, Mid(Text, Pos, 1)) > 0 Then
Str = Str & Mid(Text, Pos, 1)
End If
امیدوارم پرحرفی منو به بزرگواری خودتون ببخشید.
7xcuu83.gif

 

uu99

Member
در ضمن چرا، در کد زیر که نوشتین،در Paste کردن بوسیله کیبورد ، دکمه های Ctrl+V چرا کار نمیکنند ؟
6ksx82h.gif


Private Const CharSet As String = "0123456789"

Private Sub Text1_Change()
Dim Pos As Long, Str As String, Text As String
Dim SelStart As Long
With Text1
Text = .Text
SelStart = .SelStart
For Pos = 1 To Len(Text)
If InStr(CharSet, Mid(Text, Pos, 1)) > 0 Then
Str = Str & Mid(Text, Pos, 1)
End If
Next
.Text = Str
.SelStart = SelStart
End With
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
If InStr(CharSet, Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
 

the_king

مدیرکل انجمن
بایستی کاراکترهای کنترلی مثلا Ctrl + A (که برابر کد کاراکتر 1 است) الی Ctrl + Z (که برابر کد کاراکتر 26 است) را از
فیلتر حذف کنیم، رخداد KeyPress را با این کد عوض کنید تا اون کاراکتر های کنترلی هم قابل استفاده باشند :

کد:
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii > 32 Then If InStr(CharSet, Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
 

the_king

مدیرکل انجمن
نه، برای محدود کردن تعداد کاراکتر رشته کاری به کد فیلتر نداشته باشید، مقدار MaxLength را در مشخصات
TextBox از صفر به طولی که مایلید تغییر دهید، کاربر دیگر نمی تواند هیچ رشته ای که از طول MaxLength
بزرگتر است را در TextBox جا بدهد، چه با تایپ کردن و چه با Copy و Paste.

کد:
For Pos = 1 To Len(Text)
If InStr(CharSet, Mid(Text, Pos, 1)) > 0 Then
Str = Str & Mid(Text, Pos, 1)
End If
من می خواهم تمامی کاراکتر های درون Text را برای مجاز بودن بررسی کنم، پس حلقه من از کاراکتر 1 شروع می شود
تا آخرین کاراکتر Text که آنرا با Len پیدا کردم.
در داخل حلقه For بایستی کاراکتر به کاراکتر از داخل Text جدا کنم :

تابع Mid در رشته Text (پارامتر اول) و از موقعیت Pos به بعد (پارامتر دوم) به اندازه 1 کاراکتر (پارامتر سوم) جدا می کند و
بر می گرداند. از بین این سه پارامتر فقط Pos است که تغییر می کند، از موقعیت 1 الی (Len(Text.
پس کاراکتر های Text یکی یکی جدا می شوند تا مجاز بودنشان بررسی شود.

تابع InStr وجود یک رشته را در یک رشته دیگر بررسی می کند و موقعیت اولین کاراکتر رشته دوم را در اولی برمی گرداند.
اگر رشته دوم اصلا در رشته اول پیدا نشود، مقدار صفر را بر می گرداند.
InStr چندین مدل پیاده سازی دارد که بر اساس تعداد پارامترهای ورودی آن متفاوت است، در مدلی که من استفاده کردم
(مدلی که دو پارامتر ورودی دارد)، پارامتر اول آن رشته ای است که جستجو درونش انجام می شود (CharSet) و
پارامتر دوم رشته ای است که دنبالش می گردیم (همان کاراکتری که جدا کرده ایم).

اگر تابع InStr عددی بزرگتر از صفر را برگرداند یعنی آن کاراکتر در رشته وجود دارد (موقعیت اش برای ما مهم نیست)،
پس می توانیم آنرا به عنوان کاراکتر مجاز به Str اضافه کنیم.
این حلقه برای تمامی کاراکترها تکرار می شود.
 
آخرین ویرایش توسط مدیر:

uu99

Member
سلام .
734ad6p.gif


میشه راهنمایی بفرمایید که آیا میشه برای مقدار اولین کاراکتر داخل جعبه متن هم محدودیت اعمال کرد؟

مثلا در همین کدی که در این تاپیک جناب علی سعید نوشتند، اگر بخواهیم برای شروع ورودی کاربر هم شرط بگذاریم . مثلا از داخل همون مجموعه "ثابت" که معین کردیم ، نمیخواهیم یک کاراکتری در ابتدا وارد بشه .

برای این چه شرطی میتونیم بگذاریم؟
270.gif



در ضمن در مورد خصوصیت SelStart جعبه متن هم سوال دارم . این خصوصیت برای چی هست و در چه مواقعی بکار میاد؟
7xcuu83.gif





با تشکر فراوان
20ge1pi.gif

 

the_king

مدیرکل انجمن
صد البته، شما می توانید برای هر محدودیت خاصی کد را تغییر دهید :

کد:
Private Const CharSet As String = "0123456789"
Private Const CharSetFirst As String = "12345"

Private Sub Text1_Change()
    Dim Pos As Long, Str As String, Text As String
    Dim SelStart As Long
    With Text1
        Text = .Text
        SelStart = .SelStart
        If InStr(CharSetFirst, Left(Text, 1)) > 0 Then
            Str = Str & Left(Text, 1)
        End If
        For Pos = 2 To Len(Text)
            If InStr(CharSet, Mid(Text, Pos, 1)) > 0 Then
                Str = Str & Mid(Text, Pos, 1)
            End If
        Next
        .Text = Str
        .SelStart = SelStart
    End With
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii > 32 Then
        If Text1.SelStart = 0 Then
            If InStr(CharSetFirst, Chr(KeyAscii)) = 0 Then KeyAscii = 0
        Else
            If InStr(CharSet, Chr(KeyAscii)) = 0 Then KeyAscii = 0
        End If
    End If
End Sub

در این نمونه من کد را طوری تغییر دادم که برای کاراکتر اول از CharSetFirst استفاده کند و برای بقیه کاراکتر ها از CharSet.
به همین دلیل در این مثال کاراکتر اول بایستی از "1" الی "5" باشد و سایر رقم ها را درج نخواهد کرد.

SelStart مشخص کننده موقعیت فعلی مکان نما (چشمکزن یا Cursor) داخل TextBox است و اگر شما متنی را در داخل آن
انتخاب کرده باشید، SelStart اولین کاراکتر انتخاب شده را مشخص می کند و SelLength تعداد کاراکتر های انتخاب شده را.
SelStart از صفر شروع می شود که یعنی قبل از کاراکتر اول. اگر یک باشد یعنی مابین کاراکتر اول و دوم است (اگر کاراکتر
دومی وجود داشته باشد).
 

uu99

Member
سلام جناب علی سعید

دست شما درد نکنه . مثل همیشه عالی و بی نقص نوشتین.
7xcuu83.gif


آیا سایتی ، فایلی در اینترنت وجود داره که تمامی دستورات ویژوال بیسیک رو نوشته باشه.

من هر بار با یک دستور جدید روبرو میشم:razz:

نداشتن یک منبع کامل و جامع
288.gif
 

جدیدترین ارسال ها

بالا