Visual Basic.Net
Суббота, 19.07.2025, 09:41
Меню сайта

Категории каталога
Visual Basic.NET [9]
Visual Basic 6.0 [17]
VBA [13]
VBScript [1]

Форма входа

Поиск

Друзья сайта
Создайте свой сайт Все для веб-мастера Программы для всех Мир развлечений WOlist.ru - каталог качественных сайтов Рунета

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Наш опрос
Оцените мой сайт
1. Отлично
2. Неплохо
3. Хорошо
4. Плохо
5. Ужасно
Всего ответов: 23

Главная » Статьи » Программирование на Visual Basic » Visual Basic 6.0

87 Хитростей и трюков (Часть 5)
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.

Категория: Visual Basic 6.0 | Добавил: Vadim (12.01.2009)
Просмотров: 2774 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2025
Бесплатный конструктор сайтовuCoz