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