Visual2000 · Архив статей А.Колесова & О.Павловой

Советы тем, кто программирует на Visual Basic

Андрей Колесов, Ольга Павлова

© 1998, Андрей Колесов, Ольга Павлова
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале "КомпьютерПресс" N 3/98, с.194-195.


Совет 122. Используйте метод GetRows для сохранения полей базы данных в переменных

Иногда возникает необходимость переписать в переменные информацию, хранящуюся в полях базы данных. Это можно сделать с помощью метода GetRows объекта Recordset, который копирует одну или несколько строк данных непосредственно в переменные типа Variant и хранит эту информацию в виде двухмерного массива в formvarData(Field,Column).

Протестируем метод GetRow. Для этого поместим командную кнопку на VB-форму и введем следующий код в событие Click. Но прежде необходимо изменить путь к базе данных BIBLIO.MDB в методе OpenDatabase в соответствии с вашими установками, а также задать ссылку на Microsoft DAO 3.5 Object Library.

Private Sub cmdGetDataRow_Click()
    '
   ' Пример использования метода GetRow
    '
    Dim ws As Workspace, db As Database, rs As Recordset
    '
    Dim varDataRows As Variant, strMsg As String
    Dim intRows As Integer, intColumns As Integer
    '
    Dim intLoopRow As Integer, intLoopCol As Integer,
    '
    Set ws = DBEngine.CreateWorkspace(App.EXEName, "admin", "")
    Set db = ws.OpenDatabase("e:\devstudio\vb\biblio.mdb")
    Set rs = db.OpenRecordset("SELECT * FROM Authors")
    '
    intRows = InputBox("Введите количество строк", _
        "Пример использования метода GetRows", 0)
    intColumns = rs.Fields.Count
    varDataRows = rs.GetRows(intRows)
    '
    For intLoopRow = 0 To intRows - 1
        strMsg = ""
        For intLoopCol = 0 To intColumns - 1
            strMsg = strMsg & varDataRows(intLoopCol, intLoopRow) & vbCrLf
        Next
        MsgBox strMsg
    Next
    '
    rs.Close
    db.Close
    ws.Close
    '
End Sub

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

Совет 123. Вывод длинных элементов списка в виде подсказки ToolTip

Довольно часто случается, что на форме слишком мало места для размещения окна списка, которое бы полностью выводило свои элементы. В этом случае можно воспользоваться следующим простым кодом, с помощью которого элементы списка выводятся в виде подсказок ToolTip, если вы помещаете курсор мыши на окно списка.

Вначале создайте новый VB-проект и поместите на форму элемент управления ListBox. Затем объявите вызов функции SendMessage API и константу LB_ITEMFROMPOINT, необходимые для выполнения нашей задачи.

Option Explicit

' Объявляет вызов функции API
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
  lParam As Any) As Long
' Добавляет константу API
Private Const LB_ITEMFROMPOINT = &H1A9

После этого введите следующий код в событие Load для формы, чтобы заполнить окно списка:

Private Sub Form_Load()
    '
    ' Заполнение окна списка
    With List1
        .AddItem "Программирование баз данных в Visual Basic 5"
        .AddItem "Excel Visual Basic для разработки приложений"
        .AddItem "Руководство по VBA для MS Office 97"
    End With
End Sub

И наконец, в событии MouseMove элемента управления ListBox введите такой код:

Private Sub List1_MouseMove(Button As Integer, _
    Shift As Integer, X As Single, Y As Single)
    '
    ' Выводит соответствующую подсказку TipTool
    '
    Dim lXPoint As Long
    Dim lYPoint As Long
    Dim lIndex As Long
    '
    If Button = 0 Then ' если ни одна кнопка не была нажата
        lXPoint = CLng(X / Screen.TwipsPerPixelX)
        lYPoint = CLng(Y / Screen.TwipsPerPixelY)
        '
        With List1
         ' Выбирает элемент списка
         lIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, _
              ByVal ((lYPoint * 65536) + lXPoint))
            ' Выводит новую подсказку или стирает старую
            If (lIndex >= 0) And (lIndex <= .ListCount) Then
                .ToolTipText = .List(lIndex)
            Else
                .ToolTipText = ""
            End If
        End With '(List1)
    End If '(button=0)
    '
End Sub

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

Совет 125. Простая проверка ввода данных

Здесь мы покажем, как организовать проверку в текстовых окнах или других элементах управления, которые поддерживают событие KeyPress. Такая проверка очень проста, но во многих случаях она бывает крайне необходима.

Вначале добавьте следующую функцию к своему проекту:

Function ValiText(KeyIn As Integer, ValidateString As String, _
   Editable As Boolean) As Integer
    '
    Dim ValidateList As String
    Dim KeyOut As Integer
    '
    If Editable = True Then
         ValidateList = UCase(ValidateString) & Chr(8)
    Else
         ValidateList = UCase(ValidateString)
    End If
    '
    If InStr(1, ValidateList, UCase(Chr(KeyIn)), 1) > 0 Then
        KeyOut = KeyIn
    Else
        KeyOut = 0: Beep
    End If
    '
    ValiText = KeyOut
    '
End Function

Затем для каждого элемента управления, где вы хотите организовать проверку, введите в событие KeyPress код наподобие следующего:

KeyAscii = ValiText(Keyascii, "0123456789/-",True)

Он отфильтрует любые нежелательные нажатия клавиш, оставив только те, которые задаются с помощью второго параметра. В нашем примере параметр "0123456789/-" определяет символы, которые могут использоваться для ввода даты.

При помощи третьего параметра функции вы можете управлять клавишей Backspace, то есть разрешать или запрещать ее использование.

Обратите внимание, что в данном примере регистр клавиатуры не влияет на проверку ввода данных. Например, если второй параметр равен "абвгдежз", то вы также сможете вводить и "АБВГДЕЖЗ".

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

Совет 126. Управление длиной элемента списка ComboBox

Элемент управления ComboBox, в отличие от текстового окна, не имеет свойства MaxLength. Однако нет ничего проще, чем добавить недостающее свойство. Для этого достаточно ввести в событие KeyPress элемента управления ComboBox следующий код:

Private Sub Combo1_KeyPress(KeyAscii As Integer)
    '
    ' Если пользователь попытается нажать одиннадцатую клавишу и
    ' если эта клавиша не Backspace, то отменить данное событие
    '
    Const MAXLENGTH = 10
    If Len(Combo1.Text) >= MAXLENGTH And KeyAscii <> vbKeyBack Then
      KeyAscii = 0
    End If
End Sub

Константа MaxLength может иметь любое значение. Кроме того, вместо Backspace вы можете использовать любые другие клавиши. Для этого просто введите их значения KeyAscii, как показано в примере с клавишей Backspace.

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