Страница: 1 | 2 |
Вопрос: Вопрос по оптимизации кода
Добавлено: 20.12.07 13:26
Автор вопроса: KreAtoR
Ответы
Всего ответов: 21
Номер ответа: 16
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #16
Добавлено: 23.12.07 17:00
Дам, если буду знать, что такое "сорсы".
Номер ответа: 17
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #17
Добавлено: 23.12.07 17:01
Дам, если буду знать, что такое "сорсы".
Номер ответа: 18
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #18
Добавлено: 23.12.07 17:54
Думаю, это исходный код aka sources
Номер ответа: 19
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #19
Добавлено: 23.12.07 22:31
Понятно. Тогда - пожалуйста, вот коды. В них, правда, много такого, что никому, кроме меня, не понадобится, но упростить функцию очень легко - просто вырезайте ненужные блоки.
'КЛЮЧЕВЫЕ СЛОВА ДЛЯ СВОЙСТВА Tag
'num - числовое поле
'an+ - любое положительное число или 0
'int - целое число
'in+ - целое положительное число или 0
'max(99) - максимальное значение числа для числового поля
'leng4(10) - длина поля (только для DataGrid. 4 - номер столбца, 10 - макс. кол-во символов)
'date - дата/время
'nospace - запрет ввода пробелов
'TFR - только цифры и буквы, причем буквы необходимо преобразовать в заглавные
'apos - разрешение ввода апострофа (по умолчанию запрещено)
'Ключевые слова в таге для наглядности лучше (хотя и не обязательно) писать через дефис.
'Например: num-in+max(150)
'Последовательность ключевых слов - любая.
'в противном случае она содержит ссылку на активную форму
'Переменная vpDecim - разделитель десятичной дроби; значение присваивается при запуске программы. Может быть точка или запятая (а разделитель разрядов - пробел или ничего); в противном случае программа не запустится.
Public objOBJ As Object, objFRM As Form
Public vpDecim As String*1, strSTR As String, booSIZE As Boolean
'Меню неактивно, если контрол, на котором установлен фокус, не допускает вставки,
'если в Буфере не текст, а что-то другое, и если форма защищена от изменений
'Подпрограмма находится в модуле MDI-формы
Private Sub mnuEditPaste_Click()
If (objFRM Is Nothing) Then Set objOBJ = ActiveForm.ActiveControl _
Else Set objOBJ = objFRM.ActiveControl
'Флаг для проверки, не находится ли активный контрол в DataRepeater
Dim repBOO As Boolean
repBOO = (TypeName(objOBJ) = "ataRepeater"
'Проверяем, подходит ли содержимое буфера для поля
'Если не подходит, то функция возвращает True
If ClpboardValidateFM(objOBJ) Then Exit Sub
'....................................
'Далее производится вставка. При необходимости текст в Буфере редактируется
'Неотредактированный текст вставляется непосредственно из Буфера; если же было редактирование (If booSIZE = True), то из переменной StrSTR
'....................................
booSize = False
End Sub
'ФУНКЦИЯ-ВАЛИДАТОР ВСТАВКИ
'В случае отмены операции выдает сообщение и возвращает True
'Тоже находится в модуле MDI-формы
Dim clpSTR As String, tagSTR As String
Dim A As Integer, B As Integer
'Текст из Буфера присваиваем переменной просто потому, что с переменной программе легче
работать
clpSTR = Clipboard.GetText
'Если контрол находится в DataRepeater, то получаем ссылку на этот контрол (из свойства
юзер-контрола uscAdo1 - самодельного бегунка по записям базы данных)
If (TypeName(myCTL) = "ataRepeater" Then Set myCTL = myCTL.Parent.uscAdo1.RepControl
'Значение Tag тоже присваиваем переменной, чтоб каждый раз не обращаться к свойству
tagSTR = myCTL.Tag
'Не содержит ли текст апострофа ///////////////////////////////
If (clpSTR Like "*'*" And Not (tagSTR Like "*apos*" Then
MsgBox "Вставка невозможна, поскольку текст в Буфере обмена содержит символ,
запрещенный в данном поле (апостроф)"
ClpboardValidateFM = True
Exit Function
'Можно ли вводить пробелы? ///////////////////////////////
ElseIf (tagSTR Like "*nospace*" Then
If (clpSTR Like "* *" Then
MsgBox "В это поле нельзя вводить пробелы!"
ClpboardValidateFM = True
Exit Function
End If
End If
'Теперь работаем в зависимости от того, какой контрол
'Для DataGrid ///////////////////////////////////////////////////////
If (TypeName(myCTL) = "ataGrid" Then
'Не содержит ли текст в Буфере абзаца?///////////////////////////////
If (InStr(clpSTR, Chr(13)) <> 0) Then
MsgBox "В сетку нельзя вводить абзацы"
ClpboardValidateFM = True
Exit Function
'Не слишком ли длинный текст получится после вставки?///////////////////////////////
ElseIf (tagSTR Like "*leng" & CStr(myCTL.Col) & "*" Then
A = InStr(1, tagSTR, "leng" & CStr(myCTL.Col) & "" + 6
B = InStr(A, tagSTR, ""
A = Val(Mid(tagSTR, A, B - A))
If (Len(myCTL.Text) - Len(myCTL.SelText) + Len(clpSTR)) > A Then
MsgBox "Слишком длинный текст для вставки в данное поле"
ClpboardValidateFM = True
Exit Function
End If
End If
'Числовых полей в моих сетках нет, поэтому пропускаем проверку чисел
GoTo Connt
End If
'Проверяем текст-боксы //////////////////////
'Не слишком ли длинный текст?////////////////
If (myCTL.MaxLength <> 0) Then
If (Len(myCTL.Text) - myCTL.SelLength + Len(clpSTR)) > myCTL.MaxLength Then
MsgBox "Слишком длинный текст в Буфере для вставки в данное поле"
ClpboardValidateFM = True
Exit Function
End If
End If
Cnnt1:
'Только цифры и буквы; буквы преобразуются в заглавные
'(в таких текст-боксах везде MaxLength = 2)
If (tagSTR Like "*TFR*" Then
A = Len(clpSTR)
For B = 1 To A
Select Case Asc(Mid(clpSTR, B, 1))
Case Asc("0" To Asc("9", Asc("A" To Asc("Z", Asc("А" To Asc("Я"
Case Asc("a" To Asc("z", Asc("а" To Asc("я"
strSTR = UCase(clpSTR)
booSIZE = True
Case Else
MsgBox "В это поле можно вводить только цифры и буквы"
ClpboardValidateFM = True
Exit Function
End Select
Next B
End If
'Проверка числовых полей ///////////////////////
Connt:
If (tagSTR Like "*num*" Then
'На всякий случай триммируем текст
clpSTR = Trim(clpSTR)
Select Case vpDecim
Case "."
strSTR = clpSTR
Case ","
strSTR = Replace(clpSTR, ",", "."
End Select
'Число ли введено?//////////////////////////////
If (Replace(CStr(Val(strSTR)), ".", "," <> Replace(strSTR, ".", ",") Then
If Not IsNumeric(Right(clpSTR, 1)) Then
NoNumber:
MsgBox "Значение, вводимое в это поле, должно быть числом"
ClpboardValidateFM = True
Exit Function
ElseIf (Replace(CStr(Val(strSTR & "1"), ".", "," <> Replace(strSTR & "1", ".", ",") Then
GoTo NoNumber
End If
End If
'Положительное число или ноль //////////////////
If (tagSTR Like "*an+*" Then
If Left(clpSTR, 1) = "-" Then
Nxt1:
MsgBox "В это поле можно вводить только положительные числа"
ClpboardValidateFM = True
Exit Function
End If
'Целое ли число? //////////////////////////////
ElseIf (tagSTR Like "*int*" Then
If (clpSTR Like "*.*" Or clpSTR Like "*,*" Then
Nxt2:
MsgBox "В это поле можно вводить только целые числа"
ClpboardValidateFM = True
Exit Function
End If
'Целое положительное число ///////////////
ElseIf (tagSTR Like "*in+*" Then
If (clpSTR Like "*.*" Or clpSTR Like "*,*" Then
GoTo Nxt2
ElseIf Left(clpSTR, 1) = "-" Then
GoTo Nxt1
End If
End If
'Проверяем максимальное значение числа
If (tagSTR Like "*max(*)*" Then
A = InStr(1, tagSTR, "max(" + 4
B = InStr(A, tagSTR, ""
tagSTR = Mid(tagSTR, A, B - A)
If (Val(Replace(clpSTR, ",", ".") > Val(tagSTR)) Then
MsgBox "В это поле можно вводить числа не больше " & tagSTR
ClpboardValidateFM = True
Exit Function
End If
End If
'В числовом поле предварительно очищаем поле
'Для моих задач удобнее, чтобы при вставке из Буфера одно число просто заменялось другим
myCTL.Text = ""
'При необходимости вставлять не текст из Буфера, а его отредактированный вариант, присваиваем значения переменным
If (Clipboard.GetText <> clpSTR) Then
strSTR = clpSTR
booSIZE = True
End If
End If
End Function
Номер ответа: 20
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #20
Добавлено: 24.12.07 16:50
И так на каждый TextBox
Номер ответа: 21
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #21
Добавлено: 24.12.07 20:43
Их у меня сотни две в проекте. Плюс 6 штук DataRepeater и несколько гридов. И на все одна универсальная функция. По-моему, неплохо. Впрочем, если бы Вы посоветовали более эффективный способ, я был бы Вам очень благодарен.
(Проверка события Change не годится для базы данных, т.к. это событие наступает в каждом поле при каждой смене записи, и программа всякий раз будет вхолостую проверять все поля.)
Впрочем, существует неплохой набор ActiveX - текстбоксов, которые можно просто настроить на запрет ввода определенных символов - и всё! Но мне они достались уже тогда, когда программа была почти готова - не переделывать же весь проект!