Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Вопрос по оптимизации кода Добавлено: 20.12.07 13:26  

Автор вопроса:  KreAtoR

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 16
Автор ответа:
 Иван



Вопросов: 34
Ответов: 53
 Web-сайт: www.harami.ru
 Профиль | | #16
Добавлено: 23.12.07 17:00
Дам, если буду знать, что такое "сорсы".

Ответить

Номер ответа: 17
Автор ответа:
 Иван



Вопросов: 34
Ответов: 53
 Web-сайт: www.harami.ru
 Профиль | | #17
Добавлено: 23.12.07 17:01
о, может еще и сорсы этой системы дашь?


Дам, если буду знать, что такое "сорсы".

Ответить

Номер ответа: 18
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #18
Добавлено: 23.12.07 17:54
Думаю, это исходный код aka sources

Ответить

Номер ответа: 19
Автор ответа:
 Иван



Вопросов: 34
Ответов: 53
 Web-сайт: www.harami.ru
 Профиль | | #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) = ";DataRepeater";)
'Проверяем, подходит ли содержимое буфера для поля
'Если не подходит, то функция возвращает 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) = ";DataRepeater";) 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) = ";DataGrid";) 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-сайт: www.harami.ru
 Профиль | | #21
Добавлено: 24.12.07 20:43
И так на каждый TextBox :)

Их у меня сотни две в проекте. Плюс 6 штук DataRepeater и несколько гридов. И на все одна универсальная функция. По-моему, неплохо. Впрочем, если бы Вы посоветовали более эффективный способ, я был бы Вам очень благодарен.
(Проверка события Change не годится для базы данных, т.к. это событие наступает в каждом поле при каждой смене записи, и программа всякий раз будет вхолостую проверять все поля.)
Впрочем, существует неплохой набор ActiveX - текстбоксов, которые можно просто настроить на запрет ввода определенных символов - и всё! Но мне они достались уже тогда, когда программа была почти готова - не переделывать же весь проект!

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам