VB5 App Wizard умеет создавать Web Browser-форму, но она работает только с Microsoft Internet Explorer и Вам приходится таскать за собой SHDOCVW.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) 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
77. ПРОСМОТР СОДЕРЖАНИЯ HELP-ФАЙЛА
VB4 32, VB5 Level: Intermediate
Многие программеры любят добавлять к свои приложениям и хелп-файлы. Как открыть содержание хелп-файла 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
78. ЗАДАНИЕ ГРАНИЦ MDI ФОРМЫ ТОЧНО КАК В DESIGN-TIME
VB3, VB4 16/32, VB5 Level: Beginning
Поскольку MDI-формы ни имеют свойства border, юзер может раздвигать их границы и менять размер MDI-форм. Если юзер пытается изменить размеры формы, а я этого не хочу (пусть остается такой как была создана мной), то процедура для события MDIForm_Resize() спасет (кого - по вкусу): Private Sub MDIForm_Resize() ' Запрет resizingа MDI-формы (растягивания границ и перемещения ее мышой). ? Годитсятолько для тех MDI форм, которые выводятся как Normal Window If WindowState = 0 Then ' заданная высота MDI формы Me.Height = 6900 ' заданная ширина MDI формы Me.Width = 10128 ' заданный левый край MDI формы Me.Left = 1020 ' заданный правый край MDI формы Me.Top = 1176 ' С таким же успехом можно использовать метод Move, чтобы объединить ? восстановление координат формы в одной команде End If End Sub
79. БЫСТРЫЙ ПОИСК В БАЗЕ ДАННЫХ
VB3, VB4 16/32, VB5 Level: Beginning
В VB нет встроенной процедуры типа DLookUp из Аксесса. Вы можете использовать нижеприведенный код для получения 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 - глобальная переменая, указывающая на текущкю БД 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
80. ЛЕГКОЕ ОТСЛЕЖИВАНИЕ ПОЛОЖЕНИЯ ФОКУСА
VB3, VB4 16/32, VB5 Level: Intermediate
Lost_Focus and 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 Me.Controls(strActive).SelLength = _ Len(Me.Controls(strActive))
Для проверки (validation) правильности текста вместо Print statement используйте вызов процедуры проверки. Используйте strActive in a Select Case structure К моменту , когда случается команда Print , strActive равен контролу, имеющему фокус, и strControlName содержит имя контрола, который потерял фокус. Не размещайте эту процедуру где-либо кроме таймера.
81. НЕЗАКРЫВАЮЩАЯСЯ ФОРМА
VB3, VB4 16/32, VB5 Level: Beginning
Если выставить свойство 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
82. ПОМЕНЯТЬ СВОЙСТВО ЦЕЛОЙ ГРУППЕ КОНТРОЛОВ
VB3, VB4 16/32, VB5 Level: Beginning
Вы можете легко сделать видимой/невидимой целую группу контролов. В режиме разработки, выделите все контролы, с которыми Вы будете производить данную операцию при выполнении программы. Нажмите F4, и присвойте свойству Tag имя группы, например Group1. Теперь при совершении групповой операции Вам поможет следующий код: For ind = 0 To Formname.Controls.Count _ - 1 If Formname.Controls(ind).Tag = _ "Group1" Then Formname.Controls(ind).Visible _ = True End If Next
83. КАК ПРОСТО ОТФОРМАТИРОВАТЬ И ОКРУГЛИТЬ ЧИСЛО
VB3, VB4 16/32, VB5 Level: Intermediate
Пример округления с заданной точностью. n = 12.345 Format(n, "0.00\0") ' возвращает "12.350" Format(n, "0.\0\0") ' возвращает "12.00" Format(0.55, "#.0\0") ' возвращает ".60"
84. БУДЬТЕ ОСТОРОЖНЫ, ЗДЕСЬ ВАМ НЕ С!
VB3, VB4 16/32, VB5 Level: Intermediate
VB программеры, привыкшие к С, могут быть введены в заблуждение следующей особенностью VB. Рассмотрим код: Dim x As Integer Dim y As Integer Dim z As Integer
x = 10 y = 20 z = 0
' пусть функция max возвращает большее из двух чисел if (z = max(x, y)) > 0 then Msgbox CStr(z) Else Msgbox "How Come?" End if
Вы ожидаете, что высветится 20, как должно бы было произойти в С? Однако, VB сравнит z с RHS (right-hand side)-правой стороной, даже перед присвоением, независимо от скобок. Будьте внимательны.
85. ИСПОЛЬЗОВАТЬ BACKQUOTES ВМЕСТО АПОСТРОФОВ
VB3, VB4 16/32, VB5 Level: Intermediate
Часто при использовании Transact-SQL мне надо перехватывать комментарии юзера из текстбокса и пересылать их в базу данных. Однако, если юзер нажимает апостроф в текстбоксе, происходит ошибка времени выполнения, поскольку SQL Server использует апостроф как признак конца строки. Чтобы обойти эту проблему, перехватите ввод юзера в событии KeyPress и замените апостроф на вот такую кавычку ??Ћ(ASCII(145)): Private Sub Text1_Keypress_ (KeyAscii as Integer) If KeyAscii = 39 Then KeyAscii = 145 End If End Sub
Также можно заменить все одинарные кавычки на ??Ћ перед отсылкой в SQL Server.
86. РАСПРОСТРАНЕНИЕ НОВЫХ ВЕРСИЙ ПРОГРАММЫ ПО СЕТИ
VB4 16/32, VB5 Level: Intermediate
Я пишу VB проги для сети с примерно 300 юзерами. Довольно трудно своевременно уследить за распространением каждой новой версии проги на всех машинах, поэтому я использую такую фичу VB автоинкрементирующаяся нумерация версий для проверки, требуется ли апгрейд проги на конкретной машине. При компиляции проги установите автоинкремент версий в On. Сохраните Ваши setup/upgrade файлы на сетевом диске (настоятельно рекомендую использовать UNC-пути (\\имя_машины\имя_диска) нежели просто имена дисков), и положите INI-файл проги, в котором указан номер новейшей версии. Затем вставьте следующий код в прогу, событие Form_Load: Open IniFile$ For Input As #1 Line Input #1, sUpgradeVersion$ Close #1
If sUpgradeVersion > (Format(App.Major, "00") & "." & _ Format(App.Minor, "00") & "." & _ Format(App.Revision, "0000")) Then ' запуск апгрейда с сетевого диска End End If
Если версия в INI-файле выше, чем версия, записанная в .exe, то прога автоматом запустит программу апгрейда по сети и закончит свое выполнение, то есть все нужные файлы смогут быть заменены. Это особенно полезно, когда Вы только начинаете писать прогу, то есть апгрейды и фиксы появляются чуть ли не раз в несколько дней.
87. ЗАКРЫТЬ ОКНО ПРОГРАММЫ, КАК ЭТО ДЕЛАЕТ WINDOWS 95
VB3, VB4 16/32, VB5 Level: Intermediate
Разместите этот код в declaration section модуля: Public Sub Win95Shrivel(xForm As Form) ' минимизирует окно xForm.WindowState = 1 End Sub
Вызывайте ее из процедуры Unload формы Private Sub Form_Unload(Cancel As _ Integer) Win95Shrivel Me End Sub
Каждый раз при unloade формы она сначала быренько сворачивается к таскбару, а затем исчезает. Это работает и в Windows 3.1x тоже