Visual2000 · Архив статей А.Колесова & О.Павловой
Андрей Колесов, Ольга Павлова
© 1998, Андрей Колесов, Ольга ПавловаИногда возникает необходимость переписать в переменные информацию, хранящуюся в полях базы данных. Это можно сделать с помощью метода 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
Довольно часто случается, что на форме слишком мало места для размещения окна списка, которое бы полностью выводило свои элементы. В этом случае можно воспользоваться следующим простым кодом, с помощью которого элементы списка выводятся в виде подсказок 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
Здесь мы покажем, как организовать проверку в текстовых окнах или других элементах управления, которые поддерживают событие 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, то есть разрешать или запрещать ее использование.
Обратите внимание, что в данном примере регистр клавиатуры не влияет на проверку ввода данных. Например, если второй параметр равен "абвгдежз", то вы также сможете вводить и "АБВГДЕЖЗ".
Элемент управления 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.