Вы пришли из
Браузер у вас:
Сегодня:
Разрешение монитора:
87 Хитростей и трюков для Visual Basica
|1|2|3|
- СПРЯТАТЬ УКАЗАТЕЛЬ
НА ТЕКУЩУЮ ЗАПИСЬ в DBGride
- ИСПОЛЬЗОВАНИЕ POP-UP
МЕНЮ В ОКНЕ БЕЗ TITLE BAR
- КАК УЗНАТЬ
РАЗДЕЛИТЕЛИ ДАТЫ И ВРЕМЕНИ БЕЗ ФУНКЦИЙ API
- ПРЕДОТВРАЩЕНИЕ
ОШИБОК ПРИ ИСПОЛЬЗОВАНИИ GETSETTING
- ДУБЛИРОВАНИЕ СТРОК
КОДА БЕЗ СИНТАКСИЧЕСКИХ ОШИБОК
- ЯРЛЫК ДЛЯ ЗАГРУЗКИ
ПОСЛЕДНЕГО РАБОЧЕГО ПРОЕКТА В VB
- КАК ВЫВЕСТИ СИМВОЛ
"&" В LABEL
- СОЗДАНИЕ ВРЕМЕННЫХ
ФАЙЛОВ
- МЫШИНЫЕ СОБЫТИЯ НЕ
СЛУЧАЮТСЯ ЕСЛИ ENABLE УСТАНОВЛЕНО В FALSE
- КАК ВЫВЕСТИ СВОЕ POPUP
MENU НА TEXT BOXES
- ЦЕНТРИРОВАТЬ ФОРМУ С
УЧЕТОМ ТАСКБАРА
- ОЧИСТКА СТРОКИ ОТ
НЕНУЖНЫХ СИМВОЛОВ
- ПРОВЕРКА ОБЪЕКТОВ
ПРИ ПОМОЩИ TYPENAME
- ДОБАВЛЕНИЕ СТРОКИ В
TEXT BOX
- ПРОВЕРКА АРГУМЕНТОВ
В ФУНКЦИИ VAL
- ЯРЛЫКИ ДЛЯ INTERNET
- ПРОСМОТР СОДЕРЖАНИЯ
HELP-ФАЙЛА
- ЗАДАНИЕ ГРАНИЦ MDI
ФОРМЫ ТОЧНО КАК В DESIGN-TIME
- БЫСТРЫЙ ПОИСК В БАЗЕ
ДАННЫХ
- ЛЕГКОЕ ОТСЛЕЖИВАНИЕ
ПОЛОЖЕНИЯ ФОКУСА
- НЕЗАКРЫВАЮЩАЯСЯ
ФОРМА
- ПОМЕНЯТЬ СВОЙСТВО
ЦЕЛОЙ ГРУППЕ КОНТРОЛОВ
- КАК ПРОСТО
ОТФОРМАТИРОВАТЬ И ОКРУГЛИТЬ ЧИСЛО
- БУДЬТЕ ОСТОРОЖНЫ,
ЗДЕСЬ ВАМ НЕ С!
- ИСПОЛЬЗОВАТЬ BACKQUOTES
ВМЕСТО АПОСТРОФОВ
- ПРОСТРАНЕНИЕ НОВЫХ
ВЕРСИЙ ПРОГРАММЫ ПО СЕТИ
- ЗАКРЫТЬ ОКНО
ПРОГРАММЫ, КАК ЭТО ДЕЛАЕТ WINDOWS 95
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.
Назад к
СОДЕРЖАНИЮ
76. ЯРЛЫКИ ДЛЯ INTERNET
VB4 32, VB5
Level: Advanced
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 тоже.
Назад к СОДЕРЖАНИЮ
| |