Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Леонтьев Б.К. Я изучаю Microsoft Office Visio 2003 (PDF)

.pdf
Скачиваний:
681
Добавлен:
02.05.2014
Размер:
919.27 Кб
Скачать

Использование редактора Visual Basic

281

 

 

 

Temp = Temp + Number

End If

Temp = Temp Xor (10 — Number)

Password = Password & Chr$(Temp)

Counter = Counter + 1

Loop

EncryptPassword = Password

End Function

Function DecryptPassword(Number As _

Byte, EncryptedPassword As String)

Dim Password As String, Counter As Byte

Dim Temp As Integer

Counter = 1

Do Until Counter = _

Len(EncryptedPassword) + 1

Temp = Asc(Mid(EncryptedPassword, _

Counter, 1)) Xor (10 — Number)

If Counter Mod 2 = 0 Then 'see if even

Temp = Temp + Number

Else

Temp = Temp — Number

End If

Password = Password & Chr$(Temp)

Counter = Counter + 1

Loop

DecryptPassword = Password

End Function

Отслеживание DOUBLE CLICK для кнопок на «тулбаре»

Visual Basic 6.3 поддерживает встроенный в Windows XP контрол Toolbar, позволяющий пользователям добавлять кнопки на Тулбар. У этих кнопок есть событие ButtonClick, но если вы хотите отлавливать dou# ble#click, то стандартного события ButtonDoubleClick нет. Для того, чтобы исправить это, объявите две переменные уровня формы:

Private mbSingleClicked As Boolean Private mbDoubleClicked As Boolean

In the Toolbars ButtonClick event, add this code:

В событии ButtonClick Тулбара добавьте следующий код:

Private Sub Toolbar1_ButtonClick_

(ByVal Button As Button)

Dim t As Single

t = Timer

282

Использование редактора Visual Basic

 

 

 

If mbSingleClicked = True Then mbDoubleClicked = True

MsgBox "Double Clicked" Else

mbSingleClicked = True

'позволить юзеру кликнуть еще раз, если он хочет дабл кликнуть Do While Timer — t < 1 And mbSingleClicked = True

DoEvents Loop

'если юзер сделал DoubleClick, выйти из процедуры

If mbDoubleClicked = True Then mbSingleClicked = False mbDoubleClicked = False

Exit Sub

End If

End If

If mbDoubleClicked = False Then MsgBox "Single Clicked"

End If

'пример обработки этих событий 'If mbDoubleClicked Then ' code

'ElseIf mbSingleClicked Then ' code

'End If

'при выходе из процедуры надо реинитить переменные, иначе мы 'упремся в SingleClickи

If mbDoubleClicked = False Then mbSingleClicked = False mbDoubleClicked = False

End If

End Sub

Объем каталога в байтах

Эта функция возвращает число байт, занятых файлами в каталоге:

Function DirUsedBytes(ByVal dirName As _ String) As Long

Dim FileName As String

Dim FileSize As Currency

' добавить \, если не было

If Right$(dirName, 1) <> "\" Then dirName = dirName & "\"

Endif

Использование редактора Visual Basic

283

 

 

 

FileSize = 0

FileName = Dir$(dirName & "*.*") Do While FileName <> "" FileSize = FileSize + _ FileLen(dirName & FileName) FileName = Dir$

Loop

DirUsedBytes = FileSize End Function

Пример вызова такой функции:

MsgBox DirUsedBytes(«C:\Windows»)

Как сделать имитацию нажатия клавиши CTRL для выделения несвязанных кусков в LIST BOX

Когда свойство MultiSelect обычного listboxа установлено в 1 — Simple или в 2 — Extended, то юзеру надо жать Ctrl при кликании внутри этого listboxа, чтобы выделять несвязанные (не идущие подряд) элементы. Следующий метод позволяет пользователю выбирать несколько элемен тов, не нажимая при этом Ctrl. Поместите нижеприведенный код в модуль.

Declare Function GetKeyboardState Lib _ "user32" (pbKeyState As Byte) _

As Long

Declare Function SetKeyboardState Lib _ "user32" (lppbKeyState As Byte) _

As Long

Public Const VK_CONTROL = &H11 Public KeyState(256) As Byte

Этот код поместите в событие MouseDown вашего listboxа (назовем его List1), у которого свойство MultiSelect установлено в Simple или

Extended:

' "нажимает" Ctrl GetKeyboardState KeyState(0) KeyState(VK_CONTROL) = _ KeyState(VK_CONTROL) Or &H80 SetKeyboardState KeyState(0)

Этот код поместите в процедуру, в которой надо «отжать» Ctrl, к примеру, List1_LostFocus:

' "отжимает" Ctrl

GetKeyboardState KeyState(0)

KeyState(VK_CONTROL) = _

KeyState(VK_CONTROL) And &H7F

SetKeyboardState KeyState(0)

284

Использование редактора Visual Basic

 

 

 

Имя текущего компьютера

Часто вам надо знать имя текущего компьютера под Windows XP из вашей VB программы. Используйте эту простенькую функцию API из kernel32.dll:

Private Declare Function GetComputerNameA Lib "kernel32"_ (ByVal lpBuffer As String, nSize _ As Long) As Long Public Function GetMachineName() As _ String

Dim sBuffer As String * 255

If GetComputerNameA(sBuffer, 255&) _ <> 0 Then GetMachineName =

Left$(sBuffer, _ InStr(sBuffer, vbNullChar) _ — 1) Else

GetMachineName = "(Not Known)" End If

End Function

Перехват правых кликов на узлах TREEVIEW

Событие Treeview_MouseDown происходит до события NodeClick. Для того, чтобы показать контекстное меню над узлом, используйте этот код и определите ключ (Key) для для каждого узла в виде буквы и идущим за ней числом.

+ Root (R01) ' the letter gives

| Child 1 (C01) ' the indication to | + Child 2 (C02) ' the context menu | | Child 2.1 (H01)

| | Child 2.2 (H02)

Dim bRightMouseDown as Boolean Private Sub Form_Load() bRightMouseDown = False

End Sub

Private Sub treeview1_MouseDown_ (Button As Integer, Shift As _ Integer, X As Single, Y As Single) If Button And vbRightButton Then bRightMouseDown = True

Else

bRightMouseDown = False End If

End Sub

Private Sub treeview1_MouseUp_ (Button As Integer, Shift As _ Integer, X As Single, Y As Single) bRightMouseDown = False

Использование редактора Visual Basic

285

 

 

 

End Sub

Private Sub treeview1_NodeClick_ (ByVal Node As Node)

Select Case Left(Node.Key, 1) Case "R"

If Not bRightMouseDown Then

'do the normal node click,

'so you must here the code

'for the node code click Else

'выбор узла

treeview1.Nodes(Node.Key).Selected = True

'показать контекстное меню PopupMenu mnuContext1

End If Case "C"

If Not bRightMouseDown Then

'do the normal node click,

'so you must here the code

'for the node code click Else

'выбор узла

treeview1.Nodes(Node.Key).Selected = True

'показать контекстное меню PopupMenu mnuContext2

End If

'то же с остальными узлами

'....

End Select

End Sub

Горячие кнопки

В Visual Basic 6.3 нажмите Ctrl#F3 когда курсор находится над каким либо словом. При этом автоматически будет найдено следующее вхождение этого слова в тексте, минуя диалог поиска. Курсор должен стоять как минимум за первой буквой слова, чтобы это работало правильно.

В Visual Basic 6.3 нажатием Ctrl#Tab можно перемещаться между всеми открытыми окнами в IDE, это часто оказывается быстрее, чем идти в меню Windows.

286

Использование редактора Visual Basic

 

 

 

Как получить USERID

Часто вам надо получить userID текущего юзера, работающего с вашей программой. Используйте для этого модификацию одной из функций API:

Option Explicit

Private Declare Function WNetGetUserA _ Lib "mpr" (ByVal lpName As String, _ ByVal lpUserName As String, _

lpnLength As Long) As Long Function GetUser() As String

Dim sUserNameBuff As String * 255 sUserNameBuff = Space(255)

Call WNetGetUserA(vbNullString, _ sUserNameBuff, 255&)

GetUser = Left$(sUserNameBuff, _ InStr(sUserNameBuff, _ vbNullChar) — 1)

End Function

Вывод песочных часов во время обработки данных

Нижеуказанная методика упрощает переключение MousePointer, без добавления специального кода в конце каждой процедуры/функции. Когда вы создаете объект из какого либо класса, генерируется событие Initialize. Затем исполняется код соответствующей процедуры. Это пер вый код, исполняемый для данного объекта, он исполняется до присво ения каких либо свойств объекту и до выполнения методов объекта. Когда переменная выходит из области видимости, все ссылки на объект уничтожаются, и выполняется код для события Terminate.

Declare Sub Sleep Lib "kernel32" _ (ByVal dwMilliseconds As Long)

'пример процедуры, использующей класс CHourGlass Private Sub ProcessData()

Dim MyHourGlass As CHourGlass Set MyHourGlass = New CHourGlass

'здесь вставляется код обработки данных Sleep 5000

'Это моделирует обработку данных

'продолжение кода

End Sub

'создание класса CHourGlass: Private Sub Class_Initialize()

'Показать HourGlass

Использование редактора Visual Basic

287

 

 

 

Screen.MousePointer = vbHourglass End Sub

Private Sub Class_Terminate() ' Восстановить MousePointer

Screen.MousePointer = vbDefault End Sub

Быстрый «обсчет» многочленов

Хорошо известная формула Горнера позволяет быстро считать по линомиальные выражения. Для того, чтобы посчитать:

A*x^N + B*x^(N#1) + … + Y*x + Z (^ означает степень), напишите:

(…((A*x + B)*x + C)*x + … +Y)*x + Z.

Последовательные номера версий

Для слежения за последовательностью версий, используйте эту процедуру, если вы используете номер версии:

Public Function GetMyVersion() As String

' конвертирует номер версии в нечто вроде "1.02.0001" Static strMyVer As String

If strMyVer = "" Then

strMyVer = Trim$(Str$(App.Major)) & "." & _ Format$(App.Minor, "##00") _

& "." Format$(App.Revision, "000") End If

GetMyVersion = strMyVer End Function

Изменение размера выпадающей области на COMBOBOX

В Visual Basic 6.3 нет свойства ListRows, то есть если вам надо изо бразить более чем восемь дефолтовых строк на выпадающем списке comboboxа, то используйте эту процедуру для увеличения размера окна comboboxа:

Option Explicit

Type POINTAPI

x As Long

y As Long

End Type

Type RECT

Left As Long

Top As Long

Right As Long

288 Использование редактора Visual Basic

Bottom As Long End Type

Declare Function MoveWindow Lib _ "user32" (ByVal hwnd As Long, _ ByVal x As Long, ByVal y As Long, _ ByVal nWidth As Long, _

ByVal nHeight As Long, _

ByVal bRepaint As Long) As Long Declare Function GetWindowRect Lib _ "user32" (ByVal hwnd As Long, _ lpRect As RECT) As Long

Declare Function ScreenToClient Lib _ "user32" (ByVal hwnd As Long, _ lpPoint As POINTAPI) As Long

Public Sub Size_Combo(rForm As Form, _ rCbo As ComboBox)

Dim pt As POINTAPI Dim rec As RECT

Dim iItemWidth As Integer

Dim iItemHeight As Integer

Dim iOldScaleMode As Integer

'Смена Scale Mode формы на Pixels iOldScaleMode = rForm.ScaleMode rForm.ScaleMode = 3

iItemWidth = rCbo.Width

'Установка новой высоты comboboxа

iItemHeight = rForm.ScaleHeight — rCbo.Top — 5 rForm.ScaleMode = iOldScaleMode

'Получение координат по отношению к экрану Call GetWindowRect(rCbo.hwnd, rec)

pt.x = rec.Left pt.y = rec.Top

'затем координаты в форме

Call ScreenToClient(rForm.hwnd, pt) ' Изменение размера comboboxа

Call MoveWindow(rCbo.hwnd, pt.x, _ pt.y, iItemWidth, iItemHeight, 1) End Sub

Сколько вам лет?

Эта функция возвращает разницу между двумя датами в годах, ме сяцах и днях:

Использование редактора Visual Basic

289

 

 

 

Function GetAge(dtDOB As Date, _ Optional dtDateTo As Date = 0) _ As String

' dtDateto передана? If dtDateTo = 0 Then dtDateTo = Date

End If

GetAge = Format$(dtDateTo — _ dtDOB, "yy — mm — dd")

End Function

Создать на лету массив при помощи функции ARRAY

Метод GetRows копирует строки Recordset (JET) или rdoResultset

(RDO) в массив. Этот метод использует переменную типа Variant в каче стве параметра для хранения возвращаемых данных. Это двумерный мас сив (по внутреннему представлению VB):

Dim A As Variant

A = Array(10,2)

Упаковка значений CHECK BOX в одну переменную типа INTEGER

Используя следующий код, можно вывести двоичное представле ние зачеркнутых check box:

Function WhichCheck(ctrl As Object) As _

Integer

Эта функция возвращает двоичное представление массива кон тролов, где каждый зачеркнутый чекбокс представляется двойкой в сте пени своего индекса в массиве, к примеру, элемент 0: 2 ^ 0 = 1, элементы 0 и 2: 2^0 + 2^2 = 5

Dim i

Dim iHolder

'если некорректный параметр передан в процедуру

'возвращается 0

On Error GoTo WhichCheckErr

'двоичное представление

'массива чекбоксов

For i = ctrl.LBound To ctrl.UBound If ctrl(i) = 1 Then

' если зачеркнут, добавить его двоичное представление iHolder = iHolder Or 2 ^ i

End If

290 Использование редактора Visual Basic

Next

WhichCheckErr:

WhichCheck = iHolder

End Function

Функция вызывается следующим образом:

iCurChecked = WhichCheck(Check1)

Check1 — массив чекбоксов, iCurChecked — переменная integer. Ниже приведена «двойственная» процедура, устанавливающая все чек боксы согласно переменной, в которой хранятся их двоичные представ ления.

Sub SetChecked(ctrl As Object, _ iCurCheck%)

'This sub sets the binary value of an

'array of controls where iCurChecked is

'2 raised to the index of each checked

'control

Dim i

'in case ctrl is not a valid object On Error GoTo SetCheckErr

'use the binary representation to

'set individual check box controls For i = ctrl.LBound To ctrl.UBound If iCurCheck And (2 ^ i) Then

'if it is checked add in its

'binary value

ctrl(i).Value = 1 Else ctrl(i).Value = 0 End If

Next SetCheckErr: End Sub

Эта процедура вызывается так:

Call SetChecked(Check1, iDesired)

Check1 — массив чекбоксов, iDesired — переменная, хранящая двоичное представление состояния чекбоксов.

Условная компиляция кода

Вы можете объявлять процедуры Windows API для 16 или 32 раз рядных операционных систем при использовании Conditional Compila tion из Visual Basic 6.3:

Использование редактора Visual Basic

291

 

 

 

#If Win#32 then

'если 32 разрядная ОС Declare SomeApi....

#Else

'если запущена 16 разрядная ОС Declare SomeApi

#End IF

Это же может работать не только с функциями Windows API, но и с вашими собственными функциями:

#If Win32 Then Dim lRc&

lRc& = ReturnSomeNumber(35000) #Else

Dim lRc%

lRc% = ReturnSomeNumber(30000) #End If

#If Win32 Then

Private Function ReturnSomeNumber_ (lVar&) As Long

ReturnSomeNumber = 399999 #Else

Private Function ReturnSomeNumber_ (lVar%) As Integer ReturnSomeNumber = 30000

#End If

End Function

Уменьшить мерцание во время загрузки формы

Во время загрузки формы, следующий код поможет уменьшить мерцание и мелькание GUI при помощи функций API:

'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

Public Sub LoadSomeForm()

' Во время загрузки формы запрещает обновление состояния окна

292

Использование редактора Visual Basic

 

 

 

'чтобы избавиться от мерцания.

'запрещает обновление GUI LockWindowUpdate frmTest.hWnd

'показывает форму

frmTest.Show

'здесь код, относящийся к загрузка формы и т.п.

'Никогда не забывайте разрешить обратно обновление окна LockWindowUpdate 0

End Sub

Спрятать указатель на текущую запись в DBGride

Для того, чтобы указатель записи на 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

Как узнать разделители даты и времени без функции API

Вот простой алгоритм, как узнать разделители даты, времени и де сятичной точки в 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)

Использование редактора Visual Basic

293

 

 

 

Дублирование строк кода без синтаксических ошибок

Часто приходится переписывать сходный по смыслу код с неболь шими изменениями в каждой строке; для облегчения проблемы можно сделать шаблон того, что надо копировать, быстро вставлять копию в нужное место, и делать добавления. Однако часто шаблонный текст вы зывает ошибки со стороны Visual Basic 6.3 редактора. Одолеть эту про блему можно, закомментировав шаблон перед использованием. Когда вы закончите редактирование вставленного фрагмента, раскомменти руйте его и он готов. Это особенно просто под Visual Basic 6.3, в котором есть команда 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 раз, вернитесь к началу и впе чатайте имена свойств и полей, и уберите символ комментария. Символ комментария позволяет вам свободно бегать по всему фрагменту, не за ботясь о синтаксических ошибках.

Ярлык для загрузки последнего рабочего проекта в Visual Basic 6.3

Часто вы стартуете Visual Basic 6.3 и возобновляете работу с по следним проектом, но вам не хочется загромождать 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 _

294 Использование редактора Visual Basic

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

Создание временных файлов

При программировании баз данных можно создавать временные файлы для, к примеру, вывода результата инструкции 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

Использование редактора Visual Basic

295

 

 

 

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 соответственно.

Центрировать форму с учетом TaskBar

Для центрирования формы вам надо лишь вызвать API процедуру, и завести две константы. Это решение основано на том факте, что GetSystemMetrics возвращает истинное значение параметров экрана, ко торый может быть на самом деле занят таскбаром и Microsoft Office short cut barом:

Public Const SM_CXFULLSCREEN = 16

Public Const SM_CYFULLSCREEN = 17

296 Использование редактора Visual Basic

#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

Очистка строки от ненужных символов

Иногда бывает полезно иметь функцию, которая очищает строку от нежелательных символов. Эта маленькая функция принимает в каче стве параметров строку для очистки и символ, от которого ее надо очис тить:

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

Добавление строки в TEXT BOX

Используйте данный код, чтобы заставить скроллер TextBox авто матически передвинуться, когда вы добавляете новый текст:

' Переход к концу текста MyTextBox.SelStart = Len(MyTextBox.Text)

Использование редактора Visual Basic

297

 

 

 

' Новый текст будет стоять здесь MyTextBox.SelText = NewText$

Проверка аргументов в функции VAL

При использовании функции Val, Visual Basic 6.3 капризничает, порождая ошибку несоответствия типов. Например, Val(«25%») пра вильно возвращает 25, тогда как Val(«2.5%») неправильно интерпретиру ет входной параметр и возвращает ошибку несоответствия типов.

Это случается только тогда, когда в строке присутствует десятич ная точка и символ «%» или «&». Для того, чтобы исправить это, уберите эти символы из строки перед ее передачей в Val.

Ярлыки для Интернет

Visual Basic 6.3 умеет создавать web форму, но она работает только с Microsoft Internet Explorer и вам приходится таскать за собой SHD# OCVW.DLL при распространении программы. В случае, если вы исполь зуете функцию ShellExecute для запуска файла Internet Shortcut, то Windows запускает дефолтный браузер и переходит на указанный URL. Этот метод работает как Microsoft так и с Netscape браузерами, если они правильно прописаны в регистре, и вам не нужно перетаскивать никаких DLL при распространении программы.

Private Declare Function ShellExecute _ Lib "shell32.dll" Alias _ "ShellExecuteA" _

(ByVal hwnd As Long, _

ByVal lpOperation As String, _ ByVal lpFile As String, _

ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long Private Const SW_SHOWNORMAL = 1

'frm : ShellExecute использует обработчик окна.

'Вы можете использовать обработчик главного окна проги

'sUrl : это имя и путь к файлу .url (файл Internet shortcut)

'указывающий на Вашу страницу , напр.

'c:\MyWebPage.url использует Internet Explorer

'для создания файла ярлыка

Public Sub GoToMyWebPage(frm as Form, _ sUrl as string)

Dim lRet as Long

lRet = ShellExecute(frm.hwnd, _ "open", sUrl, vbNull, _ vbNullString, SW_SHOWNORMAL)

298

Использование редактора Visual Basic

 

 

 

If lRet <= 32 Then

'случилась ошибка. Некоторые из ошибок,

'возвращаемых ShellExecute:

'ERROR_FILE_NOT_FOUND = 2&

'ERROR_PATH_NOT_FOUND = 3&

'ERROR_BAD_FORMAT = 11&

'SE_ERR_NOASSOC = 31

'SE_ERR_OOM = 8

Else

' если браузер запущен! End If

End Sub

Просмотр содержания HELP файла

Многие программисты любят добавлять к своим приложениям и хелп файлы. Как открыть содержание help файла Windows из вашей программы? Вот пример кода с использованием Win32 API функции.

' Объявление

Const HELP_CONTENTS = &H3& ' Функции Вывода содержимого

Declare Function WinHelp Lib "user32" _ Alias "WinHelpA" _

(ByVal hwnd As Long, _

ByVal lpHelpFile As String, _ ByVal wCommand As Long, _ ByVal dwData As Long) As Long ' Код

Sub OpenHelpFile(HelpFileName As String) ' HelpFileName — путь к хелп файлу. WinHelp hwnd, HelpFileName, _ HELP_CONTENTS, 0

End Sub

Быстрый поиск в базе данных

В Visual Basic 6.3 нет встроенной процедуры типа DLookUp из Аccess. Вы можете использовать нижеприведенный код для получения Name объекта по его ID:

Public Function MyDLookUp(Column As _ String, TableName As String, _ Condition As String) As Variant

Dim Rec As Recordset

On Error GoTo MyDlookUp_Err

' gCurBase — глобальная переменая, указывающая на текущкю БД

Использование редактора Visual Basic

299

 

 

 

Set Rec = gCurBase.OpenRecordset_

("Select * From " & TableName)

Rec.FindFirst Condition

If Not Rec.NoMatch Then

'возвращает искомое поле, если найдено MyDLookUp = Rec(Column)

Exit Function End If

'возврат, если не найдено, или произошла другая ошибка MyDlookUp_Err:

MyDLookUp = 1 End Function

Легкое отслеживание положения фокуса

Lost_Focus и Got_Focus events часто используются для проверки правильности ввода текста. Вы можете использовать нижеприведенный код для отслеживания фокуса на форме, не программируя каждый кон трол отдельно.

Поместите timer control на форму, установите Interval property = 100 и Enabled = True.

Name the control tmrFocusTracking.

Timer event должен содержать следующий код: Private Sub tmrFocusTracking_Timer()

Dim strControlName As String Dim strActive As String strControlName = _ Me.ActiveControl.Name

Do

strActive = Me.ActiveControl.Name If strControlName <> strActive _ Then

Print strControlName & _ " — Lost Focus", _

strActive & " — Got Focus" strControlName = strActive End If

DoEvents Loop

End Sub

To implement universal highlighting, replace the Print statement with this code:

Me.Controls(strActive).SelStart = 0

300

Использование редактора Visual Basic

 

 

 

Me.Controls(strActive).SelLength = _ Len(Me.Controls(strActive))

Для проверки (validation) правильности текста вместо Print state# ment используйте вызов процедуры проверки.

К моменту, когда случается команда Print, strActive равен контро лу, имеющему фокус, и strControlName содержит имя контрола, который потерял фокус.

Не размещайте эту процедуру где либо кроме таймера.

Незакрывающаяся форма

В случае, если выставить свойство ControlBox на форме в False, то кнопки Minimize и Maximize тоже исчезнут. Предположим, что вы хотите тем не менее давать возможность юзеру использовать кнопки Minimize и Maximize, но при этом чтобы он не мог закрыть форму кнопкой с крести ком. Добавьте следующий код в событие Query_Unload:

'если у Вас VB3, раскомментируйте следующую строку

'Const vbFormControlMenu = 0

Private Sub Form_QueryUnload(Cancel As _

Integer, UnloadMode As Integer)

If UnloadMode = vbFormControl_

Menu Then

Cancel = True

End If

End Sub

Как просто отформатировать и округлить число

Пример округления с заданной точностью:

n = 12.345 Format(n, "0.00\0")

'возвращает "12.350" Format(n, "0.\0\0")

'возвращает "12.00"

Format(0.55, "#.0\0") ' возвращает ".60"

Будьте осторожны, здесь вам не С!

VB программеры, привыкшие к С, могут быть введены в заблужде ние следующей особенностью VB. Рассмотрим код:

Dim x As Integer Dim y As Integer Dim z As Integer x = 10

y = 20