Запомнить сайт

Обратная связь

Добавить в избранное

Главная страница Инфа по реестру и биосу Соц опрос Реклама на сайте
Гостевая книга Учебники по программированию Немного о операционных системах Наш форум

Вы пришли из
Браузер у вас:
Сегодня:
Разрешение монитора:

на сайте на Народ.Ру на Яндексе


87 Хитростей и трюков для Visual Basica

|1|2|3|

  1. СПРЯТАТЬ УКАЗАТЕЛЬ НА ТЕКУЩУЮ ЗАПИСЬ в DBGride
  2. ИСПОЛЬЗОВАНИЕ POP-UP МЕНЮ В ОКНЕ БЕЗ TITLE BAR
  3. КАК УЗНАТЬ РАЗДЕЛИТЕЛИ ДАТЫ И ВРЕМЕНИ БЕЗ ФУНКЦИЙ API
  4. ПРЕДОТВРАЩЕНИЕ ОШИБОК ПРИ ИСПОЛЬЗОВАНИИ GETSETTING
  5. ДУБЛИРОВАНИЕ СТРОК КОДА БЕЗ СИНТАКСИЧЕСКИХ ОШИБОК
  6. ЯРЛЫК ДЛЯ ЗАГРУЗКИ ПОСЛЕДНЕГО РАБОЧЕГО ПРОЕКТА В VB
  7. КАК ВЫВЕСТИ СИМВОЛ "&" В LABEL
  8. СОЗДАНИЕ ВРЕМЕННЫХ ФАЙЛОВ
  9. МЫШИНЫЕ СОБЫТИЯ НЕ СЛУЧАЮТСЯ ЕСЛИ ENABLE УСТАНОВЛЕНО В FALSE
  10. КАК ВЫВЕСТИ СВОЕ POPUP MENU НА TEXT BOXES
  11. ЦЕНТРИРОВАТЬ ФОРМУ С УЧЕТОМ ТАСКБАРА
  12. ОЧИСТКА СТРОКИ ОТ НЕНУЖНЫХ СИМВОЛОВ
  13. ПРОВЕРКА ОБЪЕКТОВ ПРИ ПОМОЩИ TYPENAME
  14. ДОБАВЛЕНИЕ СТРОКИ В TEXT BOX
  15. ПРОВЕРКА АРГУМЕНТОВ В ФУНКЦИИ VAL
  16. ЯРЛЫКИ ДЛЯ INTERNET
  17. ПРОСМОТР СОДЕРЖАНИЯ HELP-ФАЙЛА
  18. ЗАДАНИЕ ГРАНИЦ MDI ФОРМЫ ТОЧНО КАК В DESIGN-TIME
  19. БЫСТРЫЙ ПОИСК В БАЗЕ ДАННЫХ
  20. ЛЕГКОЕ ОТСЛЕЖИВАНИЕ ПОЛОЖЕНИЯ ФОКУСА
  21. НЕЗАКРЫВАЮЩАЯСЯ ФОРМА
  22. ПОМЕНЯТЬ СВОЙСТВО ЦЕЛОЙ ГРУППЕ КОНТРОЛОВ
  23. КАК ПРОСТО ОТФОРМАТИРОВАТЬ И ОКРУГЛИТЬ ЧИСЛО
  24. БУДЬТЕ ОСТОРОЖНЫ, ЗДЕСЬ ВАМ НЕ С!
  25. ИСПОЛЬЗОВАТЬ BACKQUOTES ВМЕСТО АПОСТРОФОВ
  26. ПРОСТРАНЕНИЕ НОВЫХ ВЕРСИЙ ПРОГРАММЫ ПО СЕТИ
  27. ЗАКРЫТЬ ОКНО ПРОГРАММЫ, КАК ЭТО ДЕЛАЕТ 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 тоже.
 
 
Назад к СОДЕРЖАНИЮ


Rambler's Top100 Rambler's Top100 Рейтинг@Mail.ru

Сайт создан в системе uCoz