Листинг 136 (к совету 136)


Attribute VB_Name = "Module1"
DefInt A-Z
Sub ChangeKeyAscii(KeyAscii, Filter$) 
'******************************************* 
' Замена введенного кода клавиши
' KeyAscii — введенный код клавиши (при входе) 
'                —  новый код (при выходе) 
' Filter$ —  строковая переменная, определяющая 
' режим перекодировки и формируемая 
' (и используемая) по такому правилу: 
'
' LEN(Filter$) =
' 1)  = 0 — без перекодировки
' 2)  >= 1 — в этом случае первый символ строки ВСЕГДА
'  определяет режим ввода "двойных кавычек" (код 34)
'  Chr34 = ASC(LEFT$(Filter$,1))
'  = 42 (символ *) — блокировка ввода кавычек
'  <> 42  — разрешен ввод кавычек
' Далее возможны такие варианты:
' 2а)  = 2 - стандартный вариант преобразования
'    Filter$ = CHR$(Chr34%) + CHR$(RusLat*&H10+UpLow), 
'    где RusLat = 0 — блокировка ввода латинских букв
'       = 1 - блокировка ввода русских букв
'       = Else — без преобразования
'   UpLow = 0 - маленькие —> большие
'       = 1 — большие —> маленькие
'       = Else — ничего не делаем
' 2б)  > 2 - задан список символов:
'   MID$(Filter$,3) — список символов
'   KodFilter =ASC(MID$(Filter$,2)) 
'        = 32 — допустимых символов
'        <> 32 — недопустимых
' ================================
'
' определение  режима перекодировки
  LenFilter = Len(Filter$)
  If LenFilter = 0 Or KeyAscii < 32 Then Exit Sub ' без преобразования
  '
  If KeyAscii = 34 And Asc(Filter$) = 42 Then
    ' блокировка ввода кавычки
    KeyAscii = 0: Exit Sub
  End If
  '
  If LenFilter > 1 Then
    CodeFilter = Asc(Mid$(Filter$, 2))
    If LenFilter = 2 Then
      ' стандартный вариант 2а)
      Symbol = -1
      ' определение типа символа: 0 - латинский,
      ' 1 - русский
      If (KeyAscii >= 65 And KeyAscii <= 90) Then Symbol = 0
      If (KeyAscii >= 97 And KeyAscii <= 122) Then Symbol = 0
      If KeyAscii >= 192 Then Symbol = 1
      ' блокировка ввода
      If Symbol = (CodeFilter And &HF) Then KeyAscii = 0
      If Symbol >= 0 And KeyAscii > 0 Then
        UpLow = (CodeFilter And &HF0) \ &H10
        ' преобразование: большие <-> маленькие
        ' можно воспользоваться операторами Lcase/Ucase
        Select Case UpLow
          Case 0   ' маленькие -> большие
            KeyAscii = KeyAscii And &HDF
          Case 1   ' большие -> маленькие
            KeyAscii = KeyAscii Or &H20
        End Select
      End If
    Else ' задан список допустимых/недопустимых символов
      If KeyAscii <> 34 Then
        CodeFilter = Sgn(CodeFilter - 32)
        If (Sgn(InStr(3, Filter$, Chr$(KeyAscii))) _
           Xor CodeFilter) = 0 Then KeyAscii = 0
      End If
    End If
  End If
End Sub

В начало статьи