61. СПРЯТАТЬ УКАЗАТЕЛЬ НА ТЕКУЩУЮ ЗАПИСЬ в DBGride
VB4 16/32, VB5 Level: Advanced
Для того, чтобы указатель записи на DBGride не скакал при перемещении между записями (строками grida), используйте функцию API LockWindowUpdate(gridname.hwnd) перед началом движения по gridу, и LockWindowUpdate(0) после окончания перемещений: 'Declarations Section #If Win32 Then Declare Function LockWindowUpdate _ Lib "user32" _ (ByVal hwndLock As Long) As Long #Else Declare Function LockWindowUpdate _ Lib "User" _ (ByVal hwndLock As Integer) _ As Integer #End If
Private Sub cmdHideSelector_Click() LockWindowUpdate DBGrid1.hWnd End Sub
Private Sub cmdShowSelector_Click() LockWindowUpdate 0 End Sub
62. USE POPUP MENUS IN WINDOWS WITHOUT TITLE BAR
VB4 16/32 Level: Intermediate
Когда Вы устанавливаете свойство ControlBox в False и BorderStyle в fixed window, то можете получить окно(форму) без titlebar (поля заголовка). Если же вы добавите меню на эту форму - титул-бар появится снова. Чтобы измежать этой проблемму вы можете разместить меню на другой форме. Private Sub Command1_Click() Dim frm As New frmMenu Load frm frm.PopupMenu frm.mnutest 'select specific code Unload frm End Sub
Такое поведение исправлено в VB5
63. КАК УЗНАТЬ РАЗДЕЛИТЕЛИ ДАТЫ И ВРЕМЕНИ БЕЗ ФУНКЦИЙ API
VB3, VB4 16/32, VB5 Level: Intermediate
Вот простой алгоритм как узнать разделители даты, времени и десятичной точки в Windows, не залезая в Locale Settings или функции API. DateDelimiter = Mid$(Format(Date, _ "General Date"), 3, 1) TimeDelimiter = Mid$(Format(0.5, _ "Long Time"), 3, 1) DecimalDelimiter = Mid$(Format(1.1, _ "General Number"), 2, 1)
64. ПРЕДОТВРАЩЕНИЕ ОШИБОК ПРИ ИСПОЛЬЗОВАНИИ GETSETTING
VB4 16/32, VB5 Level: Intermediate
Использование функции GetSetting может породить ошибки, особенно в некоторых ситуациях при 16-разрядной ОС при работе с INI файлами. Если искомого параметра нет в INI файле, то Вы можете увидеть сообщение об ошибке "Invalid procedure call.". Используйте нижеприведенную процедуру, которая подменяет обработчик ошибок: Public Function GetRegSetting(AppName _ As Variant, Section As Variant, _ Key As Variant, Optional Default _ As Variant) As Variant
' дефолтовое значение не имеет не-объектный тип , иначе придется ' использовать слово Set Dim tmpValue As Variant
' установка величины по умолчанию ' если величина передана не была, ' получаем пустую переменную типа Variant If Not IsMissing(Default) Then _ tmpValue = Default
' это отлавливает возможные ошибки On Error Resume Next
' теперь можно использовать функцию из VB tmpValue = GetSetting(AppName, _ Section, Key, tmpValue)
' после возможных ошибок вызов повторяется здесь ' с уже определенным значением tmpValue GetRegSetting = tmpValue
End Function
65. ДУБЛИРОВАНИЕ СТРОК КОДА БЕЗ СИНТАКСИЧЕСКИХ ОШИБОК
VB3, VB4 16/32, VB5 Level: Beginning
Часто мне приходится переписывать сходный по смыслу код с небольшими изменениями в каждой строке; для облегчения проблемы я делаю шаблон того, что надо копировать, быстро вставляю копию в нужное место, и делаю добавления. Однако часто шаблонный текст вызывает ошибки со стороны VB редактора. Одолеть эту проблему можно, закомментировав шаблон перед использованием. Когда Вы закончите редактирование вставленного фрагмента, раскомментируйте его и он готов. Это особенно просто под VB5, в котором есть команда Block Uncomment. Ниже приведен пример добавления члена в коллекцию. While Not mRS.EOF oObject.FName = mRS!FName oObject.LName = mRS!LName oObject.Phone = mRS!Phone . . cCollection.Add oObject, oObject.FName Wend
Если у Вашего объекта 20 или 30 свойств, быстрее будет создать шаблон: ' oObject. = mRS!
Скопируйте его, вставьте 20 или 30 раз, вернитесь к началу и впечатайте имена свойств и полей, и уберите символ комментария. Символ комментария позволяет Вам свободно бегать по всему фрагменту, не заботясь о синтаксических ошибках.
66. ЯРЛЫК ДЛЯ ЗАГРУЗКИ ПОСЛЕДНЕГО РАБОЧЕГО ПРОЕКТА В VB
VB4 32 Level: Intermediate
Часто я стартую VB и возобновляю работу с последним проектом, но мне не хочется загромождать desktop иконками для текущих работ. В качестве решения я предлагаю мою прогу, которую нужно скомпилировать и запустить на Вашем desktopе. Эту прогу можно применить и к другим, использующим INI файлы. Option Explicit
Declare Function GetPrivateProfile_ String Lib "kernel32" _ Alias "GetPrivateProfileStringA" _ (ByVal lpApplicationName As _ String, ByVal lpKeyName As Any, _ ByVal lpDefault As String, _ ByVal lpReturnedString As _ String, ByVal nSize As Long, _ ByVal lpFileName As String) _ As Long
Public Sub Main() Dim temp As String, rVal$, tmp _ As Long rVal$ = String$(256, 0) tmp = GetPrivateProfileString_ ("Visual Basic", _ "vb32location", "", rVal$, _ ByVal Len(rVal$) - 1, _ "c:\windows\vb.ini") temp = Left$(rVal$, tmp) rVal$ = String$(256, 0) tmp = GetPrivateProfileString_ ("Visual Basic", "RecentFile1", _ "", rVal$, ByVal Len(rVal$) _ - 1, "c:\windows\vb.ini") temp = temp & " """ & Left$(rVal$, _ tmp) & """" Shell temp, 1 End End Sub
67. КАК ВЫВЕСТИ СИМВОЛ "&" В LABEL
VB4 16/32, VB5 Level: Beginning
Если Вы хотите выывести символ ?&Ћ на экран, установите свойство "UseMnemonic" в False. Это свойство бывает полезно, когда, например, Labelы используются для вывода данных из баз данных. Также Вы можете вывести символ "&" в свойстве Caption, написав &&.
68. СОЗДАНИЕ ВРЕМЕННЫХ ФАЙЛОВ
VB3, VB4 16/32, VB5 Level: Beginning
Я пишу прогу с базами данных, использующую много вспомогательных файлов в одно и то же время. При программировании баз данных можно создавать временные файлы для, например, вывода результата инструкции SQL или из временной базы данных, чтобы более эффективно работать с записями. Я написал функцию FileAux, возварщающую имя временного файла. Если мне надо создать несколько временных файлов одновременно, я сохраняю их имена в заранее определенных переменных: Function FileAux(Ext As String) _ As String Dim i As Long, X As String If InStr(Ext, ".") = 0 Then Ext = "." + Ext End If
' Ищем уже имеющиеся файлы на винте i = 0 Do X = "Aux" + Format$(i, "0000") _ + Ext If FileExists(X) Then i = i + 1 Else Exit Do End If Loop FileAux = X End Function
Эта функция обращается к функции FileExists: Function FileExist(filename As String) _ As Boolean FileExist = Dir$(filename) <> "" End Function
А вот пример использования: Sub Test() Dim File1 As String, File2 As _ String, File3 As String Dim DB1 As database, DB2 As DataBase Dim FileNum As Integer File1 = FileAux("MDB") Set DB1 = CreateDataBase(File1) File2 = FileAux("MDB") Set DB2 = CreateDataBase(File2) File3 = FileAux("TXT") FileNum = FreeFile Open File3 For OutPut As FileNum ' Ваш код ' ... Close FileNum End Sub
File1, File2, и File3 должны быть "Aux0001.MDB," "Aux0002.MDB," и "Aux0001.TXT," соответственно.
69. МЫШИНЫЕ СОБЫТИЯ НЕ СЛУЧАЮТСЯ ЕСЛИ ENABLE УСТАНОВЛЕНО В FALSE
VB3, VB4 16/32, VB5 Level: Beginning
События MouseMove не происходят, если свойство Enabled контрола установлено в False. Мой метод лечит эту проблему и он может быть полезен, если Вы хотите вывести Tooltips или Notes на статусбаре, вне зависимости от того, enabled контрол или disabled. Если свойство Enabled контрола установлено в False, то контрол, помещенный за данным, тем не менее быдет отзываться на движения мыши. Скопируйте код из Command1_MoseMove в Label1_MouseMove. Теперь Ваш МаусМув работает даже если Command1 недоступна. Command1(0), Command1(1)-Command1 - массив контролов. Label1(0), Label1(1)- массив лабелов за контролами. SSPanel1-Работает статусбаром. Private Sub Form_Load() Dim i As Integer For i = 0 To 1 Label1(i).Left = Command1(i).Left Label1(i).Top = Command1(i).Top Label1(i).Width = Command1(i).Width Label1(i).Height = _ Command1(i).Height Next i Command1(0).enabled = false Command1(0).Tag = "Button to Add" Command1(1).Tag = "Button to Modify" Command1(0).Caption = "&Add" Command1(1).Caption = "&Modify"
End Sub
Private Sub Label1_MouseMove(Index As _ Integer, Button As Integer, Shift _ As Integer, X As Single, Y As _ Single) SSPanel1.Caption = Command1(Index).Tag End Sub
Private Sub Command1_MouseMove(Index _ As Integer, Button As Integer, _ Shift As Integer, X As Single, Y _ As Single) SSPanel1.Caption = Command!(Index).tag End Sub
70. КАК ВЫВЕСТИ СВОЕ POPUP MENU НА TEXT BOXES
VB4 16/32, VB5 Level: Intermediate
Некоторые контролы в VB4 и VB5 как, например, TextBox имеют по дефолту контекстное меню, выползающее при правом клике на указанном контроле. Если Вы хотите, чтобы выезжало другое котекстное меню, то стандартных методов или пропертей для этого не существует. Выход состоит в отлавливании события Mouse_Down, код которого будет делать контрол недоступным. Затем высвечивайте Ваше контекстное меню, энаблите контрол обратно. Процедура PopContextMenu описывает указанный метод Sub PopContextMenu(argoControl As _ Control, argoMenu As Control) argoControl.Enabled = False PopupMenu argoMenu argoControl.Enabled = True End Sub
Пример вызова в событии MouseDown для текстбтокса по имени Text1 и меню MyMenu: Private Sub Text1_MouseDown(Button As _ Integer, Shift As Integer, X As _ Single, Y As Single) If Button = vbRightButton Then PopContextMenu Text1, MyMenu End If End Sub
71. ЦЕНТРИРОВАТЬ ФОРМУ С УЧЕТОМ ТАСКБАРА
VB3, VB4 16/32, VB5 Level: Intermediate
Для центрирования формы Вам надо лишь вызвать API процедуру, и завести две константы. Это решение основано на том факте, что GetSystemMetrics возвращает истинное значение параметров экрана, который может быть на самом деле занят таскбаром и Microsoft Office shortcut barом: Public Const SM_CXFULLSCREEN = 16 Public Const SM_CYFULLSCREEN = 17
#If Win32 then Declare Function GetSystemMetrics _ Lib "user32" _ (ByVal nIndex As Long) As Long #Else Declare Function GetSystemMetrics _ Lib "User" _ (ByVal nIndex As Integer) _ As Integer #End If
Public Sub CenterForm(frm As Form) frm.Left = Screen.TwipsPerPixelX * _ GetSystemMetrics_ (SM_CXFULLSCREEN) / 2 _ - frm.Width / 2 frm.Top = Screen.TwipsPerPixelY * _ GetSystemMetrics_ (SM_CYFULLSCREEN) / 2 _ - frm.Height / 2 End Sub
72. ОЧИСТКА СТРОКИ ОТ НЕНУЖНЫХ СИМВОЛОВ
VB3, VB4 16/32, VB5 Level: Beginning
Иногда бывает полезно иметь функцию, которая очищает строку от нежелательных символов. Эта маленькая функция принимает в качестве параметров строку для очистки и символ, от которого ее надо очистить: Function StringCleaner(s As String, _ Search As String) As String Dim i As Integer, res As String res = s Do While InStr(res, Search) i = InStr(res, Search) res = Left(res, i - 1) & _ Mid(res, i + 1) Loop StringCleaner = res End Function
73. ПРОВЕРКА ОБЪЕКТОВ ПРИ ПОМОЩИ TYPENAME
VB4 16/32, VB5 Level: Beginning
Вы можете определить класс, к которому принадлежит объект, при помощи функции TypeName вместо использования блока If TypeOf. Используйте выражение TypeOf для определения типа объекта: If TypeOf myObject is myType then ... делаем то-то End If
Вы можете сделать то же савмое при помощи следующего кода: if TypeName(myObject) = "myType" Then .... делаем то-то.... End If
Выгода моего решения в том, что Вам вовсе не обязательно включать в Ваш проект все классы (или OCXs), с которыми Вы работаете. Это неплохой прием для написания общих процедур (универсальных, общего назначения) и , более того, Вы можете использовать TypeName в сложных проверках и блоках Select Case.
74. ДОБАВЛЕНИЕ СТРОКИ В TEXT BOX
VB4 16/32, VB5 Level: Intermediate
Используйте данный код, чтобы заставить скроллер TextBoxа автоматически передвинуться, когда Вы добавляете новый текст:
' Переход к концу текста MyTextBox.SelStart = Len(MyTextBox.Text) ' Новый текст будет стоять здесь MyTextBox.SelText = NewText$
75. ПРОВЕРКА АРГУМЕНТОВ В ФУНКЦИИ VAL
VB3, VB4 16/32, VB5 Level: Beginning
При использовании функции Val, VB капризничает, порождая ошибку несоответствия типов. Например, Val("25%") правильно возвращает 25, тогда как Val("2.5%") неправильно интерпретирует входной параметр и возвращает ошибку несоответствия типов. Это случается только тогда, когда в строке присутствует десятичная точка и символ "%" или "&". Чтобы исправить это, уберите эти символы из строки перед ее передачей в Val.