MaxLength на TextBox

10 отговора 251 прегледа
#1

MaxLength на TextBox

Здравейте! Някой правил ли е имплементация на MaxLength на TexBox (задаване на максималната дължина на стринг който може да се пише в текстбокс)

Отговор
в отговор на student #2

Re: MaxLength на TextBox

Ами в Text1_Change сложи това:

If Len(Text1.Text)>50 Then
Text1.Text=Left$(Text1.Text,50)
' Tyka moje da sloji6 i tova za da ti otide kyrsora v kraq na napisanoto:
' Text1.SelStart=Len(Text1.Text)
End If



Отговор
в отговор на student #3

Re: MaxLength на TextBox

Private Sub Text1_KeyPress(KeyAscii As Integer)

Const MAX_CHAR = 50

If KeyAscii >= 32 Then
If Len(Text1.Text) + 1 > MAX_CHAR Then KeyAscii = 0
End If

End Sub

Отговор
в отговор на Ptr #4

Re: MaxLength на TextBox

Е, тука има малко недоглеждане ;о) ... ако текста в контрола е 20 знака, и аз пейстна още 300 отгоре - какво ще стане? ;о) Кода на колеагата по-нагоре май ще свърши малко по-добра работа.

Обаче защо ми се струва, че свойството "MaxLenght" на контрола служи точно за таз работа??? Аз пробвах вече, и просто контрола игнорира всичко, което по дължина би надхвърлило зададената в свойството стойност.

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на Щиpлиц #5

Re: MaxLength на TextBox

Драги Щирлиц,съжалявам че изглежда като недоглеждане,просто не постнах
целия код.

'---------------------------------------------------------------------------------------------
' Form1
'---------------------------------------------------------------------------------------------
Option Explicit
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_WNDPROC = (-4)


Private Sub Form_Load()

Module1.OldWndProcTextBox = GetWindowLong(Text1.hwnd, GWL_WNDPROC)
Call SetWindowLong( _
Text1.hwnd, GWL_WNDPROC, AddressOf Module1.TextBox_WindowProc)


End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii >= 32 Then
If Len(Text1.Text) + 1 > Module1.MAX_CHAR Then KeyAscii = 0
End If

End Sub

'---------------------------------------------------------------------------------------------
' Module1
'---------------------------------------------------------------------------------------------
Option Explicit
Private Const WM_PASTE = &H302
Public Const MAX_CHAR = 50
Public OldWndProcTextBox As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Function TextBox_WindowProc(ByVal hw As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim txt As String

If uMsg = WM_PASTE Then

txt = Form1.Text1.Text

If Len(txt) < MAX_CHAR Then

txt = txt & Left(Clipboard.GetText, MAX_CHAR - Len(txt))
Form1.Text1.Text = txt

End If

Else

TextBox_WindowProc = _
CallWindowProc(OldWndProcTextBox, hw, uMsg, wParam, lParam)

End If

End Function

Отговор
в отговор на Ptr #6

Re: MaxLength на TextBox

ОК, бързо работиш ;о)) но все пак не виждам приложение, където трябва да се пренебрегне свойството на контрола, и да се пише това на ръка.

Ако настройш Text1.MaxLenght = 50 - то контрола сам ще си игнорира дори Paste и т.н. неща.

Е, както и да е. Аз пък днес намерих съвсем случайно това:

strSlash = IIf(Len(App.Path) = 3, "", "\")

Изглежда страхотно. В по-старите версии на Бейсик (Visual Basic for DOS, и неговите предшественици) го нямаше. Така изглежда много по-прегледно, а аз досега съм го писал поне 2 пъти по-дълго.

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на Ptr #7

Re: MaxLength на TextBox

Ами ако вкарам в текстовото поле знак със код по-малък от 32 какво ще стане а ?

Отговор
в отговор на Гeoprи #8

Re: MaxLength на TextBox

Благодаря за съвета. Аз съм се занимавал повече с HTML форми и там това нещо си е готово. Друг въпрос който ме интересува е как може да се предават параметри между форми, например в една форма се въвежда егн на човек и с SQL query в друга форма се зареждат данните на човека.

Отговор
в отговор на Гeoprи #9

Re: MaxLength на TextBox

Ами аз току-що пробвах. Записах знаците от 0 до 31. Получава се такава поредица от символи:







не знам дали ще могат да минат тука през клуба обаче ;о) Поведението на контрола обаче не се променя, и ограничението му в брой символи си остава зададеното в MaxLenght.

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на Щиpлиц #10

Re: MaxLength на TextBox

Без да го пробвам виждам че се обработват две събития - KeyPress и WM_PASTE.

В KeyPress има проверка дали клавиша е с код >=32 и ако е, тогава се проверява дължината на текста. Ако дължината е повече или 50 тогава се игнорира натиснатия клавиш...

'''''''''''''''''''''
If KeyAscii >= 32 Then
If Len(Text1.Text) + 1 > Module1.MAX_CHAR Then KeyAscii = 0
End If
'''''''''''''''''''''''''''

Ако KeyAscii е по-малко от 32 следващото условие "If Len(Text1.Text) + 1 > Module1.MAX_CHAR" няма да се провери за валидност.


За съобщението WM_PASTE няма кво да говоря - ако има нещо Paste-нато в текстовото поле просто се проверява:
If Len(txt) < MAX_CHAR Then

и ако символите са достатъчно малко се прибавя всичко от Clipboard в текстовото поле, като се махнат последните N символа които биха превишили MAX_CHAR.

Никъде не видях ограничение за кодове по-малки от 31. Как ще работи програмата ако се натиснат MAX_CHAR+1 такива клавиша ? Ами просто ще си ги обработва само KeyPress събитието и никога няма да се изпълни KeyAscii=0 защото KeyAscii никога няма да е по-голямо или равно от 32.

Отговор
в отговор на Гeoprи #11

Re: MaxLength на TextBox

Хей хей, ама за това трябва да питаш Ptr. Не съм аз този, дето е съчинил 50 реда код за ограничение на контрола, който пък си го има заложено.

Действително с този код не се постига проверка за знаци с аски-код по-малък от 32, когато се пейства от клипборда.

Когато писах конвертора си за субтитри, една колежка незнайно как и хрумна веднага да пробва да зареди AVI файла вместо субтитрите, и естествено програмата ми гръмна моментално ;о) ... тогава включих и проверка на файла - ако файла е по-голям от 1000 байта, се проверяват само първите 1000 байта.


For intCount = 0 to 31
If InStr(strText, Chr$(intCount) <> 0 Then blnCorrectFile = Fаlse
Next intCount


Това може да не е най-бързия начин, но не ми хрумва друг.

----------------------------------
помислих, хареса ми, помислих пак...
Отговор