Visual2000 · Архив статей А.Колесова & О.Павловой

Советы тем, кто программирует на Visual Basic

Андрей Колесов, Ольга Павлова

© 1997, Андрей Колесов, Ольга Павлова
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале "КомпьютерПресс" N 5/97.


Совет 93. Используйте метод Refresh при работе с элементом управления SpinButton

(Совет прислал Вячеслав Найдич)

Элемент управления SpinButton ("кнопка-счетчик") представлен в виде двух стрелок (горизонтальных или вертикальных). Нажатие мышью одной из них генерирует событие SpinDown, другой — SpinUp. Обрабатывая эти события можно, например, дискретно изменять некоторое числовое значение в элементах TextBox, Label или положение текущего элемента в ListBox. В VB3 изменение значений в таких "присоединенных" объектах можно было увидеть сразу при нажатии соответствующей стрелки SpinButton, а в VB4 — только при отпускании кнопки.

Чтобы убрать этот эффект, в присоединенном объекте нужно использовать метод Refresh.

Пример:;

Private Sub SpinButton1_SpinDown()
  ' увеличение значения в TextBox
  Text2.Text = Str$(Val(Text2.Text) + 1)
  Label1.Caption = Str$(Val(Text2.Text) + 1)
  ' то же для Label Label1.Refresh
  ' для VB3 эта строка не нужна
End Sub

Private Sub Text2_Change()
  Text2.Refresh 'для VB3 эта строка не нужна
End Sub

TextBox имеет метод Change, поэтому вызов Refresh достаточно поставить в этом объекте один раз. Для Label его нужно ставить в самом объекте SpinButton в двух местах.

В начало статьи

Совет 94. Обращение к процедуре формы

(Совет прислал Вячеслав Найдич)

Чтобы процедура Sub ProcName была доступна из любого места проекта, она должна быть объявлена как Public. Однако, если процедура реализована в модуле формы (например, Form2), правильное обращение к ней должно выполняться с указанием модуля, в котором она реализована. Например, если проект состоит из двух форм (без Module) и процедура, созданная в Form1, вызывается из Form2, то такой вызов выглядит так: Call Form2.ProcName (обращение как к объекту этой формы, а не просто Call ProcName).

В начало статьи

Совет 95. Используйте свойство StartMode объекта App

В VB4 установка параметра StartMode во вкладке Project диалогового окна Options (меню Tools) определяет тип создаваемого модуля — Standalone или OLE Server. Фактически этот параметр определяет только, будет ли приложение, у которого нет формы запуска, выполняться после завершения процедуры Sub Main или нет. Этот параметр очень удобно применять для тестирования серверов OLE Automation.

Свойство StartMode объекта App позволяет задать на уровне кода режим показа пользователю какого-либо видимого интерфейса. С его помощью можно добиться, чтобы отдельный исполняемый VB-файл стал и невидимым сервером, и обычным приложением. Для этого в процедуре Sub Main следует проанализировать значение App.StartMode и решить, показывать форму или нет. Свойство StartMode равно vbSModeStandalone, если приложение запускается непосредственно пользователем, и vbSModeAutomation, если оно запускается клиентским приложением:

Sub Main
  If App.StartMode = vbSModeStandalone
    Then frmMain.Show
  Else
  ' запускается OLE сервер
  End If
End Sub

В начало статьи

Совет 96. Используйте коллекцию Properties для объектов доступа к данным

В процессе отладки можно очень эффективно использовать коллекцию Properties, принадлежащую многим объектам доступа к данным. Для этого выполните следующий код из окна Debug:

For i = 0 to Recordset1.Properties.Count - 1
  Debug.Print Recordset1.Properties(i).Name & _
    Recordset1.Properties(i)
Next

В начало статьи

Совет 97. Добавьте свойства к объектам доступа к данным

Вам необходимо, чтобы объекты типа Field имели свойство, определенное вами, например "RequiredIfCondition1"? Ваше желание легко осуществить с помощью такого кода:

Set NewProperty = Field1.CreateProperty("FieldNote")
NewProperty.Type = dbText
Field1.Properties.Append NewProperty

В начало статьи

Совет 98. Нельзя создавать библиотеку OLE DLL, когда класс Public установлен равным Creatable — Single Use

В памяти в данный момент времени допускается наличие только одной копии DLL- библиотеки. Поэтому VB не разрешает создавать DLL-библиотеки, воздействующие на классы экземпляров единичного использования (single use instancing classes). Однако он позволяет создавать OLE-серверы, для которых можно многократно создавать экземпляры для различных клиентов. Если вам нужен новый экземпляр сервера для каждого клиента, вы должны создать EXE- файл в форме сервера out-of-process вместо DLL-библиотеки.

В начало статьи

Совет 99. Помните об учете регистра в названиях DLL функций

Как мы уже говорили ранее, в 32-разрядных DLL-библиотеках названия функций критичны к регистру написания букв: если вы вместо имени sndPlaySoundA напишите SndPlaySoundA, будет выдано сообщение об отсутствии такой функции в библиотеке WINMM.DLL нет. Для преобразования вызовов функций, используемых в VB 3.0 (там не было такого жесткого правила), в их 32-разрядные аналоги, которые зависят от регистра, можно применять ключевое слово Alias в операторе Declare Sub/Function. В файле Win32API.TXT записаны псевдонимы (Aliases) всех вызовов функций, которые помогут решить проблему учета регистра.

В начало статьи

Совет 100. Используйте согласованное превращение букв в идентификаторах VB

Во избежание ошибок, связанных с неправильным написанием названий переменных (когда вместо NameFile вы случайно написали NaneFile и удивляетесь потом, что программа работает неправильно), мы настойчиво рекомендуем использовать режим Option Explicit (подробнее об этом см. КомпьютерПресс ь 5'96, Совет 9). Для тех, кто принципиально не желает применять эту опцию или не имеет такой возможности (например, работая в более ранних версиях MS Basic), можно посоветовать следующее.

Среда Basic поддерживает согласованность изменения написания имени любой переменной, приводя его в соответствие с последним вариантом написания этого имени. Другими словами, если вы используете переменную с именем myVariable, а затем напишите MyVariable, VB преобразует первое написание так, что оно будет совпадать со вторым.

Благодаря этому свойству можно убедиться в том, что имена переменных написаны правильно во всем коде программы. Напишите имя переменной целиком прописными буквами, например MYVARIABLE, и VB изменит все остальные его написания. Теперь если вы, просматривая свой код, вдруг обнаружите MyVarible, то будете знать, что это имя написано с ошибкой.

В начало статьи

Совет 101. Создание двух версий одного проекта

Любой проект в VB 4.0 может иметь как MAK-, так и VBP-расширение. Данное свойство позволяет создавать две версии одного и того же проекта. Например, вы одновременно установили 16- и 32-разрядную версии VB 4.0. (Выбрав вариант "обе платформы", можно установить 16-разрядную версию в один каталог, а 32- разрядную — в другой.) Работая с обеими платформами, вы можете создать две версии одного проекта — MAK и VBP, которые будут совместно использовать формы и модули благодаря возможности условной компиляции. Для этого в диалоговом окне Make EXE File следует ввести разные имена исполняемых файлов и номера версий.

В начало статьи

Совет 102. Опробуйте нижеследующие рекомендации по компиляции для защиты и оптимизации ваших программ

(Эти советы мы нашли в журнале VBPJ ь 14'96. Не все они кажутся нам очевидно правильными, но попробовать воспользоваться ими, наверное, имеет смысл.)

В начало статьи

Совет 103. Любителям программирования в кодах — вы можете читать P-код

Если вы принадлежите к людям, которые должны все увидеть своими собственными глазами, и хотите изучить Basic P-код, рекомендуем воспользоваться отладчиком низкого уровня, преобразующим исходный код в машинный. Попробуйте, например, VC++ CodeView для Windows или другую аналогичную утилиту. Все, что здесь необходимо, — один раз вызвать функцию API, DebugBreak.

Вот как это делается с помощью CodeView:

  1. Загрузите CodeView для Windows при работе в среде VB.EXE. Для этого создайте значок для CodeView и в командной строке напишите следующее: cvw.exe vb.exe (укажите нужные пути файлов)

  2. Поместите оператор отладчика в свой VB-код перед той строкой, которую вы хотите посмотреть:

    DebugBreak
    Text1.text = "Привет!"
    

  3. Запустите вашу программу.

Когда выполнение кода дойдет до оператора DebugBreak, вы окажитесь в отладчике на команде INT 3, за которой будет следовать команда RET. Перейдете за RET — и вы окажетесь в интерпретаторе P-кода.

Теперь можно воочию убедиться, как много команд должно быть выполнено, прежде чем в окне редактирования появится слово "Привет!". Работа интерпретатора, как следует из его названия, состоит в том, чтобы просматривать информацию, находящуюся в EXE-файле, и интерпретировать ее в команды, понятные операционной системе.

В начало статьи