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

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

Совет 204. Как нарисовать рамку на форме без помощи элемента управления Frame

Совет 205. Как организовать просмотр каталогов

Совет 206. Удаление всех выделенных элементов в списке

Совет 207. Как сделать горизонтальную линейку прокрутки в элементе управления RichTextBox

Совет 208. Добавление новой строки к тексту в элементе управления TextBox

Совет 209. Как заставить VB 6.0 открывать окно кода в «развернутом» режиме

Совет 210. Специальные символы для объявления типа переменной

Совет 211. Создание объекта Excel в VB

Совет 212. Пусть функция DateDiff разбирается с датами

Совет 213. Для аварийного прерывания программы используйте Ctrl+Pause

Совет 214. Как увидеть начало выделенного текста

Совет 215. Как прочитать серийный номер диска

Совет 216. Применение элемента управления Label в качестве разделителя

Совет 204. Как нарисовать рамку на форме без помощи элемента управления Frame

Функция DrawEdge, входящая в состав Win32 API, позволяет достичь очень интересных эффектов. Используя константы EDGE_, вы можете задать различные типы границ рамки, благодаря чему она будет выглядеть утопленной или приподнятой над формой. А константы BF_ определяют границы рамки, которые следует рисовать (например, с помощью BF_BOTTOM вы можете нарисовать только нижнюю границу рамки):

В событии Form_Paint введите следующий код, который говорит о том, что вы хотите нарисовать прямоугольник, который приподнят над формой:

В начало В начало

Совет 205. Как организовать просмотр каталогов

Здесь приводится простой программный код, с помощью которого вы можете вывести на экран окно просмотра каталогов. Благодаря этому пользователь имеет возможность выбрать необходимый ему каталог:

В начало В начало

Совет 206. Удаление всех выделенных элементов в списке

Если у вас есть необходимость удалить сразу несколько элементов из списка, поддерживающего режим MultiSelect, воспользуйтесь следующей простой программой. Предположим, у нас есть окно списка, состоящее из пяти элементов: Элемент1, Элемент2, Элемент3, Элемент4 и Элемент5. Установим свойство MultiSelect элемента управления ListBox как Extended или Simple, а затем введем такой код:

Поместим на форму командную кнопку с именем «Удалить» и напишем для нее следующее:

Теперь запустим нашу программу, выделим три элемента (Элемент1, Элемент3 и Элемент5), а затем щелкнем кнопку «Удалить». И это все!

В начало В начало

Совет 207. Как сделать горизонтальную линейку прокрутки в элементе управления RichTextBox

По умолчанию, когда вы помещаете элемент управления RichTextBox на форму, VB устанавливает свойство RightMargin как 0. Это означает, что вводимый пользователем текст целиком располагается внутри текстового окна. Для вывода горизонтальной линейки прокрутки необходимо, чтобы значение свойства RightMargin было больше, чем ширина текстового окна. Иначе, даже если установить свойство ScrollBars как 1-rtfHorizontal, RichTextBox не выведет линейку прокрутки.

Например, поместите на форму элемент управления RichTextBox, имеющий ширину 3200. Затем установите свойство RightMargin как 3300, а свойство ScrollBars — как 1-rtfHorizontal. Запустите проект на выполнение и начните вводить текст. Когда вы достигнете границы текстового окна, VB выведет горизонтальную линейку прокрутки.

В начало В начало

Совет 208. Добавление новой строки к тексту в элементе управления TextBox

Иногда вам может понадобиться добавить дополнительную информацию к уже существующему тексту в многострочном элементе управления TextBox (свойство MultiLine установлено как True). Предположим, что вы хотите добавить строку следующего вида: «Обновление:» плюс текущая дата. Для этого можно воспользоваться свойствами SelStart и SelText. Как вы уже, вероятно, знаете, свойство SelStart возвращает или устанавливает начало выделения, а свойство SelText — фактически выделенный текст. Если текст не содержит никакого выделения, оба свойства возвращают точку вставки (insertion point). Поэтому, чтобы вставить новую строку текста в многострочное текстовое окно, используйте подобный код:

Этот код передвигает точку вставки к конец любого текста в элементе управления Text1, а затем вставляет новую строку, содержащую дополнительную информацию.

В начало В начало

Совет 209. Как заставить VB 6.0 открывать окно кода в «развернутом» режиме

VB 5.0 всегда сохранял установки интегрированной среды разработки (IDE), заданные вами во время последней сессии. Так, он помнил, с какими окнами вы предпочитаете работать, — с нормальными или «развернутыми». К сожалению, VB 6.0 этого не делает — он всегда открывает окна Code и Object в нормальном режиме. Эту проблему можно решить, произведя небольшие изменения в Windows Registry, так что IDE будет открывать эти окна в «развернутом» режиме. Однако они будут ВСЕГДА расширены до размера экрана — VB 6.0 по-прежнему не сможет хранить установки для IDE между сессиями.

При работе с Регистром требуется соблюдать особую осторожность, поэтому, прежде чем приступить к внесению в него изменений, сделайте резервную копию так, чтобы можно было восстановить Регистр в случае каких-либо сбоев.

Итак, чтобы заставить VB 6.0 открывать окно Code или Object в «развернутом» режиме, вы должны добавить новую величину MDIMaximized к следующему ключу Registry:

Для этого в Windows щелкните кнопку Start и выберите команду Run. Введите RegEdit в диалоговом окне Run, затем щелкните OK. Тогда Windows выведет на экран системный Регистр, в котором найдите папку VB 6.0. После этого щелкните правой кнопкой мыши в любом месте на правой панели и выберите New|String Value из контекстного меню. Введите MDIMaximized в качестве имени и нажмите клавишу Enter. Теперь щелкните правой кнопкой мыши элемент MDIMaximized и выберите Modify из контекстного меню. И наконец, в диалоговом окне Edit String введите 1 в качестве новой величины и щелкните OK. Когда вы это сделаете, Windows присвоит введенную вами величину элементу MDIMaximized. Вот и все! Теперь закройте Регистр и откройте окно Code или Object в любом из проектов VB 6.0. IDE выведет эти окна в «развернутом» режиме.

В начало В начало

Совет 210. Специальные символы для объявления типа переменной

Помимо того что вы можете объявлять тип переменной в явном виде, VB позволяет делать это с помощью специальных символов. Например, вместо использования:

вы можете просто написать:

Вот полный перечень типов данных и соответствующих им символов:

Однако следует соблюдать осторожность при использовании этих символов, поскольку они снижают читаемость вашего кода.

В начало В начало

Совет 211. Создание объекта Excel в VB

В совете 197 (КомпьютерПресс № 6'99, компакт-диск) мы рассказали о том, как создать объект Word в VB. Теперь мы покажем, как выполнить ту же самую процедуру для Excel.

В первую очередь добавьте к VB-приложению ссылку к Microsoft Excel 8.0 Object Library (команда Project|References).

Затем введите следующий код для создания экземпляра Excel:

И наконец, внимательно изучите Object Browser в VB для получения информации о других свойствах и методах объекта Excel.

В начало В начало

Совет 212. Пусть функция DateDiff разбирается с датами

Если вам требуется определить, находятся ли две даты в одном и том же месяце, то первое, что может прийти на ум, — это использовать функцию Month для каждой даты, а затем сравнить два полученных числа. Однако в таком случае у вас получится, что даты 1/1/2000 и 1/1/1999 равны. Поэтому следует использовать функцию DateDiff, которая может выглядеть примерно так:

Здесь функция DateDiff вычисляет разницу в календарных месяцах между двумя датами (аргумент "m"). Если она возвращает 0, то обе даты находятся в одном и том же месяце. Для того чтобы использовать эту функцию в своем приложении, вы можете использовать подобную программную конструкцию:

В начало В начало

Совет 213. Для аварийного прерывания программы используйте Ctrl+Pause

При отладке программы в среде VB для ее прерывания или аварийного завершения можно применять, соответственно, команды Break или End из меню Run. Однако они срабатывают только в момент ожидания какого-либо внешнего события на диалоговой форме. Если же программа выполняет какой-то программный код (например, обработку данных в цикле) или ожидает реакции пользователя после вывода окна сообщения (Message Box), то аварийно прервать или завершить ее с помощью этих команд не удастся.

Однако решить такую проблему просто — для аварийного прерывания программы нажмите комбинацию клавиш Ctrl+Pause, которая сразу переведет ваше приложение в режим Break, а уже потом используйте команды среды Continue (продолжить выполнение) или End (завершить).

В начало В начало

Совет 214. Как увидеть начало выделенного текста

Большинство профессиональных коммерческих приложений обрабатывают диалоговые окна, содержащие поля текста, следующим образом. Когда пользователь переходит к полю ввода текста с помощью клавиши Tab или быстрой клавиши (комбинации Alt с какой-либо другой клавишей), он полностью выделяет весь текст, содержащийся в этом поле. Затем он вводит новый текст, который заменяет собой содержимое всего поле. В то же время если он просто щелкнет мышью текст, содержащийся в поле ввода, то никакого выделения не произойдет — туда только переместится фокус.

В документации VB Knowledge Base рассказывается, как это можно сделать с помощью API-функции GetKeyState. Однако данная техника имеет некоторое неудобство в тех случаях, когда длина текста превышает ширину поля. Пользователь тогда видит только конец выделенного текста, что не очень удобно, так как не всегда можно определить, о чем там идет речь.

Использование функции GetKeyState вместе с оператором SendKeys и методом TextWidth позволяет создать комбинированное решение, когда клавиша Tab или быстрая клавиша выделяет весь текст, содержащийся в поле ввода, но при этом пользователь видит начало текста, а не его конец.

Вначале опишите API-функцию GetKeyState и создайте подпрограмму SelectWholeText:

Затем вызовите созданную подпрограмму из события GotFocus любого поля текста:

В начало В начало

Совет 215. Как прочитать серийный номер диска

Новая библиотека Microsoft Scripting Runtime содержит иерархию FileSystemObject, состоящую из нескольких объектов, которые позволяют получать информацию о дисках, папках и файлах. Например, вы можете получить серийный номер диска с помощью такого кода:

А используя свойство FreeSpace объекта Drive, можно также проверить, достаточно ли у вас свободного места на диске:

Более подробно об этом можно прочитать в Справке VB в разделах Dictionary и FileSystemObject.

В начало В начало

Совет 216. Применение элемента управления Label в качестве разделителя

Для создания приложения в стиле Windows Explorer можно использовать элемент управления Label в качестве разделителя между двумя другими элементами управления, такими как ListView и TreeView.

Вначале разместим на форме эти три компонента, а затем введем следующий код:

КомпьютерПресс 10'1999