# Native Code > برنامه نویسی در 6 VB >  محدود کردن تعداد سطرهای یک تکس باکس

## samiasoft

چگونه میتوان یک تکس باکس را محدود کرد به طوری که برای مثال تا سطر 15 بتوان داخل ان متن نوشت؟

----------


## samiasoft

دوستان اگر در این باره اطلاعاتی دارید کمکم کنین :لبخند: 

هرکاری کردم برای محدود کردن سطر به نتیجه ای نرسیدم :متفکر:

----------


## HidDeN_OutX.Exe

سلام دوست من 

شما یه تايمر تعریف کنید که در زمان تغییر متن تکست باكس شروع کنه  به انجام این کار :

1_با استفاده از خاصیت Lines تکس باکس محتویات هر سطر ارو تو عنصر  آرایه (که باید تعریف کنید ) از نوع استرینگ بریزه

2_ اینجاش مشخصه دیگه  :چشمک:  چک کنه اگه تعداد عنصر های آرایه به 14 رسید 

خاصیت OnlyRead تکس باکس رو True کنه . دیگه قابلیت نوشتاری نداشته باشه .

----------


## m.4.r.m

یه کاری راحت تر می تونی بکنی اینه که مثلا 15 سطر اطلاعات وارد کنی و طول 15 سطر رو بگیری و اون عدد رو بزاری تو Maxlenth

----------


## samiasoft

> یه کاری راحت تر می تونی بکنی اینه که مثلا 15 سطر اطلاعات وارد کنی و طول 15 سطر رو بگیری و اون عدد رو بزاری تو Maxlenth


منظورتون از بدست اوردن طول 15 سطر چی چیزی هست؟همون طول تکست باکس؟

----------


## m.4.r.m

Private Sub Text1_Change()
Label1.Caption = Len(Text1)
If Len(Text1) = 180 Then
    Text1.MaxLength = 180
End If
End Sub

این یه مثال بود 180 شما هر عددی رو می تونی بزاری میشه مثله پیامک دیگه 60 تا بیشتر میشه 1 اس ام اس و ..... باز خواستی بگو کمکت کنم

----------


## miladatashin

> یه کاری راحت تر می تونی بکنی اینه که مثلا 15 سطر اطلاعات وارد کنی و طول 15 سطر رو بگیری و اون عدد رو بزاری تو Maxlenth


با احترام به نظر دوستان ولی این روشهایی که ارایه شده عملی نیست. چون یا روش دوم مشخص نیست طول نوشته در هر سطر چه قدر میتونه باشه و ممکنه یوزر طول نوشته در هر سطر رو بخواد عوض کنه. روش اول هم اصلا منطقی نسیت که برای یک همچین کاری بخوای از تایمز استفاده کنی. تازه بعد اینکه به خط 15 رسید تکست باکس غیر فعال میشه و دیگه نمیشه سطرهای قبلی دو تغیر داد روشی که من پیشنهاد میکنم. در رویداد KeyPress تکست باکس چک کنید و هر وقط خط ها به تعداد 15 رسید اجازه ندیدن کاربر اینتر بزنه. اینم کدش

Private Sub Text1_KeyPress(KeyAscii As Integer)
    Dim MyNewLine As Variant
    Dim NumofLine As Integer
    MyNewLine = Split(Text1, vbNewLine)
    NumofLine = UBound(MyNewLine) + 1
    If (NumofLine >= 15) And (KeyAscii = 13) Then KeyAscii = 0
End Sub

----------


## mehran901

> چگونه میتوان یک تکس باکس را محدود کرد به طوری که برای مثال تا سطر 15 بتوان داخل ان متن نوشت؟


با استفاده از vbcr میتونین تعداد خطوط رو بشمارین و خیلی ساده وقتی در change event مورد استفاده قرار بگیره میتونه از بیشتر شدن تعداد سطر ها از 15 تا جلوگیری کنه ، توجه کنین که vbcrlf رو برای اینکار استفاده نکنین

----------


## vbhamed

> سلام دوست من 
> 
> شما یه تايمر تعریف کنید که در زمان تغییر متن تکست باكس شروع کنه  به انجام این کار :
> 1_با استفاده از خاصیت Lines تکس باکس محتویات هر سطر ارو تو عنصر  آرایه (که باید تعریف کنید ) از نوع استرینگ بریزه
> 2_ اینجاش مشخصه دیگه  چک کنه اگه تعداد عنصر های آرایه به 14 رسید 
> خاصیت OnlyRead تکس باکس رو True کنه . دیگه قابلیت نوشتاری نداشته باشه .


سلام
ايني كه گفتيد به چه زباني هست
TextBox ويژوال بيسيك نه خاصيت Lines داره نه OnlyRead البته به جاي OnlyRead خاصيت Locked رو داره

------------------------------------

همونطوري كه *mehran901* عزيز گفتن با دستوري مشابه زير مي‌تونيد تعداد خطوط رو چك كنيد
Private Sub Text1_Change()

    Dim s() As String
    
    s = Split(Text1, vbCrLf)

    If UBound(s) > 14 Then
        'your code
    End If

End Sub
به جاي yourcode مي‌تونيد مثلا متغيري رو تنظيم كنيد كه اگر در اينجا 1 شد، در متد KeyDown خاصيت KeyCode و در متد KeyPress خاصيت KeyAscii رو صفر كنيد تا نتونه چيزي اضافه كنه، يا اينكه هر چقدر اضافه كرد 15 خط اولش رو جايگزين كنيد

----------


## miladatashin

> همونطوري كه *mehran901* عزيز گفتن با دستوري مشابه زير مي‌تونيد تعداد خطوط رو چك كنيد
> Private Sub Text1_Change()
> 
>     Dim s() As String
>     
>     s = Split(Text1, vbCrLf)
> 
>     If UBound(s) > 14 Then
>         'your code
> ...


چه دلیلی داره یک متغیر اضافه به صورت سراسری تعریف کنیم تو رویداد Change بخواهیم یکش کنیم و باز در رویداد KeyPress یا KeyCode دوباره if بزاریم ؟!
هم مرتبه زمانی بالاتر میره(به خاطر یک if بیشتر)
هم حافظه بیشتر مصرف میشه (وجود یک متغیر دائمی ولو بولین 1 بتی)
هم کد نویسیمون پبچیده تر میشه
البته همه موارد بالا اون قدر کم که هست که در برنامه کوچیک تاثیر نداشته باشه ولی در برنام های سنگین به چشم میاد. به هر حال به نظر من همه این کارها اگه تو KeyPress انجام بشه بهینه تر هست. مثل کدی که تو پست 7 گفتم
و در اخر همه کدهای گفته شده در مورد وارد کردن مستقیم داخل textbox درست عمل میکنه. و اگه کاربر متنی رو داخل تکست باکس paste کنه که بیشتر از 15 خط باشه باز میشه از 15 خط بیشتر وارد تکست باکس کرد
اگه میخواهید اینطوری هم نشه بیشتر از 15 خط واد کرد میتونید از کد زیر استفاده کنید.
 تو این کد 15 خط اول حفظ میشه و بقیه حذف(البته کد خیلی بهینه نیست و اجازه enter زدن بعد از 15 خط رو هم میده ولی خط 15 به بعد رو حذف میکنه اگه میخواهید این طوری نباشه دو روش رو با هم ترکیب کنید)

Private Sub Text1_Change()
    Dim s() As String
    s = Split(Text1, vbCrLf)
    If (UBound(s) > 14) Then
        Text1.Text = ""
        For i = 0 To 13
           Text1.Text = Text1.Text + s(i) + vbCrLf
        Next i
        Text1.Text = Text1.Text + s(14)
        Text1.SelStart = Len(Text1)
    End If
End Sub

----------


## vbhamed

> چه دلیلی داره یک متغیر اضافه به صورت سراسری تعریف کنیم تو رویداد Change بخواهیم یکش کنیم و باز در رویداد KeyPress یا KeyCode دوباره if بزاریم ؟!
> هم مرتبه زمانی بالاتر میره(به خاطر یک if بیشتر)
> هم حافظه بیشتر مصرف میشه (وجود یک متغیر دائمی ولو بولین 1 بتی)
> هم کد نویسیمون پبچیده تر میشه
> البته همه موارد بالا اون قدر کم که هست که در برنامه کوچیک تاثیر نداشته باشه ولی در برنامه های سنگین به چشم میاد. به هر حال به نظر من همه این کارها اگه تو KeyPress انجام بشه بهینه تر هست. مثل کدی که تو پست 7 گفتم


 سلام
دليلش اينه كه ما مي‌خوايم يك كار تميز انجام بشه، يعني وقتي 15 خط شد، برنامه اجازه اضافه كردن خط رو نده نه اينكه خط اضافه بشه بعد پاك بشه كه اينطوري يك حالت چشمكزن و ناخوش آيند روي تكست بوجود مياد
البته فعلا بحث بيشتر روي تشخيص تعداد خط بود و روش جلوگيري از تايپ تعداد خط بيشتر به عهده خود برنامه نويس گذاشته شد

----------


## miladatashin

> سلام
> دليلش اينه كه ما مي‌خوايم يك كار تميز انجام بشه، يعني وقتي 15 خط شد، برنامه اجازه اضافه كردن خط رو نده نه اينكه خط اضافه بشه بعد پاك بشه كه اينطوري يك حالت چشمكزن و ناخوش آيند روي تكست بوجود مياد
> البته فعلا بحث بيشتر روي تشخيص تعداد خط بود و روش جلوگيري از تايپ تعداد خط بيشتر به عهده خود برنامه نويس گذاشته شد


سلام دوست عزیز. من در مقایسه کدی که تو پست 7 گذاشتم گفتم. تو اون کد هم به قول شما کار تمیز انجام شده. و مزیتش نسبت به روشی شما 1- یک if کمتر  2- عدم نیاز به متغیر سراسری 3- کوتاه تر بودن کد سورس

----------


## vbhamed

> سلام دوست عزیز. من در مقایسه کدی که تو پست 7 گذاشتم گفتم. تو اون کد هم به قول شما کار تمیز انجام شده. و مزیتش نسبت به روشی شما 1- یک if کمتر  2- عدم نیاز به متغیر سراسری 3- کوتاه تر بودن کد سورس


سلام
دوست عزيز
منظور من از تميز بودن كار، اين بود كه كاربر نهايي در تكست باكس پرش  نبينه، چون وقتي متن وارد بشه و بعد پاك بشه حالت پرش ايجاد ميشه و پياده  سازي اينكار حتي ممكنه براي برنامه نويس زحمت بيشتري رو ايجاد كنه و نياز به كد طولاني تري داشته باشه ولي خروجي كار مهمه كه خوب در مياد

اما در كل ما اينجا مي‌خوايم به دوستامون كمك كنيم مشكلشون حل بشه نه اينكه بيايم جوابهامون رو با هم مقايسه كنيم كه جواب كي بهتره
بهتره ديگه راجع به اين موضوع صحبت نشه، شما هم هر كدي كه فكر مي‌كني بهتره بزار هيچ مشكلي نيست همه استقبال مي‌كنيم

----------


## محسن واژدی

سلام علیکم
کد پست زیر هم بررسی کنید:
https://barnamenevis.org/showthread.p...=1#post1462743

برای مثال:

Private Sub Text1_KeyPress(KeyAscii As Integer)
    Const iMAX_ALLOWED% = 10
    Caption = GetLineCount(Text1) & "/" & GetCurLineIndex(Text1)
    If ((GetLineCount(Text1) >= iMAX_ALLOWED%) And Not KeyAscii = vbKeyBack) Then
        KeyAscii = 0
    End If
End Sub

موفق باشید

----------

