Visual2000 · Архив статей А.Колесова & О.Павловой
Андрей Колесов, Ольга Павлова
© 1996, Андрей Колесов, Ольга ПавловаВ настоящее время (весна 1996 года) программисты используют две версии VB — 3.0 и 4.0. Соответственно все программные конструкции, которые предлагаются вниманию читателей, можно разделить на три категории: работающие только в VB 3.0 (таких очень немного), только в VB 4.0 (здесь еще есть такие, которые работают только в Windows 95) и в обеих версиях. Хотя в будущем в основном будут рассматриваться советы, связанные со спецификой VB 4.0, пока договоримся придерживаться такого правила: по умолчанию примем, что совет относится к обеим версиям, в противном случае в заголовке совета появится соответствующее указание.
Следующий выпуск будет ориентирован в основном на VB 4.0. Там мы, в частности, предполагаем рассмотреть некоторые вопросы создания объектов и OLE-серверов.
Если вы хотите, чтобы в диалоговом окне выводилось несколько имен файлов, установите флажки OFN_ALLOWMULTISELECT. В результате этого строка FileName будет состоять из имени диска и имени каталога, за которыми последует список файлов, выбранных в данном каталоге и разделенных между собой пробелами. Например, если Вы выберете файлы X.TXT и Y.TXT, находящиеся в каталоге c:\a\b, то получите имя файла c:\a\b\ x.txt y.txt, а НЕ c:\a\b\x.txt c:\a\b\y.txt.
Для закрытия другой программы используйте следующий программный код в тексте своего приложения:
Title = "Программа А" ihWnd = FindWindow(0&, Title) ihTask = GetWindowTask(ihWnd) iRet = PostAppMessage(ihTask, WM_QUIT, 0, 0&) MsgBox "Внимание! Программа А закрывается"
При удалении какого-либо элемента управления из формы код, соответствующий этому элементу управления, не удаляется. (Об этой проблеме мы уже говорили раньше в связи с переименованием элементов управления.) Он по-прежнему хранится в программном коде в Общей области (General area), и хотя он никому не мешает, из-за него увеличивается размер исполняемого модуля. Кроме того, если вы создадите новый элемент управления с таким же именем, сохранившийся код будет принадлежать этому новому компоненту, так как событие имеет то же самое имя. Поэтому программист, который не хочет сохранять данный код (а кто хотел бы?), должен удалять его вручную каждый раз при удалении элемента управления. Непонятно только одно: почему Microsoft не предлагает автоматическое удаление подобного мусора?
Для выгрузки формы можно использовать следующий фрагмент кода, закрепленный за кнопкой Close:
Unload
А этот код следует также поместить в обработчик события Form_Unload():
Set= Nothing
Такая операция очищает сегмент данных выгружаемой формы от любого оставшегося кода или данных, если вы не делаете этого в явном виде. Это особенно важно при использовании большого числа форм, тем более если на них расположено много элементов управления.
Появление сообщений об ошибке GPF (General Protection Fault) — вещь неприятная. К счастью, в VB они появляются существенно реже, чем в компилирующих системах программирования. По теории они могут появляться в VB только при неправильных обращениях к внешним динамическим библиотекам и функциям API.
Сообщения об ошибках могут иметь следующий вид:
Это может произойти, если выполняется любое из следующих условий:
Если вы получаете сообщения об ошибках GPF при обращении к DLL и не можете сразу установить причину, тогда напишите программу-заглушку в виде BAS-файла, которая имитирует DLL-библиотеку. Это поможет хотя бы решить, кто виноват — библиотека или ваша VB- программа. Если ошибка все-таки остается, причиной ее является не DLL-библиотека.
При разработке программы последовательность прохождения элементов управления может нарушиться, особенно если в форму добавляется какой-либо элемент управления после того, как все остальные уже находятся на своих местах. В этом случае вам потребуется установить новую последовательность TabOrder. Для этого при помощи мыши выделите по очереди все элементы управления, двигаясь в обратном порядке, и для каждого из них установите значение свойства TabOrder равным нулю. В результате последовательность элементов управления станет обратной той, в которой вы их проходили: теперь они будут следовать в необходимом порядке.
Помните, что имена элементов управления и форм хранятся в исполняемом файле, зато на именах переменных можете не экономить: они не хранятся в EXE-файлах.
При создании файлов справки для VB-программ полезно предусмотреть возможность того, чтобы пользователь мог легко выйти из окна справки и вернуться обратно в VB-приложение. Один из способов реализации такой возможности — при помощи клавиши Esc завершить выполнение программы-справки. Для этого добавьте следующий код в секцию [CONFIG] в файле проекта справки (help project file). Данный код создает клавишу-акселератор (Esc), чтобы активизировать в справочной системе макрокоманду EXIT, которая завершает выполнение программы-справки.
[CONFIG] ; выход из программы-справки по клавише Esc AddAccelerator(0x1B,0,"Exit()")
Хорошо было бы прочитать этот совет самим разработчикам среды VB.
VB не предоставляет пользователю простого способа редактировать содержимое MAK-файлов. Но это может понадобиться, если вы хотите добавить новый VBX в середину разрабатываемого проекта или быстро убрать ненужные модули из проекта. Особенно это бывает полезно, когда вы пользуетесь компьютером, на котором VBX'ы, необходимые для работы вашего приложения, установлены в других каталогах. В данном случае используйте любой текстовый редактор для ручной настройки MAK-файла.
Если вы создали большое приложение, подумайте о том, как разбить его на более мелкие. Используйте только одну главную исполняемую программу, которая вызывает другие программы, а также DDE-технологию для осуществления связей. Когда вы открываете неглавное приложение, откройте DDE-связь с главным приложением. Вы можете написать сценарий, который позволит приложениям взаимодействовать друг с другом для передачи данных или начала выполнения процессов. Такой метод имеет несколько преимуществ, включая более низкие требования к размеру памяти и меньшее потребление ресурсов. И еще одно БОЛЬШОЕ преимущество: поскольку ваше приложение состоит из нескольких исполняемых модулей, Windows выделяет для выполнения каждого из них свой собственный интервал времени, за счет чего это приложение выполняется быстрее.
В Совете 10 мы уже говорили, что раньше для обозначения типа переменных и функций в Basic можно было использовать суффикс. Это было очень удобно: по имени сразу было видно, с какой переменной имеешь дело. Но с расширением числа типов в VB специальных символов (%, #, $, и пр.) для суффиксов просто не стало хватать, и поэтому такой способ обозначения переменных в последнее время не используется.
Идея быстрого опознавания переменных довольно просто реализуется с помощью префиксов (приставок в начале названия переменной). Здесь нет никаких строго обязательных правил, и каждый может использовать собственную систему обозначений. Но лучше все-таки применять общепринятые обозначения — тогда вы будете лучше понимать чужие тексты, а ваши коллеги — ваши программы. О реализации этой идеи применительно к названиям элементов управления мы уже писали в самом первом своем Совете.
В качестве рекомендуемых префиксов предлагаются такие сокращения:
Сейчас общепринятым считается такое правило написания переменных: строчными буквами пишется префикс (это сразу отличит переменную от зарезервированного слова языка, которое автоматически начинается с прописной буквы), после которого с большой буквы идет уникальное имя переменной (лучше, чтобы имя передавало ее смысл):
intTimes, strFileName, varSum
Там, где есть однозначность, вполне допускается использование первой буквы префикса (только для переменных, чтобы не было путаницы с объектами баз данных): iTimes, vSum.
В этом случае можно использовать для автоматического обозначения типов оператор DefXXX. Тогда вместо длинного описания:
Dim Times As Integer, Sum As Integer, Counter As Integer
можно будет написать:
DefInt I Dim iTimes, iSum, iCounter
Мы думаем, что те, кто привык к суффиксам, вполне может использовать и их — текст программы получается достаточно понятным:
Sum = 0: Times% = 10: FileName$ = "program.bas"