Private Sub doc()
If Text1.Text <> "" And Text2.Text <> "" And Text3.Text <> "" Then
Command1.Enabled = True
Else
Command1.Enabled = False
End If
End Sub
Private Sub Text1_Change()
doc
End Sub
Private Sub Text2_Change()
doc
End Sub
Private Sub Text3_Change()
doc
End Sub
А вот и пример
Положи три textboxa на форму и 1 кноку
Есть еще один способ ввода только цифр, но он работает немного по другому принципу:
Private Sub Form_Load()
' =========================================================================================================
' Определяем строку шаблон для оператора Like.
' Для примера показан шаблон, определяющий недопустимыми символами все символы,
' кроме цифровых символов, F и G:
' =========================================================================================================
StrPattern = "[!0-9FG]"
End Sub
Private Sub Text1_Change()
' =========================================================================================================
' При любом изменении текста в текстовом поле просматриваем этот текст
' и, если есть недопустимые символы, удаляем их.
' =========================================================================================================
Text1 = SymbolReplace(Text1, StrPattern)
' Устанавливаем курсор в конец текста.
Text1.SelStart = Len(Text1)
End Sub
Public Function SymbolReplace(ByVal StrSource As String, ByVal StrPattern As String)
' =========================================================================================================
' Функция SymbolReplace. Удаление символов входной строки, не удовлетворяющих шаблону.
' ---------------------------------------------------------------------------------------------------------
' Алгоритм основан на посимвольном просмотре строки и сравнении с шаблоном с помощью функции Like.
' Удаление производится путем выделения недопустимого символа и замены его пустой строкой "".
' Если вводимый символ недопустим, подается звуковой сигнал.
' Аргументы:
' StrSource - строка-источник, в которой требуется произвести замену символов.
' StrPattern - строка-шаблон для функции Like, с помощью которой определяются допустимые символы.
' Автор: Sovnik, 1 мая 2007 г.
' =========================================================================================================
Dim Symbol As String
Dim i As Long
Dim N As Long
' Получаем число символов в строке-источнике StrSource.
N = Len(StrSource)
' Просматриваем посимвольно строку-источник StrSource.
For i = 1 To N
' Находим очередной символ и его позицию.
Symbol = Mid$(StrSource, i, 1)
' Сравниваем найденный символ с шаблоном с помощью оператора Like.
If Symbol Like StrPattern Then
' Если найденный символ недопустим, находим его во входной строке и заменяем на "".
StrSource = Left$(StrSource, i - 1) & "" & Mid$(StrSource, i + 1)
' Подаем звуковой сигнал.
Beep
End If
Next i
SymbolReplace = StrSource
End Function
Ты себе представ што в тебя получитса за код если ты покладеш в все 28 такое
Используй как говорит Docal- умный чуквак, он прав нада вызывать функцыю котораю бы проверяла все ето дело.
Private Sub Doc()
Command1.Enabled = (Len(Text1.Text) = Text1.MaxLength) And (Len(Text2.Text) = Text2.MaxLength) And (Len(Text3.Text) = Text3.MaxLength)
End Sub
Вот это точно работает, Выделяеш свое текстбоксы и всем устанавлюеш Tag = "Text" и все
Private Sub TextFull(chr As Byte)
For ind = 0 To Form1.Controls.Count - 1
If Form1.Controls(ind).Tag = "Text" Then
  = D + Len(Form1.Controls(ind).Text)
'F = F + Form1.Controls(ind).MaxLenght
End If
Next
If chr = 8 Then
Command7.Visible = False
Exit Sub
End If
'************************************
If D + 1 = 17 Or D = 17 Then '17=syma vsix MaxLenght tvoix TextBoxov
Command7.Visible = True
Else
Command7.Visible = False
End If
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
'****kolu vvodumo tsufru komu abo steraemo ***************
If KeyAscii = 8 Or KeyAscii = 46 Or (KeyAscii > 47 And KeyAscii < 58) Then
TextFull (KeyAscii)
Exit Sub
End If
'****kolu inwi sumvolu to ne vvodnmo i zvyk****
KeyAscii = 0
Beep
End Sub
текстбоксов у меня будет пока-что 3, но в дальнейшем не менее 28...
Если количество контролов заранее неизвестно или является астрономическим числом, то советую юзать такой код:
Форма:
Private Sub Form_Load()
HookForm Me, Command1
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHookForm Me
End Sub
Модуль:
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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
Private Const WM_COMMAND = &H111
Private Const GWL_WNDPROC = (-4)
Private PrevProc As Long
Private FormObject As Form
Private CommandObject As CommandButton
Private Checking As Boolean
Public Sub HookForm(FormObj As Form, Button As CommandButton)
Set FormObject = FormObj
Set CommandObject = Button
PrevProc = SetWindowLong(FormObject.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(FormObject As Form)
SetWindowLong FormObject.hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Checking = True Then
WindowProc = 0
Exit Function
End If
If uMsg = WM_COMMAND Then CheckInfo
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
End Function
Public Sub CheckInfo()
Checking = True
On Error GoTo e
For i = 0 To FormObject.Controls.Count - 1
If FormObject.Controls(i).Text = "" Then
CommandObject.Enabled = False
Checking = False
Exit Sub
End If
e:
Next i
CommandObject.Enabled = True
Checking = False
End Sub
Никаких тегов вписывать на надо и в событиях контролов тоже ничего не надо писать. Просто вставляй нужное число текстбоксов и комбобоксов.
Если тебе нужно проверять символы - это тоже можно сделать в процедуре CheckInfo.
Будут вопросы - обращайся
Народ, а как при достижении MaxLength в textbox автоматичесски переходить в следуюший? У меня в text1.text MaxLength стоит 4. Я добавляю такую строчку:
If Text1.Text = Text1.MaxLength Then Text2.SetFocus
Запускаю, и у меня при вводе первого же символа курсор перескакивает в следующий textbox! Где лажа?
Полный код для text1 вот:
Private Sub Text1_Change()
Command1.Enabled = (Len(Text1.Text) = Text1.MaxLength) And (Len(Text2.Text) = Text2.MaxLength) And (Len(Text3.Text) = Text3.MaxLength)
If Text1.Text = Text1.MaxLength Then Text2.SetFocus
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
'***kolu steraemo 4uslo to***********
If KeyAscii = 8 Then Exit Sub
'****kolu vvodumo tsufru***************
If KeyAscii = 46 Or (KeyAscii > 47 And KeyAscii < 58) Then Exit Sub
'****kolu inwi sumvolu to ne vvodnmo i zvyk****
KeyAscii = 0
Beep
End Sub
Слушайте, а так не проще ли? Взять текстовые поля в массив, и таким макаром:
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
If (KeyAscii = 8) Or (KeyAscii = 46) Or ((KeyAscii > 47) And (KeyAscii < 58)) Then Exit Sub
KeyAscii = 0
Beep
End Sub
Private Sub Text1_LostFocus(Index As Integer)
For i = 0 To Me.Text1.UBound
If (Me.Text1.Item(i) = "" Or (Len(Me.Text1.Item(i)) < Me.Text1.Item(i).MaxLength) Then Me.Command1.Enabled = False: Exit Sub
Next i
Me.Command1.Enabled = True
End Sub
Вот и весь код. Вставляй сколь угодно текстбоксов, главное не забудь у всех выставить MaxLength, поставить текстбоксам индексы и изначально сделать кнопку.enabled=false.
Me.Text1.Item(i).MaxLength можно заменить конкретным числом, если оно известно заранее.
Что бы перескакивало можно такой код применить:
Private Sub Text1_Change(Index As Integer)
If Index < Me.Text1.UBound Then
If Len(Me.Text1.Item(Index)) = Me.Text1.Item(Index).MaxLength Then
Me.Text1.Item(Index + 1).SetFocus
End If
End If
End Sub
Здесь тоже Me.Text1.UBound и Me.Text1.Item(Index).MaxLength можно заменить конкретными числами, если они известны.
Еще можно это и под один If поставить, но для понятности так лучше...
Млин, забыл коменты вставить. Короче, Text1_KeyPress думаю и так понятно, для проверки введеных символов.
А в Text1_LostFocus я чуть нагнал (только сейчас сообразил, когда коммент хотел написать )), что в условии выражение (Me.Text1.Item(i) = "" не нужно, а можно только (Len(Me.Text1.Item(i)) < Me.Text1.Item(i).MaxLength) оставить...
Ну, если длина меньше чем надо, то кнопка неактивна, выходим из саба...