Глава 1
Введение
в Visual Basic
Visual Basic для всех?
Что такое
Visual Basic? Многие считают, что слово "Basic" в названии
используется неудачно, так как напоминает начальный период компьютеризации,
когда чудаки сидели перед самостоятельно созданными персональными компьютерами
и разрабатывали маленькие программы. Basic якобы ассоциируется с бытовым
компьютером и его нельзя рассматривать как серьезную систему для разработки
современных приложений. Более того. Basic считается языком для новичков, недостаточно
быстрым, недостаточно гибким, другими словами, программирование на этом языке
подрывает репутацию любого разработчика программных средств.
Сторонники
этого мнения, мало сказать, не правы — они игнорируют важный этап развития
систем программирования. В настоящее время само название этой среды разработки
приложений охватывает целое направление. Сейчас программы больше не пишут — нет
больше программирования в прежнем смысле этого слова. Приложения проектируются.
Собственно и программистов гораздо уместнее было бы назвать инженерами
проектировщиками программных средств. Они являются скорее художниками творцами,
чем странными чудаками.
Microsoft
Windows не только способствует более простой и интуитивной работе с
компьютером. Создать приложение в Visual Basic — значит разработать его не
только для Windows, но и с помощью Windows и создать его таким, как Windows.
Это и есть характерная черта Visual Basic.
Однако не
следует заблуждаться, полагая, что можно легко научиться программировать в
Visual Basic. Теоретическая база при этом играет решающую роль. Но после
изучения нашей книги работа в Visual Basic не будет представлять для вас
никаких проблем.
Идея Visual Basic
Visual?
Название
Visual Basic говорит само за себя. Если вы уже работали с другими, традиционными
системами программирования, то вскоре убедитесь, что Visual Basic представляет
совершенно другой стиль программирования. Уже по слову "Visual" можно
догадаться, что в Visual Basic реализован визуальный стиль программирования.
Как уже говорилось выше, вы даже не программируете, а проектируете приложение.
Ваша первая задача при этом — создать рабочую среду, прежде чем начать набирать
первую строку кода.
Basic?
Слово
Basic в названии указывает лишь на то, что синтаксис программ и операторы
опираются на язык высокого уровня Basic (Beginners Atlpurpose Symbolic
Instruction Code). Но если вы знаете обычный Basic, то очень скоро убедитесь,
что Visual Basic заметно от него отличается.
Компилятор или интерпретатор?
На
вопрос, чем является Visual Basic — компилятором или интерпретатором, можно
получить ответ: "И тем, и другим". Его нельзя однозначно отнести ни к
компиляторам, ни к интерпретаторам.
Visual Basic как интерпретатор
. Основным
признаком интерпретатора является то, что созданные в нем программы выполняются
только в среде разработки. Программу можно запустить непосредственно из среды и
если в ней есть ошибки, они сразу же распознаются. Все это наблюдается и в
Visual Basic, где можно запустить приложение непосредственно в среде
разработки. При этом Visual Basic использует технологию ThreadedpCode, при
которой каждая введенная строка кода преобразуется в промежуточный код —
ThreadedpCode. Это еще не совсем машинный код, но такой код выполняется
быстрее, чем при работе с обычным интерпретатором. Вопервых, Visual Basic сразу
же проверяет синтаксис программы и выдает сообщение об обнаруженной ошибке.
Другим преимуществом этой технологии является возможность поиска ошибок. Это
будет рассматриваться далее в книге.
Однако
Visual Basic — не просто интерпретатор, так как это означало бы, что приложения
выполняются только в среде Visual Basic. Visual Basic предоставляет возможность
создавать и исполняемые ЕХЕфайлы, поэтому его можно отнести и к компиляторам.
Visual Basic как компилятор
Visual
Basic нельзя назвать чистым компилятором, так как в отличие, например, от
Visual C++, Visual Basic не создает исполняемый файл сразу же при запуске из
среды разработки. Для создания такого файла необходимо сделать это явно
(команда File\Make ***.EXE). Начиная с пятой версии, Visual Basic
располагает так называемым "Native Compiler", т. е. компилятором,
который может создавать машинный код. Таким образом. Visual Basic объединяет в
себе возможности как интерпретатора, так и компилятора. И это имеет больше
преимуществ, чем недостатков.
Различные издания
Visual Basic
Имеется три различных
издания Visual Basic 6.0. Издания составлены Microsoft для отдельных групп
пользователей и различаются набором возможностей и комплектом поставляемой
документации. При этом синтаксис языка Visual Basic остается неизменным и не
зависит от издания. •
Издание для начинающих (Learning Edition)
Издание Visual Basic
для начинающих (бывший стандарт) предназначено для неопытных программистов. Это
издание предоставляет только основные возможности для создания приложений и
базовый набор элементов управления.
Издание для профессионалов (Professional
Edition)
Издание для
профессионалов предоставляет больше инструментов и вспомогательных средств,
необходимых профессиональным программистам. Оно содержит ряд дополнительных
элементов управления, обеспечивает расширенные возможности доступа к базам
данных и создания приложений OLEсервера.
Промышленное издание (Enterprise Edition)
Промышленное издание
представляет собой расширение издания для профессионалов и предназначено для
разработчиков корпоративных систем. Это издание включает в себя большое
количество элементов управления и средств, которые позволяют разрабатывать не
только простейшие программы, но и достаточно сложные клиентсерверные приложения.
Промышленное издание
содержит также ряд специальных инструментов (например, Visual SourceSafe,
предназначенный для сравнения версий и управления проектом). Использование
драйверов ODBC предоставляет оптимизированный доступ к внешним базам данных.
Еще одно из добавлений
— версии разработчика
серверов Microsoft SQL и Microsoft Transaction Server.
Инсталляция Visual Basic
Различные издания предполагают и различные
сценарии инсталляции. Для установки Visual Basic следует запустить программу
SETUP. EXE. Ответив на ряд вопросов и выбрав тип установки, вы получите готовую
к работе 32 разрядную версию Visual Basic. С ее помощью можно создавать только
32разрядные приложения для работы в среде Windows 95/98 или Windows NT. В
промышленном издании некоторые дополнительные инструменты требуют отдельной
инсталляции.
Visual Basic для начинающих
Итак, вы уже имеете
начальное представление о Visual Basic 6.0 и знаете, чем одно издание
отличается от другого. В данном разделе будут описаны рабочая среда и основные
принципы создания проектов. Тем, кто еще мало знаком с Visual Basic, следует
особенно внимательно изучить его содержание, а более опытные разработчики могут
перейти к чтению следующей главы.
Рабочая среда — рабочее место разработчика
Запустить Visual
Basic можно с помощью команды меню или двойным щелчком на пиктограмме программы
п окне Windows Explorer или My Computer.
Риг ! I
f\'fni,iii.lii запуска Visual Basic в меню
После запуска Visual
Basic на экране появляется диалоговое окно, в котором вы можете выбрать тип
создаваемого приложения. Из этого же окна можно загрузить уже существующий
проект.
За некоторыми
пиктограммами диалогового окна скрываются мастера (Wizards), сопровождающие
разработчика при создании приложений и берущие на себя часть его работы,
например подключение базы данных или создание формы. Один из основных мастеров
— мастер приложения Visual Basic, с помощью которого можно создать основной
"каркас" для обычных Windows приложений.
В процессе работы
мастера создается почти готовое приложение с различными формами,
соответствующей рабочей средой, меню, панелью инструментов и т.п. Это
приложение можно потом совершенствовать и настраивать.
Если вы не имеете
достаточного опыта разработки приложений, то созданные вами приложения будут
выглядеть как обычные Windows приложения. Такое приложение создается с помощью
элемента Standard EXE (рис. 1.2).
Рабочая среда Visual
Basic 6.0 заметно отличается от среды предыдущих версий. Многие считают именно
среду разработки с ее многообразием различных окон одним из самых слабых
звеньев Visual Basic. Однако освоив среду, вы будете чувствовать себя в ней
достаточно комфортно.
Главное окно среды
разработчика содержит несколько окон. Начиная с Visual Basic 5.0, все окна
подчиняются главному окну Visual Basic и могут "прикрепляться"
(dockable) к одному из его краев. При необходимости такой многодокументный (MDI
— Multiple Document Interface) вид среды разработки можно настроить, сделав его
интерфейс более привычным для тех, кто работал с предыдущими версиями Visual
Basic. Для этого следует установить флажок SDI Development Environment вкладки
Advanced диалогового окна Options, которое открывается с помощью
одноименной команды меню Tools.
После этого при
следующем запуске приложения рабочая среда Visual Basic будет иметь вид
SDIприложения.
Панель инструментов Visual Basic
В верхней части
экрана находится центр управления Visual Basic — панель инструментов (Toolbar).
Ее можно настраивать, как это обычно делается в приложениях Microsoft.
Рис. 1.9. Панель
инструментов
Панель элементов
Кнопки, поля ввода и
другие элементы, которые нужны для создания приложения, расположены на панели
элементов (Toolbox). Для выбора элемента управления (Control) нужно щелкнуть на
нем и затем с помощью мыши установить в форме его размер и позицию. После
двойного щелчка на пиктограмме элемента в центре формы появляется
соответствующий элемент стандартного размера.
Функции
отдельных элементов описаны в главе "Элементы управления".
Приведенный набор
элементов управления достаточно обширен. Однако при работе вам скорее всего
потребуется значительно меньше элементов.
Окно формы — главный элемент приложения
Окно формы, часто
называемое просто "форма", является главным элементом приложения.
Форма представляет собой контейнер для элементов управления. Точки сетки на
форме только помогают размещению элементов и при работе приложения не видны.
При запуске Visual
Basic открывающаяся на экране форма не содержит элементов управления. После
щелчка на пиктограмме требуемого элемента управления курсор мыши принимает
форму крестика. Теперь нужно указать в форме начальный угол
элемента управления,
нажать левую кнопку мыши и, не отпуская ее, установить размер элемента. После
достижения нужного размера кнопка отпускается и в форме появляется выбранный
элемент управления.
Окно свойств — Properties
В этом окне задаются
свойства выбранного элемента управления. Напомним, как обращаться с этим окном
(значения установок описаны в главе "Элементы управления").
Рис. 1. ] I. Окно свойств
В строке заголовка
окна свойств рядом с текстом Properties указывается имя формы, которой
принадлежит элемент управления. Поле со списком под строкой заголовка позволяет
выбрать требуемый элемент управления. В списке, расположенном ниже, перечислены
свойства этого элемента (в алфавитном порядке либо по категориям). Набор
свойств зависит от типа элемента управления.
Список свойств
состоит из двух столбцов: в правом перечислены названия свойств, а в левом — их
значения. Редактирование свойства осуществляется либо вручную (например, ввод
имени элемента), либо выбором соответствующего поля из списка, либо при помощи
диалогового окна настройки свойства. Краткое описание выбранного свойства
отображается в нижней части окна.
Окно проекта
В окне проекта
отображаются все элементы приложения: формы, модули, классы и т.п.,
сгруппированные по категориям. В Visual Basic все разрабатываемые приложения
называются проектами. Проект содержит несколько групп компонентов (формы,
модули и т.п.). Все приложения Visual Basic строятся по модульному принципу,
поэтому и объектный код состоит не из одного большого файла, а из нескольких
частей. Несколько приложений также могут объединяться в группы.
Чтобы сохранить
существующий элемент (форму, модуль и др.), нужно выделить его в списке окна
проекта и выбрать команду File\Save или File\Save As. Для записи всего проекта
(включая все компоненты) выберите команду File\Save Project или
FiIe\Save Project As (для сохранения проекта под другим именем).
Чтобы добавить в
проект новый элемент, необходимо вызвать команду Рго ject\Add. Для
удаления элемента нужно выделить его в окне проекта и затем выбрать команду
меню Project\Remove.
Все эти элементы
сохраняются как отдельные и независимые файлы. Поэтому их можно в любое время
загружать и сохранять. Это дает возможность использовать в проекте формы и
коды, созданные для других проектов, что экономит рабочее время.
Содержимое окна
проекта сохраняется в специальном фаиле. Он имеет расширение VBP и содержит
список элементов, которые нужно загрузить в среду разработки. Если несколько
проектов объединяются в группу, их имена сохраняются в файле с расширением VBG.
Окно кода — начало работы
Сразу после запуска
Visual Basic это окно не отображается. Тем не менее, оно едва ли не самое
важное в Visual Basic, так как именно в нем вводится программный код. Код в
Visual Basic разделяется на процедуры и, как правило, непосредственно связан с
определенными элементами управления. Это позволяет открыть окно кода двойным
щелчком на элементе управления в форме.
И еще несколько слов
о редакторе кода Visual Basic. В принципе приемы работы в нем такие же, как и
при редактировании текстов в приложениях Windows. Набранные символы вставляются
на месте курсора ввода. После нажатия клавиши [Insert] текстовый курсор принимает
форму бруска, что свидетельствует об активизации режима замены. Повторное
нажатие клавиши [Insert] переводит редактор обратно в режим вставки. Выделенный
текст при вводе заменяется новым.
Комбинация клавиш
[Ctrl+X] удаляет выделенный текст и помещает его в буфер обмена Windows.
Клавиши [Ctrl+C] служат для копирования текста в буфер обмена, а [Ctrl+V] — для
вставки содержимого буфера обмена. Кроме того, комбинация клавиш [Ctrl+Y]
помещает в буфер обмена строку, в которой находится текстовой курсор. Комбинация
[Ctrl+N] вставляет перед текущей строкой пустую строку. Отдельные процедуры
можно просматривать с помощью комбинаций клавиш [Ctrl+T] или [Ctrl+4]. Клавишей
[Tab] создается отступ в строке или во всех выделенных строках. С помощью
[Shift+Tab] текст сдвигается вправо.
Над вертикальной
полосой прокрутки находится маленькое поле, которое можно перетаскивать с
помощью мыши вниз для разделения окна на две части (split window). Это дает
возможность редактировать в одном окне две разные процедуры. Разделение
отменяется, если разделительную линию переместить к самому краю окна или
выполнить двойной щелчок на разделительной линии.
Вид и размер шрифта
можно изменять на вкладке Editor Format диалогового окна Options (команда
меню Tools\0ptions). С помощью поля Tab Width вкладки Editor устанавливается
число символов для отступа клавишей [Tab]. При установленном флажке Auto
Indent нажатие клавиши [Enter] помещает курсор ввода в колонку, с которой
начиналась предыдущая строка. Выбор Default to Full Module View
позволяет просматривать в окне кода несколько процедур формы. Установить и
отменить этот режим можно при помощи кнопок, расположенных слева от
горизонтальной полосы прокрутки окна кода.
Управление раскладкой
Обычной проблемой
разработки приложений в Visual Basic являются различные разрешения экрана
монитора разработчика и пользователей. В основном приложения разрабатывают в
среде, где мониторы имеют высокое разрешение экранов. Это может вызывать
неудобства для пользователя, имеющего монитор с низким разрешением.
В окне управления
раскладкой можно устанавливать размер и позицию формы на экране, отобразив
вспомогательные линии для различных расширений.
Первая программа, или проверка теории
практикой
Итак, достаточно
теории. Включайте свой компьютер и запускайте Visual Basic. Ознакомившись с
основными элементами рабочей среды, составьте небольшую программу. Не будем
нарушать старую традицию, согласно которой первым проектом в новом языке
программирования становится программа, которая выводит сообщение "Hello
world". Ей можно присвоить имя HELLOWORLD.
В окне, открывшемся
после запуска Visual Basic, выберите тип создаваемого приложения Standard
EXE и сразу же начинайте работу.
Сначала поместите в
форму элемент управления, в данном случае кнопку (CommandButton). Это
выполняется двойным щелчком на соответствующей пиктограмме панели элементов.
I'lir. !. Iti.
Командная кнопка в форме
На кнопке появляется
надпись (свойство Caption) Commandl. Это типичный стандартный идентификатор,
автоматически предлагаемый Visual Basic. Текст стандартной надписи необходимо
изменить на "Hello world". Для этого следует щелкнуть мышью в окне
свойств и выбрать в нем строку Caption. По мере ввода вводимый текст
"Hello world" появляется на кнопке.
Конечно, это еще не
настоящее программирование, однако начинающие программисты должны с чегото
начинать. Двойным щелчком на кнопке commandl откройте окно кода для ввода
операторов программы. Самый простой оператор — это print, при помощи которого
можно выводить текст. Введите между строками Sub и End Sub команду
Print "Hello world".
. Рис. 1.17. Ввод кода
Итак, первая
программа готова. Чтобы увидеть результат ее работы, запустите программу. Для
этого щелкните на кнопке Start на панели инструментов или просто нажмите
клавишу [F5]. Как уже упоминалось, Visual Basic может вести
себя и как
интерпретатор. После запуска программу можно протестировать щелчком на кнопке
Hello world в окне формы.
Рис. 1. IS. Программа
Hello World
Завершите выполнение программы с помощью
кнопки Stop на панели
инструментов Visual Basic.
Таким образом, вы создали при помощи Visual Basic свое первое
приложение
Windows. Конечно, оно пока довольно примитивное, но у вас еще будет время
ознакомиться с глубинами программирования в Visual Basic.
Код
— команды персональному компьютеру
Если вы решили не
ограничиваться простыми приложениями, то вам никак не обойтись без изучения
основ программирования. В Visual Basic код состоит из одного или нескольких
операторов, которые система преобразует в команды, понятные компьютеру.
Синтаксис
Чтобы Visual Basic
понимал исходный код, следует придерживаться определенных правил написания
программ. В каждой строке кода помещается оператор, который может иметь
дополнительные параметры.
Print
"Hello world"
В нашем примере оператор
имеет один параметр. Print — это ключевое слово Visual Basic, а выражение
"Hello world" — параметр. Как использовать отдельные операторы и как
задавать параметры, зависит от команды. Например, простейший оператор
присваивания:
А
= 1
Эта строка также содержит
оператор — знак равенства. Параметры указываются перед (А) и после (1) оператора.
Уже известно, что
Visual Basic применяет специальную технологию для перевода кода — ThreadedpCode
— и поэтому сразу же после нажатия клавиши [Enter] может проверить правильность
написания кода. Если код некорректен, то Visual Basic выдает сообщение об
ошибке.
Кроме того, в Visual
Basic для многих процедур и функций (даже ваших собственных) отображается
подсказка по синтаксису (Tooltip).
Разделители строк
Начиная с Visual
Basic 4.0, появилась возможность разделять логическую строку, а значит и
оператор, на несколько физических строк. Разделителем строк служит пробел,
следующий за символом подчеркивания (_). Это дает возможность форматировать
длинные, трудно обозримые строки так, чтобы они полностью помещались на
странице экрана.
В нашем примере такое
разделение пока не требуется, но оно могло бы выглядеть следующим образом:
Print _ "Hello world"
Строка программы в
Visual Basic может содержать максимум 1023 символа и не более десяти
разделителей — этого обычно достаточно. В одной строке можно также объединять
несколько операторов, которые разделяются двоеточием. Однако такое разделение
имеет смысл лишь для очень простых операторов, иначе программный код будет нечитабельным:
Print "Hello world": Print
"Hello Oleg": Print "Hello Alex"
Комментарии \
В Visual Basic, как и
в большинстве языков программирования, могут быть использованы комментарии.
Комментарии предназначены для пояснения отдельных фрагментов программы и
игнорируются Visual Basic при выполнении программы. Для выделения начала
комментария можно использовать или верхнюю запятую ('), или команду Rem — их
действие одинаково. Rem представляет собой оператор и поэтому должен находиться
в отдельной строке. Верхняя запятая может ставиться в любом месте строки, при
этом текст комментария располагают справа:
Rem Это комментарий
Print "Hello world" 'Это тоже комментарий
Число строк кода
(формы, модуля и т.п.) ограничивается 65534. Это ограничение не существенно, поскольку
число строк в большинстве программ меньше.
Переменные
Переменные — это
важная составляющая каждого языка программирования. Они представляют собой
нечто вроде небольшого контейнера с определенным содержимым, например символами
или числами. Этому контейнеру присваивается имя, т.е. имя переменной. Чтобы
сослаться на содержимое, достаточно указать имя переменной.
В зависимости от
содержимого различают переменные разных типов. Visual Basic поддерживает
следующие типы переменных.
Таблица I.}. Типы данных
Тип Содержимое Область значении
Boolean Byte Integer
Long Single Логическое
значение Однобайтное
целое число
Целое число
Длинное целое число
Число с плавающей запятой
True или False от 0
до 255 от 32768 до +32767
от
2147483648 до +2147483647 от 3,402823х1038 до 1,401298х1045 для отрицательных
величин и от +1,401298х1045 до +3,402823х 1038 для по ложительных величин
Тип |
Содержимое |
Область значении |
Double |
Число с плавающей запятой
двойной точности |
от 1,79769313486232х10308
до 4,94065645841247х10324 для
отрицательных величин и от 4 94065645841247х10 324 до |
Currency |
Денежная величина |
от 922337203685477,5808 до
922337203685477,5807 |
Decimal |
Десятичное число |
+/79228162514264337593543950335
как целое число; +/7,9228162514264337593543950335 как десятичное число, 28
разрядов после запятой |
Date |
Дата/время |
от 1 января 100 до 31 декабря
9999 |
String |
Строковая переменная |
приблизительно до 65500
(16разрядный код) или до 2х1032 (32разрядный код) |
Object |
Объект |
любая ссылка на объект |
Variant |
Все |
Null, Error, ЧИСЛОВОЙ ДО
Double, String, Object ИЛИ массив |
Boolean
Данные типа Boolean
могут содержать только значения True или False. В Visual Basic значению True
соответствует 1, a False — 0. Если переменной этого типа присваивается значение
0, то переменная содержит False. Все другие значения подразумевают True:
Dim
nVar As Boolean nVar = 5 'Результат: True
Byte/Integer/Long
Данные типа Byte,
Integer, Long содержат лишь целые цифровые значения из различных диапазонов.
Если переменной такого типа присваивается l. 4, то возвращается 1, если 1.5—
возвращается 2:
Dim
nVar As Integer nVar = 1. ~1 'Результат: 2
Single/Double
Данные типа Single и
Double содержат числа с плавающей запятой из разных диапазонов значений. Данные
типа Currency также служат для представления чисел с плавающей запятой, но
число разрядов после запятой ограничено четырьмя. Этого достаточно при
выполнении денежных расчетов:
Dim sVar As Single sVar = 1.7
'Результат: 1.7
В
Visual Basic в качестве разделителя целой и дробной частей используется точка.
Decimal
Особенность данных
этого типа заключается в том, что они могут использоваться лишь внутри
переменной типа Variant, т.е. объявить переменную типа Decimal нельзя. Они
позволяют использовать числа с количеством знаков после запятой от О до 28, но
не могут объявляться непосредственно оператором Dim.
Date
Данные типа Date
специально предназначены для обработки информации о дате и времени. Чтобы для
Visual Basic было понятно, что под указанным значением подразумевается дата
и/или время, нужно поместить его между Двумя знаками #. При вводе следует
пользоваться американским форматом. Если же при вводе данных этого типа
использовать кавычки ("), что допустимо, то следует применять
установленный в системе формат даты и времени:
Dim d'tVar As Date dtVar = #10/6/95*
'Результат: 6.10.95 dtVar #1:25:00 РМ#
'Результат: 13:25:00 dtVar = "6.10.95" 'Результат: 6.10.95 dtVar =
"13:25" 'Результат:
13:25:00
String
Данные типа String
служат для хранения строк (String). Каждый символ, сохраненный в переменной
типа String, занимает 1 байт памяти. Поэтому операционные системы разных
платформ поддерживают различную максимальную длину строки. В 16разрядных
системах (например, в Windows З.х) это составляет около 65000 символов, в 32разрядных
системах (Windows 95/98 или Windows NT) — около 1032 символов. Для того чтобы
Visual Basic отличал строку от имени переменной, строка заключается в парные
кавычки: Dim
Переменная As String Переменная = "Hello world" 'Результат: Hello
world
Object
Данные типа Object
служат для хранения других объектов и будут подробнее рассмотрены в главе,
посвященной OLE.
Явное
объявление
Во многих языках
программирования все используемые переменные должны быть объявлены. Этой
процедурой системе программирования сообщается имя и тип переменной. Например,
переменная называется FirstName и содержит текст. После объявления этой
переменной система знает, каково ее содержимое, и, что особенно важно, сколько
памяти нужно зарезервировать для нее.
Dim
При написании программы
в Visual Basic пользователь решает сам, нужно объявлять переменную или нет. Для
явного объявления переменной используют оператор Dim, который имеет следующий
синтаксис:
Dim
Имя_переыенной [Дз Тип_данных}
Имя переменной можно выбирать произвольно, но
при этом следует соблюдать следующие правила:
.
• имя переменной должно начинаться с буквы;
.
• максимальная длина имени — 255 символов;
.
• имена могут содержать буквы, цифры и символ подчеркивания
(_). Все другиесимволы не допускаются;
.
• имя не может быть зарезервированным в Visual Basic словом
(например,Print).
Вот некоторые примеры объявления переменных:
Dim FirstName As
String Dim Price As Currency Dim Counter As Integer
Длина переменной типа
String обычно ограничивается лишь операционной системой. Но при необходимости
ее можно указать явно. Для этого после слова String добавляют звездочку и
максимальное число символов: Dim Имя_переменной (As String] [* Число
знаков]
Например:
Dim FirstName As
String* 30 Dim Street As String* 75
Идентификаторы
типов
Указывать тип данных
при объявлении не обязательно. Тип данных при объявлении может устанавливаться
просто добавлением знака типа к имени переменной.
Таблица 1.2. Знаки
типов переменных Тип переменной Знак Пример
Integer |
% |
Countert |
Long |
& |
NrS |
Single |
i |
Result! |
Double |
# |
Number# |
Currency |
@ |
SurnmaS |
String |
$ |
FirstName$ |
Приведенный выше пример объявления с этими знаками
выглядел бы так:
Dim FirstName$ Dim Price@ Dim Countert
He все типы данных располагают собственными знаками.
Использование этих знаков Microsoft больше не рекомендует, и они имеются в
Visual Basic только для совместимости с предыдущими версиями.
Неявное
объявление
Visual Basic, в отличие от других языков
программирования, не требует явного объявления переменных. Оператор Dim явно
задает имя и тип переменной. Но переменная может объявляться автоматически,
когда она появляется в коде. Это так называемое неявное объявление переменной.
Исходя из этого,
следующие коды эквивалентны:
Dim
Price As Currency Price = 523 ИЛИ Price@ = 523
Во втором примере
Visual Basic самостоятельно объявляет переменную, как только она встречается.
Для установления типа данных следует применять знак типа, в данном примере — @.
В этом случае Visual Basic распознает, что при этом объявляют переменную типа
Currency.
При неявном
объявлении всегда рядом с именем переменной следует указывать знак
соответствующего типа. При явном объявлении это необязательно.
Если тип данных не
идентифицирован знаком, то Visual Basic применяет тип Variant. Это одно из
новшеств в Visual Basic.
Variant — хамелеон среди переменных
Тип данных Variant —
это хамелеон. Он устанавливает тип данных в зависимости от содержимого. Если в
такой переменной содержится число, то переменная типа Variant принимает
соответствующий тип данных.
Если ее содержимое —
число 5, то она принимает тип integer; если 1.2 — Double; если текст, то
String. Переменная типа Variant изменяет свой тип во время выполнения
программы. Вот простой пример:
Dim Variable As
Variant Variable = "25" 'V содержит "25" (String) Variable
= Variable +5 'V содержит 30 (число) Variable = Variable & "штук"
'V содержит "30 штук"
Как видно, переменная
меняет тип данных в зависимости от содержимого. Во второй строке переменной
присваивается символьное значение, поэтому содержимое получает тип String. В
следующей строке нужно выполнить расчеты, что невозможно для переменных типа
String. Поэтому Visual Basic пытается преобразовать содержимое в числовое
выражение; это возможно для последовательности символов 2 и 5. Наконец, к числу
25 можно прибавить 5. Внутренний тип данных в этом месте — Integer. В последней
строке проводится объединение символьных строк. Для этого содержимое опять
преобразуется в символьную строку.
+ или &
В качестве оператора
объединения строк в Visual Basic можно использовать как знак суммирования (+),
так и знак "коммерческое и" (&). Однако для лучшей читаемости
кода следует применять только &, так как знак плюса используется обычно при
суммировании числовых значений. Но не следует забывать и о том, что знак &
функционирует и как идентификатор типа для переменных Long, если он находится в
конце имени.
Переменные типа
Variant имеют большое практическое значение, однако при их применении возникают
проблемы. Вопервых, при чтении кода не видно, какой внутренний тип имеет
переменная в данный момент. Это может крайне затруднить обнаружение логических
ошибок программирования. Вовторых, данные этого типа изза частых внутренних
преобразований занимают больше памяти, чем аналогичные данные, объявленные с указанием
явного типа.
Тип по умолчанию
Visual Basic всегда по умолчанию
применяет тип Variant. На этом пока закончим обсуждение темы переменных. В
следующей главе будут рассмотрены области определения, время жизни и массивы
переменных.
Событийноуправляемое программирование
Ориентирование на
события — это стержень создания Windows приложений в Visual Basic. При этом
разработка выполняется не только в Windows, но и как Windows.
Microsoft Windows —
это система, базирующаяся на сообщениях и событиях. Это значит, что каждое
действие в Windows вызывает событие, которое в виде сообщения передается в
приложение. Приложение анализирует сообщение и выполняет соответствующие
действия.
Основанием для
подобной обработки действий служит сама концепция Windows. В среде Windows
пользователь может работать одновременно с несколькими приложениями. Например,
он может редактировать текст в текстовом редакторе и, переключаясь в профамму
обработки электронных таблиц, выполнять некоторые расчеты. Поэтому ни одно
приложение не может функционировать само по себе, не взаимодействуя с другими
приложениями и с орерационной системой. Вышестоящая инстанция должна ему
сообщить, что происходит, и только тогда приложение реагирует на это.
Допустим, что в
Windows выполняются два приложения. Ни одно из них не может просто перехватить
инициативу и среагировать на нажатие клавиш, так как это событие может быть
предназначено другому приложению. Поэтому Windows сначала воспринимает событие,
вызванное нажатием клавиш, а затем решает, кому передать обработку этого
события. Затем нажатие клавиши в виде сообщения посылается приложению.
Приложение обрабатывает событие, связанное с клавиатурой, и анализирует
клавиатурный ввод, отображая его, например, в активном элементе управления
(рис. 1.20).
Разумеется, такое
представление является слишком упрощенным. Обычно при обработке нажатия клавиш
вызывается значительно больше сообщений и событий.
Приложения, созданные
с помощью Visual Basic, также работают по этому принципу. Но при этом система
Visual Basic берет на себя часть работы. Она перехватывает сообщение и передает
его соответствующему объекту (например, кнопке), где затем вызывает
соответствующее событие (например, событие click).
События
Когда вы в программе
HELLOWORLD щелкаете мышью на кнопке Hello world, происходит событие.
Visual Basic перехватывает соответствующее сообщение Windows и вызывает событие
Click объекта commandl. Просмотрите еще раз код программы. Вы ввели лишь Print
"Hello world", но весь код выглядит следующим образом:
Private Sub Commandl_Click()
Print "Hello world" End Sub
Процедуры события
легко узнать по их заголовку, который состоит из имен объекта и события. В
приведенном примере код выполнится лишь тогда, когда для объекта Commandl
наступит событие Click.
Главный вывод: для
выполнения программного кода всегда необходимо событие. Это одно из важнейших
правил создания приложений в Visual Basic. Ни один код не выполняется без
события. Это правило имеет лишь одно исключение, о котором мы поговорим позже.
Если вы уже разрабатывали
приложения в других системах программирования, основанных на линейном принципе
построения программ, то здесь вам придется перестроиться. В программах,
управляемых событиями, нет сплошного кода, который выполняется от начала до
конца. Это значит, что после запуска программы у пользователя больше нет четко
определенного пути. Он может в любое время нажать какуюнибудь кнопку в
приложении, может выполнить ввод текста в поле, может в любое время прекратить
обработку и вызвать другую программу.
Windows и Visual
Basic предоставляют ряд различных событий. Приложению следует подождать, пока
одно из этих событий не наступит, и только потом выполнять код.
Объекты
В предыдущих разделах
часто говорилось об объектах. Объекты являются причиной использования в Visual
Basic понятий из объектноориентированного программирования, хотя сам по себе
Visual Basic не является объектно ориентированным языком.
Многое, или почти все
из того, с чем вы работаете в Visual Basic, является объектами. Так, командная
кнопка в приложении HELLOWORLD это
объект. Линия в форме — это также объект. Объектами являются команды меню,
принтер, базы данных и т.д.
Элементы управления
Объекты на панели
элементов называются элементами управления (Controls). Работая с ними,
пользователь инициирует определенные события и в результате может управлять
программой.
Каждый объект
характеризуется определенными параметрами, которые можно разделить на три
категории:
.
• события;
.
• методы;
.
• свойства.
Классы
Объекты объединяются
в классы. К одному классу принадлежат объекты с одинаковым набором свойств,
методов и событий.
События связаны с
определенными действиями пользователя и могут вызывать код Visual Basic. Методы
— это рабочие операторы объекта. Например, метод Move позволяет переместить
элемент управления в заданную позицию. Свойства отвечают за внешний вид и
поведение объекта. Например, свойство Caption определяет текст надписи на
объекте.
Рис. 1.2!. Категории
объектов
Чтобы изложенное не
казалось слишком абстрактным, рассмотрим это на примере телефона. Звонок
телефона — это событие. Мы реагируем на него и поднимаем трубку. Чтобы
позвонить комунибудь, мы применяем метод "набрать". А свойства
определяют внешний вид аппарата, например "цвет".
Метод или свойство?
Границы между
свойствами и методами расплывчаты. Есть, например, метод Move, который изменяет
позицию объекта. Но есть и некоторые свойства (Top, Left), выполняющие
аналогичные действия. Основное различие между методами и свойствами заключается
в том, что со свойствами можно работать как во время разработки проекта, так и
во время выполнения приложения, тогда как методы доступны только при
выполнении. Следует заметить, что некоторые свойства могут быть также
недоступны при разработке приложения, а во время его работы доступны только для
чтения.
Список свойств,
которые разработчик может изменять при разработке приложения, отображается в
окне свойств элемента управления.
Для отображения окна
свойств следует нажать клавишу [F4],
соответствующую
кнопку на панели инструментов либо выбрать
команду Properties Window меню
View.
В списке под строкой
заголовка окна свойств, а также и из самого заголовка видно, свойства какого
объекта отображены в настоящий момент. Обычно в окне свойств отображен
выделенный элемент управления. Если не выделен ни один элемент управления, то
отображаются свойства активной формы.
При изменении свойств
объекта всегда следует обращать внимание на то, какой объект управления
выделен.
Теперь вернемся от
теории к практике, а именно к программе HELLOWORLD. Давайте детальнее
рассмотрим командную кнопку.
Свойство Name
Свойство Caption, а
значит и надпись на кнопке, мы уже изменили. В верхней области окна свойств
найдите свойство Name. Это свойство — одно из основных свойств большинства
объектов. В коде программы объект идентифицируется по имени, которое
указывается в этом поле. По умолчанию первому объекту CommandButton Visual
Basic присваивает имя Commandl, которое и отображено в поле значения свойства
Name. Оно появляется и в первой строке процедуры события:
Private Sub Commandl_Click()
Если теперь изменить
имя кнопки, этот код будет недействительным, так как объекта с именем Commandl
больше нет!
Изменить имя!
Имя каждого объекта
следует изменять до написания кода для этого элемента, так как это
предотвращает неприятности и путаницу со стандартным именем. Следует также
использовать информативные имена, например AddRecord. При вставке нескольких
кнопок по умолчанию каждой последующей кнопке Visual Basic присвиавал бы имена
Command2, Commands и т.д. Порядок присвоения имен будет рассмотрен в
соответствующей главе.
Таблица
1.3. Некоторые свойства кнопок Свойство Значение
Appearance
Трехмерный эффект BackColor Цвет фона Cancel Кнопка включается нажатием клавиши
[Esc]
Caption Надпись
Default Кнопка
включается нажатием клавиши [Enter] Draglcon Пиктограмма при перемещении
DragMode Ручной или автоматический
режим перетаскивания (Dg&D )
Enabled Доступность элемента Font Вид шрифта Height Высота
объекта
HelpContextId Привязка к собственному
справочному файлу
Свойство
Значение
Index |
Индекс элемента управления в
массиве |
Left |
Левый верхний угол, координата
Х |
Mouselcon |
Изображение указателя мыши на
кнопке |
MousePointer |
Форма указателя мыши на кнопке
|
Name |
Имя элемента управления |
Tablndex |
Порядок перемещения фокуса при
нажатии клавиши [Tab] |
TabStop |
Возможность перехода к
элементу управления с помощью клавиши [Tab] |
|
(True/False) |
Tag |
Содержит любую необходимую
дополнительную информацию |
Top |
Левый верхний угол, координата
Y |
Visible |
Видимость (True/False) |
WhatsThisHelpID |
Привязка к собственному
справочному файлу |
Width |
Ширина объекта |
В таблице представлены свойства кнопки
(CommandButton). Некоторыми свойствами, например Font или Height и width,
обладают и другие объекты. Но в основном каждый объект имеет свой специфический
набор свойств. Для их просмотра нужно выбрать имя объекта в первой строке окна
свойств или выделить его в форме.
Значения одних свойств могут быть произвольными и
вводятся с клавиатуры (например, свойство caption), значения других —
фиксированы и выбираются из списка значений, (например. True или False для
свойства Visible), третьи могут устанавливаться из дополнительного диалогового
окна (например, Font).
Скорость — это не волшебство
Для быстрого
изменения свойства достаточно дважды щелкнуть на его имени. Если значения
свойства можно установить с помощью клавиатуры, текст свойства выделяется. Если
значения свойства выбираются из множества фиксированных значений, то очередное
значение выделяется в списке свойств или отображается в диалоговом окне
установки значения свойства.
Написание имен
После двойного щелчка
на кнопке открывается окно кода. В верхней части окна слева расположено поле со
списком (Object), а справа — (Procedure). Их расположение
подчеркивает, что каждое событие всегда связано с объектами.
На рис. 1.23
показано, как составляется имя процедуры из имени объекта и имени события,
разделенных символом подчеркивания. Подобным образом осуществляется доступ к
свойствам объекта, но в качестве разделителя ставится точка:
Commandl.Caption = "Hello world"
Таким же образом
получают доступ и к методам:
Commandl.Move 120, 250
В разделе,
посвященном элементам управления, мы подробнее остановимся на правилах
формирования имен объектов.
Каталог объектов
Получить информацию о
некотором объекте можно также из каталога объектов, который содержит список
всех объектов Visual Basic, сгруппированный по категориям. Эти категории
называются библиотеками объектов.
Каталог объектов
можно открыть при помощи кнопки на панели
инструментов или команды меню
View\0bject Browser.
В верхнем поле списка
выберите необходимую библиотеку либо объекты из всех библиотек (стандартные
элементы управления содержит библиотека VB (Visual Basic objects and
procedures)). В списке Classes перечислены все объекты Visual Basic.
После выбора объекта в списке Members of <Имя класса> выводятся
все относящиеся к нему свойства и методы. При этом в нижней части диалогового
окна дается краткое описание свойства или метода. Нажав клавишу [F1] либо
кнопку со знаком вопроса, можно вызвать справочную информацию с подробным
пояснением ключевого слова. Свойство или метод можно скопировать в буфер
обмена, а затем вставить в окне кода.
Чтобы найти конкретное свойство или
метод, введите нужное имя и\восполь�
зуйтесь кнопкой поиска. 1
Для добавления
библиотек объектов воспользуйтесь командой Project\Refe rences. Но на
этом мы подробнее остановимся в главе "Программирование на Visual
Basic".
Процедуры и функции
В
Visual Basic, как и во многих других языках программирования, весь программный
код находится внутри процедур. Что же такое процедура?
С
примером процедуры вы уже знакомы. Код для программы HELLOWORLD находится в
процедуре, точнее в процедуре обработки события.
Процедура
Собственно, процедура
— это подпрограмма. Она начинается оператором Sub и заканчивается оператором
End, между которыми и помещается код. Такие процедуры могут вызываться или
самим Visual Basic (процедуры обработки событий), или другими процедурами. При
этом обработчики событий реализуются как процедуры. Имя процедуры обработки
события состоит из имени объекта и имени события:
Private Sub Commandl
Click() End Sub
Можно создавать и
собственные процедуры, так называемые общие процедуры. Для этого нужно перейти
к секции (General) (Declaration). В окне кода введите sub, затем имя,
например Spends, и нажмите клавишу [Enter]. После этого появляется новая
процедура:
Sub Spends () End Sub
Эта процедура
относится к секции (General) (Declaration). Заголовок процедуры
заканчивается пустыми скобками, однако там могут помещаться аргументы.
Аргументы
Использование
аргументов в процедурах событий можно увидеть на примере события MouseMove. Для
некоторых событий после имени в скобках указываются аргументы, при помощи
которых процедуре передаются необходимые ей значения. Для процедур обработки
событий эти аргументы обычно устанавливает Visual Basic.
Если выбрать из (Procedure)
событие MouseMove, то процедура будет выглядеть так:
Private
Sub Commandl MouseMove(Button As Integer,_ Shift As Integer, X As Single, Y As
Single) End Sub
Для события MouseMove
Visual Basic передает четыре аргумента — состояние кнопок мыши (Button),
клавиши (Shift) и координаты X и Y курсора. Если вы сами пишете процедуру, то
сами задаете аргументы. Допустим, вы хотите написать процедуру, которая выводит
текст.
Sub HelloOut () Print
"Здравствуй, читатель" End Sub
Вызов процедуры
Создание подобной
процедуры имеет то преимущество, что при необходимости вывести строку
"Здравствуй, читатель" достаточно всего лишь вызвать ее, а не вводить
всю строку кода. Теперь процедура вызывается как обычный оператор Visual Basic:
Private Sub
Commandl_Click() HelloOut
End Sub
В этом примере из процедуры Commandl_ciiclt
вызывается процедура HelloOut. Если исходить из того, что до и после вызова стоят
и другие операторы, то при вызове HelloOut программа переходит в эту процедуру,
выполняет ее операторы и опять возвращается в точку прерывания, в процедуру
Commandl_ciick.
Как уже упоминалось,
в созданных процедурах могут использоваться и аргументы. Они просто помещаются
в скобках в заголовке процедуры с указанием (при необходимости) типа данных.
Если добавить аргументы, данный пример
можно расширить так, чтобы
процедура |
HeiloOut |
выводила |
не |
один |
и тот |
же |
текст, |
а любой |
другой, |
|||||
задаваемый |
при |
вызове |
процедуры. |
Определе |
ние |
процедуры |
может |
|||||||
расшириться следующим
образом: |
|
|
|
|
|
|
|
|||||||
Sub HelloOut(Message As
String) |
|
|
|
|
|
|
|
|||||||
Print "Здравствуй, " S Message End |
|
|
|
|
|
|
|
|||||||
Sub |
|
|
|
|
|
|
|
|||||||
Нужно изменить также и вызов процедуры: Private Sub Commandl_Click (") HelloOut
"Анлрей" • End Sub
В этом примере вызывается та же процедура HelloOut.
При этом ей дополни тельно передается один аргумент.
Функция
Функция построена
точно так же, как процедура. Однако есть одно отличие. Как и в математике, результатом
работы функции является возвращаемое значение. Примером может служить функция
вычисления налога на добавленную стоимость. Функция в качестве аргументов
получает сумму нетто и налоговую ставку и должна возвращать сумму налога:
Function NDS(Netto As
Currency, Percent As Single) As Currency NDS = Netto * Percent End Function
Для определения
функции используется ключевое слово Function. В конце процедуры вместо End
Sub пишется End Function. В данном случае в заголовке функции передаются
два аргумента. Вас могут удивить два последних слова в первой строке кода.
Объяснение этому очень простое: Visual Basic должен знать тип возвращаемого
значения и слова за скобками указывают это тип. В примере в качестве
возвращаемого значения передается денежная величина. Поэтому функцию нужно
определять как As Currency.
Определение
возвращаемого значения
Во второй строке процедуры вычисляется налог
на добавленную стоимость, что с математической точки зрения не представляет
никаких проблем. Особенность заключается в том, что имя функции используется
одновременно как переменная. Это значит, что переменная с именем функции
содержит возвращаемое значение.
Вызов функции
несколько отличается от вызова процедуры:
Private Sub
Commandl_Click() Dim Tax As Currency Tax = NDS(100, 0.15)
End Sub
Вызов
функции
В этой процедуре вызывается функция NDS. В качестве
аргументов ей передаются значения 100 и 0.15, являющиеся, соответственно, нетто
и налоговой ставкой. Возвращаемое значение, в данном случае 15, присваивается
переменной Tax.
Обратите внимание на
различия при вызове функций и процедур. При вызове функций аргументы
указываются в скобках. Возвращаемое значение должно быть присвоено переменной,
поэтому функция должна вызываться следующим образом:
Возвращаемое_значение = Функция (Аргумент!,
Аргумент?....)
В процедурах же
аргументы не берутся в скобки. Нет также и возвращаемого значения:
Процедура Аргумент!, Аргумент?, ...
Обобщение
Процедуры — это, как
правило, маленькие подпрограммы, которые можно вызывать из других мест
программы. Поэтому если в вашем приложении есть часто повторяющаяся задача, то
следует создать процедуру, которая бы ее выполняла, а затем при необходимости
просто вызывать ее' — это может существенно сэкономить время. События всегда
обрабатываются в процедурах.
Функции ведут себя
так же, как процедуры. Самое важное отличие — каждая функция всегда возвращает
только одно значение.
Знакомство с проектом
Приложение, разрабатываемое в Visual
Basic, называется проектом не
случайно: дело не
столько в названии, сколько в том, что за другим названием скрывается и другая
идея. Это ясно видно при сохранении проекта.
Сохранение
Как уже говорилось,
приложения Visual Basic строятся по модульному принципу, т.е. могут состоять из
различных компонентов. Все эти компоненты хранятся в памяти отдельно и
независимо друг от друга. Это можно увидеть, сохраняя программу HELLOWORLD. Для
этого нужно выбрать в меню File команду Save Project или щелкнуть
на пиктограмме с изображением дискеты на панели инструментов. После этого для
каждой составляющей проекта появляется диалоговое окно Save As.... Так как
стандартное имя Formi, назначаемое по умолчанию форме, не очень содержательно,
следует дать новое имя, например HELLOWORLD. В результате форма сохранится в
файле HELLOWORLD.FRM.
После сохранения всех
компонентов проекта сохраняется непосредственно сам проект. При этом создается
файл с именем HELLOWORLD.VBP.
В файле проекта,
кроме некоторых установок, хранится также информация о его компонентах и связях
между ними. Сам компонент, например форма HelloWorld, ничего не
"знает" о других компонентах проекта. Поэтому их можно включать и в
другие проекты.
Компоненты
Проект может
содержать следующие компоненты:
.
• Файл каждой формы (*.FRM).
.
• Файл каждой формы с элементами управления, содержащий
бинарную информацию (*.FRX).
.
• Файл каждого модуля (*.BAS).
.
• Файл каждого модуля классов (*.CLS).
.
• Файлы дополнительных элементов управления (*.ОСХ).
.
• Максимум один файл ресурсов (*.RES).
.
• Файл проекта, содержащий ссылки на свои компоненты (*.VBP).
.
• Ряд дополнительных файлов, зависящих от вида проекта (*.CTL
и др.).
Открытие проекта
Итак, отдельные
составляющие проекта сохраняются отдельно. При выполнении команды File\0pen
Project они загружаются с учетом взаимосвязей между ними.
Каждый компонент
проекта можно сохранять или удалять отдельно. Для этого нужно выделить его в
окне проекта и выбрать команду меню File\Save или Project\Remove, если
он больше не нужен в проекте. В проект можно добавлять уже имеющиеся компоненты
посредством команды Project\Add. Таким же образом можно добавить пустые
компоненты.
Компиляция
Чтобы программа
Visual Basic могла выполняться не только в среде Visual
Basic, нужно ее скомпилировать. Для
компиляции предназначена команда
меню
File\Make •**.ЕХЕ.
ОСХ —расширения Visual Basic
Одна из причин успеха
Visual Basic состоит в возможности использования так называемых Custom
Controls — элементов управления, разработанных сторонними производителями.
От ОСХ к ActiveX
Если в Visual Basic
4.0 можно создавать как 16разрядные, так и 32 разрядные приложения, то начиная
с Visual Basic 5.0 — только 32разрядные. Поэтому Visual Basic использует новый
стандарт для элементов управления — технологию ActiveX. Элементы ActiveX
повышают быстродействие приложения и зачастую имеют меньший объем памяти, чем
старые ОСХ. При этом в новой версии приемы работы с ними не изменились. С
помощью Visual Basic такие элементы управления можно создавать самим.
В названии ОСХ первая
буква обозначает OLE (Object Linking and Embedding). Возможно, вам знакома эта
технология по работе с другими приложениями Windows. Так, технология OLE
применяется при вставке в документ Word для Windows объектов из других
приложений Microsoft Office. В приложение Visual Basic в качестве элемента
управления можно включать OLE сервер.
Элементы управления
Для включения
элемента управления в проект нужно вызвать диалоговое окно Project\Components.
На вкладках Controls, Designers и Insertable Objects этого окна
выбираются элементы управления, которые необходимо добавить к данному проекту.
Отображение окоп среды
В некоторых случаях
после загрузки проекта Visual Basic не отображает все окна среды разработчика —
окна проекта и свойств, панель элементов. Для активизации
"пропавшего" окна воспользуйтесь одной из команд меню View.
Управление проектом
Теперь остановимся на управлении проектом
Visual Basic и его компонентами. Проект Visual Basic состоит из многих
компонентов: форм, модулей, классов и ресурсов. Все эти компоненты объединяются
в едином файле проекта Visual Basic (VBP). Все компоненты, за исключением ряда
файлов, например рисунков, справочных файлов, текстовых и некоторых других,
отображаются в окне проекта.
Составляющие проекта
Visual Basic
Проект Visual Basic может состоять из
следующих компонентов:
Таблица 1.4. Составляющие проекта Visual
Basic
Компонент |
Расширение файла |
Форма |
FRM |
Модуль класса |
CLS |
Модуль Basic |
BAS |
Файл ресурсов |
RES |
OLE Custom Control |
ОСХ |
Файл проекта Visual Basic |
VBP |
Группа проекта |
VBG |
Исходный код элемента управления ActiveX CTL
Документы ActiveX |
VB& |
Файл сообщений Crystal Report
|
RPT |
База данных Microsoft Access |
MDB |
Файл сохранения установок |
1NI |
Файл рисунков |
BMP |
Справочный файл Windows |
HLP |
Файл в формате RTF (Rich text
format) |
RTF |
Файл пиктограмм |
[CO |
Библиотека динамической
компоновки |
DLL |
Таблица содержит наиболее часто используемые
компоненты, входящие в проекты Visual Basic. Сюда могут входить и разработанные
вами файлы.
Упраиление некоторыми из перечисленных компонентов
осуществляет сам Visual Basic (форма, модули и т.д.). Управление всеми
остальными вы должны осуществлять сами.
Сохранение файлов проекта
При сохранении
проекта и его компонентов следует учитывать некоторые особенности.
Первая проблема
заключается в том, что при нажатии кнопки сохранения на панели инструментов
Visual Basic сохраняется не весь проект, а только активный компонент (модуль
или форма).
Для сохранения всего
проекта необходимо вызвать команду File\Save Project или File\Save Project
As... . При этом сохраняются и отдельные компоненты.
Помните, что в файле
компонента не сохраняется информация о том, какому проекту он принадлежит.
Список компонентов проекта и все связи между компонентами сохраняются только в
файле проекта (VBP). При этом несколько проектов можно объединять в один файл
группы (VBG).
Таким образом, в
других проектах можно использовать некоторую составную часть любого проекта,
например модуль, форму и т.д. Но для этого следует скопировать и каталог
проекта нужный файл или файлы и добавить их в проект командой Project\Add...
.
Поставляемые файлы
Некоторые из файлов
после компиляции содержатся непосредственно в исполняемом файле, но другие
следует инсталлировать дополнительно.
Например, если файлы
форм и модули компилируются в ЕХЕфайл, то пользовательские элементы управления
(Custom Controls) должны поставляться с приложением.
Если вы применяете
специальные функции Visual Basic, например доступа к базам данных, то нужно
поставлять еще и ряд других файлов (DLL и др.). При создании инсталляционного
пакета существенную помощь может оказать мастер инсталляции.
Управление версиями
Обычно приложения не
создаются сразу. Создание приложения — это длительный и многоитерационный
процесс. В ходе разработки обычно появляются новые версии, которыми тоже нужно
разумно управлять.
Управление версиями
необходимо в тех случаях, если над проектом работает большая группа
разработчиков на протяжении длительного времени. В промышленном издании Visual
Basic для управления версиями проекта используется утилита Visual SourceSafe.
Управление версиями
можно реализовать и в других изданиях Visual Basic. Сначала для каждой новой
версии проекта нужно создать отдельный каталог или дерево каталогов, что
облегчит доступ к различным версиям.
Принцип библиотеки
При коллективной
работе различные версии проекта могут храниться на файлсервере. При этом нужно
четко определить, кто с каким файлом работает. В этом случае можно использовать
так называемый принцип библиотеки. Это значит, что каждый файл выдается
разработчику проекта во временное пользование и пока файл находится у
"абонента", доступ к нему невозможен. По окончании работы над этим
файлом разработчик возвращает файл в "библиотеку".
Номер версии
Visual Basic
предоставляет еще одну возможность управления версиями при создании ЕХЕфайла
(команда File\Make ***.EXE, кнопка Options). В диалоговом окне свойств
проекта можно установить версию проекта. Номер версии отображается также в окне
быстрого просмотра Windows 95/98 и может использоваться при инсталляции
приложения для замены более старых версий компонентов.
Управление номером
версии можно автоматизировать установкой опции автоматического увеличения
номера версии Auto Increment (команда Project\Properties, вкладка
Make).
Глава 2
Программирова ние на Visual Basic
Пусть вас не пугает
заголовок данной главы. В ней излагаются всего лишь основы языка Visual Basic:
использование констант, переменных и их свойства; инструкции управления,
порядок выполнения команд и циклы; работа с элементами управления и
использование ресурсов.
Переменные
Переменные уже
рассматривались в предыдущей главе. Напомним, что переменная — это именованная
область памяти, предназначенная для хранения данных. Таким образом, для доступа
к содержимому памяти достаточно знать имя переменной. Тип данных задает
определенный формат или размер содержимого переменной.
Такая информация о
переменных — всего лишь вершина айсберга, так как о них можно говорить много. В
данном разделе описаны области определения и видимости, время жизни переменных,
константы и типы данных, определяемые пользователем, а также рассматриваются
массивы переменных.
Явное и неявное объявления
О возможностях явного
и неявного объявления переменных кратко упоминалось в первой главе. Visual
Basic не требует обязательного явного объявления переменных. При неявном
объявлении переменные просто используются в программе, при явном они
предварительно должны быть определены (например, посредством оператора Dim).
Небольшой пример демонстрирует оба варианта:
Dim varName As String
'явное объявление ^t •= 7
'неявное объявление
Как уже говорилось,
явное объявление имеет некоторые преимущества: оно более наглядно, улучшает
читабельность программы и т.п.
Option Explicit
Чтобы переменные
всегда объявлялись явно, используйте опцию Explicit. В этом случае Visual Basic
будет требовать явного объявления переменных, что устраняет возможные ошибки
при написании программы:
Dim Variable As Variant Variable = 10
Variable = Variabel * 5 'строка с
ошибкой Print Variable
В данном примере
переменная Variable определена явно. Но в третьей строке допущена описка,
которая приведет к тому, что вместо значения 50 будет выведено значение о.
Причина в том, что переменная Variabel (ошибочно указанная вместо Variable)
неявно объявляется Visual Basic как новая переменная типа Variant, что
исключается при использовании Option Explicit.
Для активизации этой
опции следует открыть диалоговое окно Options (команда меню Tools\0ptions...)
и на вкладке Editor установить опцию Require Variable
Declaration. В результате во все вновь создаваемые компоненты (формы,
модули, классы) автоматически вставляется строка Option Explicit. Но это не
выполняется для созданных ранее компонентов приложения: форм, модулей или
классов. Для решения этой проблемы необходимо вручную добавить строку Option
Explicit в секцию (General) (Declarations) существующих форм, модулей
или классов.
Гис. 2. I. Опции
Option Explicit в форме
После установки этой
опции Visual Basic требует явного описания переменных и при использовании в
коде необъявленной переменной выдаст сообщение об ошибке компиляции. Удаление
указанной строки разрешит неявное объявление переменных.
7мм данных
При объявлении
переменных может указываться тип данных. Это выполняется с помощью оператора
Dim:
Dim Имя_переменной As Тип_данных
Имя переменной задается с учетом
некоторых ограничений: оно должно начинаться с буквы; не может содержать более
255 символов;
кроме |
букв |
и |
|
цифр |
разрешается |
использовать |
только |
знак |
|||
подчеркивания (_). |
|
|
|
|
|
|
|
||||
Вместо |
Тип |
данных |
указывается |
ключевое |
слово |
для |
данных |
||||
соответствующего типа. При этом разрешены
типы, приведенные в табл.
2.1.
Таблица 2.1. Типы переменных
Тип данных |
Что он обозначает |
Byte |
Однобайтное целое число |
Boolean |
Логическое значение |
Integer |
Целое число |
Long |
Длинное целое число |
Currency |
Денежная величина |
Single |
Число с плавающей запятой |
Double |
Число с плавающей запятой двойной точности |
Decimal |
Десятичное число |
Date |
Дата/время |
String |
Строка переменной длины |
String * длина . |
Строка постоянной длины |
Variant |
Любой тип данных |
uscrtype |
Пользовательский тип данных |
Object |
Ссылка на объект |
objectlype |
Имя OLEобъекта типа objccttype
|
Dim
A As Byte Dim A As Integer, С
As Long
В данном примере используются
различные объявления. Оператор Dim
позволяет объявлять
несколько переменных, но для каждой из них следует
указать тип данных.
Если для переменной не указан явный тип данных. Visual
Basic присваивает ей тип
Variant:
Dim А, В As Byte Dim С,
D As Integer
В этом примере
переменным А и с присваивается тип Variant, в — тип Byte, a D —
тип Integer.
Deftype
Чтобы Visual Basic не
задавал тип Variant переменной, объявленной без указания типа данных, можно
использовать оператор вида Deftype. Вместо type указывается определенный тип
данных:
DefBool Начальная буква
[ Конечная буква] DefByte Начальная буква [ Конечная буква] Defint Начальная
буква [ Конечная буква]
DefLng Начальна
буква Конечнаябуква]
DefSng Начальна буква Конечнаябуква]
DefDbl |
Начальна |
буква |
Конечнаябуква] |
DefDec |
Начальна |
буква |
Конечнаябуква] |
DefDate Начальна |
буква |
Конечнаябуква] |
|
DefCur |
Начальна |
буква |
Конечнаябуква] |
DefStr |
Начальна |
буква |
Конечнаябуква] |
DefObj |
Начальна |
буква |
Конечнаябуква] |
DefVar |
Начальна |
буква |
Конечнаябуква] |
Таблица 2.2. Операторы определения типов данных
Оператор
Подразумеваемый тип данных
DefBool |
Boolean |
DefByte |
Byte |
Defint |
Integer |
DefLng |
Long |
DefCur |
Currency |
DefSng |
Single |
DefDbl |
Double |
DefDec |
Decimal (не поддерживаетсё) |
DefDate |
Date |
DefStr |
String |
DefObj |
Object |
DefVar |
Variant |
Операторы,
приведенные в таблице, можно использовать только в
секции объявления: '(General)(Declarations) Defint A Z Dim A, B As Byte Dim С, D As Long
Во
второй строке определяется, что все переменные, не объявленные явно и
начинающиеся с любой буквы в диапазоне от А до Z, будут по умолчанию иметь тип Integer.
Таким образом, в примере переменные в и D имеют соответственно типы Byte и
Long, а переменные А и с — тип Integer.
Применение оператора
Deftype уменьшает количество ошибок при использовании типа данных Variant. Об
этом подробнее говорится в пятой главе.
Область
определения
Весьма важной характеристикой переменных
является область их определения. В Visual Basic есть три вида областей
определения, характеризующих доступность переменной:
.
• локальная: переменная доступна только в текущей
процедуре;
.
• контейнера: переменная доступна только в текущей
форме, модуле или классе;
.
• глобальная: переменная доступна во всем проекте.
Локалмш переменные
Локальными являются
переменные, определяемые внутри процедуры или функции. Они доступны только
внутри этой процедуры.
Переменные контейнера
Переменные контейнера
определяются в секции (General) (Declarations) и доступны только внутри
соответствующего контейнера, т.е. формы, модуля или класса.
Глобальные переменные
Глобальные переменные
определяются в секции (General) (Declarations) модуля. При этом вместо
оператора Dim используется зарезервированное слово Public. Глобальные
переменные доступны во всех модулях и процедурах проекта.
Термин глобальная происходит
из старых версий Visual Basic, где вместо слова public использовалось Global.
Но начиная с пятой версии Visual Basic, зарезервированное слово Global в этом
контексте больше не используется.
Время жизни переменных
Локально объявленные
переменные при выходе из процедуры удаляются из памяти, а при новом вызове
процедуры инициализируются заново. Их содержимое при этом не сохраняется, что
не всегда желательно. Этого можно было бы избежать путем расширения области
определения, т.е. объявив переменную глобальной или, как минимум, переменной
контейнера. Но это разрешает доступ к переменной из других процедур.
Статические переменные
Visual Basic дает
возможность объявлять переменные как статические. При выходе из процедуры
содержимое статической переменной сохраняется. При новом вызове этой процедуры
переменной присваивается значение, которое она имела при последнем выходе из
этой процедуры. Содержимое переменной сохраняется в течение всего времени, пока
существует в памяти форма или модуль.
Для объявления
переменной как статической нужно просто вместо оператора Dim использовать слово
Static:
Static Ммя_переменной [As Тип_переменной]
Private Sub Commandl_Click()
Static A As Integer
Dim В As Integer
A A + 1
В = В + 1
Print A
Print В
End Sub
Статическая
переменная А при каждом щелчке на кнопке Commandl увеличивается на
единицу. Нестатическая переменная в при каждом щелчке инициализируется заново,
поэтому ее значение при выходе всегда будет равно 1.
Чтобы объявить
статическими все локальные переменные прочедуры,ч,ся®дует записать ключевое
слово Static в заголовке процедуры:
Static Sub I Function 1 Property ([Аргументы] )
Static Sub Test ()
Dim А,В As Integer End Sub
В примере обе
переменные — А типа Variant и в типа Integer — будут статическими.
Массивы
Массив — это набор
элементов определенного типа, каждый из которых имеет свой порядковый номер,
называемый индексом. Различают статические и динамические массивы.
Границы статического
массива устанавливаются на этапе разработки и могут изменяться только в новой
версии программы.
Динамические массивы
изменяют свои границы в ходе выполнения программы. С их помощью можно
динамически задавать размер массива в соответствии с конкретными условиями. Однако
следует учесть, что работа с динамическими массивами требует дополнительных
затрат на программирование.
Статические массивы
Представьте себе, что
вы являетесь председателем союза и хотели бы хранить фамилии всех 150 его
участников. Для этого можно просто определить и использовать 150 различных
переменных типа String. Но все языки программирования высокого уровня
предлагают лучшее решение — массивы (arrays).
Вместо объявления 150
различных переменных (типа namel, name2, name3, пате4,...) можно просто
объявить один массив, содержащий 150 однотипных элементов.
Для объявления
массива используется оператор Dim с указанием в круглых скобках после имени
массива его максимального индекса;
Dim aName(150) As
String
В
этом случае элементы переменной aName различают не по имени, а по индексу:
aName (4) =
"Иванов" Print aName(7)
Область определения
То, что уже
говорилось о времени жизни и области определения переменных, относится большей
частью и к массивам. Однако статические массивы нельзя определить локально
внутри процедуры, а только глобально или для контейнера:
[Static I Public I Dim] Имя_переменной
(Верхняя_граница)
Индексирование с нуля
При использовании
массивов не следует забывать, что в Visual Basic индексирование всегда
начинается с нуля, т.е. индекс 0 обозначает первый элемент массива, индекс 1 —
второй и т.д.
Option Base
Оператор Option Base
позволяет задать индексацию массива с 1:
'(General)(Declarations)
Option Base 1
Этот
оператор должен находиться в секции (General) (Declarations) контейнера
(формы, модуля, класса).
Допустимыми
значениями для Option Base являются только 0 и 1. Этот оператор служит для
того, чтобы обеспечить совместимость Visual Basic с другими диалектами Basic,
индексация в которых начинается с 1.
Для
установки других границ массива необходимо использовать следующий синтаксис:
[Static I Public I
Dim] Имя_переыеннои ([Нижн_предел То] Верхн_предел)
Указанием верхней и
нижней границ можно задать любые диапазоны индекса. Это удобно, если индекс
несет также определенную смысловую нагрузку (дата, номер заказа, возраст и
т.п.):
'(General)(Declarations)
Dim aBirthDate (1980 То 2050)
Многомерные массивы
Visual Basic
позволяет также создавать многомерные массивы. При объявлении многомерного
массива верхние границы каждой размерности разделяются запятыми:
'(General)(Declarations)
Dim aName (10, 25) As String
Массив
с именем aName может содержать 286 различных значений (11 х 26 = 286).
Private Sub Conunandl_Click ()
aName (1, 3) = "X" End Sub
Размерность массива
может быть и больше. Например, вы составляете список учащихся пяти различных
школ, в каждой из которых по десять классов, а в каждом классе максимум 30
учеников.
В этом случае можно
использовать трехмерный массив, где первое измерение относится к школе, второе
— к классу, а третье — к номеру ученика:
Dim aStudent (5, 10,
30) aStudent (3, 5,
17) =
"Иванов"
В данном примере
"Иванов" — это фамилия под номером 17 ученика 5го класса школы номер
3.
Но трехмерный массив
еще не предел — в Visual Basic значения раам^№<х?Ги массивов могут достигать
60. Для отдельных значений размеров могут указываться диапазоны индексов:
Dim aArrayCIO, 80 То
120, 40 То 45, 1 То 256, 1, 1997 То 2050)
Динамические массивы
Иногда при объявлении
массива его размер не известен. В этом случае следует объявлять динамический
массив, что позволяет изменять его размер или размерность во время выполнения
приложения.
Динамический
массив*создается в два этапа. Сначала массив определяют в секции (General)
(Declarations) контейнера (формы, модуля, класса) без указания размера:
'
(General)(Declarations) Dim aArrayO As Variant
Затем
с помощью оператора Re Dim устанавливают фактический размер массива:
'(General)(Declarations)
Dim aArray () As
Variant Private Sub Commandl_Click()
ReDim aArray (50, 10)
'Код
End Sub
Синтаксис оператора ReDim:
ReDim (Preserve]
Имя_переменной (Границы) [As Гип_данных]
• В отличие от
обычного Dim, оператор ReDim используется только в процедурах. При этом тип
данных указывать не обязательно, особенно если он уже определен оператором Dim.
Вы можете использовать оператор ReDim для изменения числа элементов или
размерности массива. Однако вы не можете объявить массив с данными одного типа,
а затем использовать ReDim для приведения массива к другому типу, за
исключением случая, если массив содержит переменные типа Variant. В этом случае
приведение массива к явному типу данных допустимо.
Таким образом,
размерность массива можно при необходимости изменить. Но тогда возникает
опасность потерять его содержимое, так как после изменения размерности
элементам массива присваиваются значения по умолчанию.
Однако Visual Basic
предоставляет возможность изменять размерность массива без потери содержимого.
Для этого следует использовать ReDim вместе с ключевым словом Preserve:
'(General)(Declaration) Dim aArray () As
Variant Private Sub Comroandl_Click<)
ReDim Preserve aArray
(50, 15)
'Код
End Sub
Использование с
оператором ReDim зарезервированного слова preserve позволяет сохранить
содержимое массива при изменении его размера или размерности. Но следует
учитывать, что для многомерных массивов можно изменять только последнее
измерение:
'(General)(Declarations)
Dim aArray () As Variant Private Sub Cornmandl_Click() ReDim aArray (10, 10)
ReDim Preserve aArray (10, 15) 'действует ReDim Preserve aArray (15, 15)
'ошибка End Sub
При изменении
размерности можно также изменять верхнюю и нижнюю границы индекса. Но если при
этом используется ключевое слово Preserve, то разрешено изменять только верхнюю
границу:
'(General)(Declarations)
Dim aArray () As Variant Private Sub Commandl_Click() ReDim aArray (10 To 20)
ReDim Preserve aArray (10 To 25).
'действует ReDim Preserve aArray (15 To 25) 'ошибка End Sub
Область видимости
динамических массивов (контейнерных, глобальных) определяется способом их
объявления — если с помощью оператора Public, то массив будет глобальным, если
с помощью Dim, то контейнерным.
Присвоение
массивов
Начиная с Visual
Basic 6.0, вы имеете возможность присвоить содержимое одного массива другому
так же, как вы присваиваете значение одной переменной другой. Например, вам
необходимо скопировать массив байтов. Это можно сделать, копируя байт за
байтом:
Sub
ByteCopy(oldCopy() As Byte, newCopyO As Byte) Dim i As Integer ReDim newCopy
(Lbound(oldCopy) To UBound(oldCopy)
For i
Lbound(oldCopy) To Ubound(oldCopy) newCopy(i) = oldCopy(i) Next End Sub
Однако гораздо проще
и привлекательней это выглядит, если присвоить один массив другому:
Sub
ByteCopy(oldCopy() As Byte, newCopyO As Byte) newCopy = oldCopy End Sub
Существуют определенные правила присвоения
переменных, которые не стоит забывать. Например, если присвоение переменной,
объявленной как Long, значения переменной типа Integer осуществляется без
всяких проблем, то присвоение значения переменной типа Long переменной типа
Integer легко может вызвать ошибку переполнения (overflow). В дополнение к
правилам работы с типами данных, при присвоении массивов необходимо учитывать
размерности массивов, количество элементов в массивах разных размерностей и тип
массива — статический или динамический.
Попытка присвоения
массивов различных размерностей и типов данных может быть успешной или
неуспешной в зависимости от следующих факторов:
.
• типа массива, используемого в левой части оператора
присваивания(статический или динамический);
.
• совпадения/несовпадения количества размерностей массивов в
левой иправой части оператора присваивания;
.
• совпадения/несовпадения количества элементов в каждой
размерностимассивов;
.
• типов данных элементов массивов (типы должны быть
совместимыми).
Таблица 2.3. Результаты
присвоения массивов Тип массива
в левой части оператора присваивания |
Совпадают значения
размерностей? |
Совпадает числэлементов? |
оРезультат присваивания |
Динамический |
Нет |
Да или Нет |
Успешно. Размерность и |
|
|
|
число элементов массива |
|
|
|
в левой части оператора |
|
|
|
присваивания при необ |
|
|
|
ходимости изменяется. |
Динамический |
Да |
Нет |
Успешно. Размерность и |
|
|
|
число элементов массива |
|
|
|
в левой части оператора |
|
|
|
присваивания при необ |
Динамический |
Да |
Да |
ходимости изменяется.
Успешно. |
Статический |
Да или Нет |
Да или Нет |
Неуспешно, с ошибкой
компиляции. |
Ошибки могут возникнуть как при компиляции, так и во
время выполнения приложения, поэтому вам следует позаботиться об их обработке.
Типы
данных, определяемые пользователем
Кроме встроенных типов данных, таких как
Integer, Long и т.п.. Visual Basic поддерживает также типы данных, определяемые
пользователем. Они могут быть созданы как на основе встроенных типов данных,
так и на основе ранее определенных пользователем.
Для определения
пользовательского типа данных используется ключевое слово Type:
[Private I Public]
Type Имя_типа Елеыент! [([Размерность])] As Тип [Елемент2
[([Размерность])] As Тип]
End
Type
Определение общего
(Public) собственного типа данных возможно только в секции (General)
(Declarations) модуля. В этом случае этот тип будет доступен во всех процедурах
всех форм, модулей и модулей классов. Для определения пользовательского типа
данных в форме или модуле класса следует использовать ключевое слово Private,
поскольку объявление общего типа в данной ситуации не допускается. При этом
область видимости такого типа будет ограничена тем контейнером, где он
объявлен.
Определив собственный
тип данных, вы можете использовать его для объявления переменных этого типа.
Эти переменные могут быть локальными, глобальными или переменными контейнера:
'(General)(Declarations) (Module) Type
usrGoodsType
GoodsNum As Long
Name As String * 40
Price As Currency End
Type '(General)(Declarations) (Form)
Dim usrTools As
usrGoodsType Private Sub Commandl_Click ()
usrTools.Name =
"Отвертка"
usrTools. Price =2.95 End Sub
В этом примере в
секции объявлений модуля определяется глобальный тип данных usrGoodsType. Затем
в секции объявлений формы объявляется доступная в контейнере переменная
usrTools типа usrGoodsType, а конкретные значения составляющих этой переменной
устанавливаются в процедуре commandl_ciick.
Доступ к элементам
переменной пользовательского типа осуществляется, по аналогии с доступом к
свойствам, путем указания точки после имени переменной. При этом переменные
одинакового типа можно присваивать не поэлементно, а напрямую:
'(General)(Declarations) (Module) Type
usrPerson
Name As usrName
Number As Integer End Type Public usrCustomer
As usrPerson, usrSupplier As usrPerson Private Sub Commandl_Click()
usrSupplier.Name =
"Ilse"
usrSupplier.Number =
21873
usrCustomer =
usrSupplier End
Sub
Переменные usrSupplier и
usrCustomer относятся к одному типу usrPerson. Поэтому они
присваиваться напрямую, а не поэлементно.
Пользовательские типы
данных могут быть составными. В этом случае важна последовательность
определения типов. Сначала нужно определить базисный тип, который будет
использоваться далее в составных типах. Если не соблюдать это правило, то после
запуска программы появится сообщение об ошибке. Ниже приводится пример
использования составных пользовательских типов данных:
'
(General)(Declarations) (Module) Type usrName
FirstName As String
Name As String * 40 End Type
'(General)(Declarations) (Module) Private Type usrPerson
Name As usrName
BirthDate As Date End Type Dim usrCustomer As
usrPerson Private Sub Conimandl__Click ()
usrCustomer.Name.FirstName = "Rene"
usrCustomer.Name.Name
= "Lampe" End Sub
Данные
пользовательского типа рекомендуется использовать при обработке данных
неизменной структуры.
Константы
Основное отличие констант от переменных
состоит в том, что их значение нельзя изменять в процессе выполнения программы.
Они всегда сохраняют значение, присвоенное при разработке. Области видимости
для констант определяются так же, как и для переменных. Константы бывают
локальные, контейнера и глобальные.
При объявлении
констант используется ключевое слово Const. Глобальная константа объявляется
как public; при этом необходимо иметь в виду, что глобальные константы можно
объявлять только в модуле.
[Public
| Private] Conat Имя_константы = Значение
Одновременно с
объявлением константе присваивается и значение. В качестве значения допускается
использовать только постоянные значения и их комбинации, включая арифметические
и/или логические операторы, но не функции.
Const Pi " 3.1415926535897932 Const
Durability » 12.25 Public Const nName = "Conni Mauser"
Примеры демонстрируют
преимущество использования констант: например, при вычислениях с числом я
(3.141592) в программе не нужно каждый раз вводить длинное число, а только имя
константы pi:
Const Pi =
3.1415926535897932 vCircle = Pi * vRadius л 2
Код программы
становится более читабельным, если имя константы несет еще и смысловую
нагрузку:
Const ПлотностьМатериала =2.25 Масса =
ПлотностьМатериала * Высота * Ширина
Еще одно преимущество
констант заключается в том, что если константа используется в нескольких
процедурах, то при изменении ее значения оно будет правильно воспринято всеми
процедурами.
В Visual Basic широко
используются константы. Они позволяют не только улучшить понимание текста
программ, но и обеспечивают совместимость приложений с новыми версиями Visual
Basic, так как обычно изменяется фактическое значение константы, но не ее имя.
Информацию о существующих константах, их
значениях и применении можно получить, обратившись к соответствующим разделам
справки или воспользовавшись каталогом объектов (Object Browser).
Константы можно
объявлять и с указанием типа данных:
[Public
I Private] Const Иыя_константы As Гил_данных = Значение
Для указания типа
данных используются те же ключевые слова, что и при объявлении переменных:
Const Pi As Single = 3.1415926535897932
Const nName As String = "Alexandra Kravetz"
Public Const nNamePhotographie As String * 10 = "Phedon"
В данном примере константы задаются с явным
указанием типа данных.
Процедуры
Под процедурами
подразумевают последовательность объявлений и инструкций, объединенных для
выполнения. В зависимости от назначения можно выделить процедуры обработки
событий и процедуры общего назначения. В этом случае существенно, кому
принадлежит процедура. В зависимости от области определения процедуры бывают
закрытые и общие (общедоступные). При этом важно, из какого места кода
вызывается процедура. Основное внимание в данной главе мы уделим процедурам
форм и модулей.
Процедуры
обработки событий
Процедурами обработки
событий являются процедуры, которые предназначены для обработки некоторых
событий, связанных с элементами управления.
Например, различные
действия пользователя с кнопкой CommandButton (click, KeyDown, MouseMove и
т.п.) вызывают соответствующие события. Обработка каждого из этих событий
оформляется в виде процедуры. Программист, применяя одну или несколько таких
процедур обработки события, может определить реакцию приложения на конкретное
действие пользователя.
Процедуру обработки
события легко отличить и по ее имени, в котором обязательно присутствуют имена
объекта и события, а также по состоянию рабочей среды: если вы находитесь в
такой процедуре, то в поле списка Object окна кода указывается имя
объекта, а в поле списка Procedure — имя события (рис. 2.3).
Имя
процедуры обработки события всегда составляется из имен объекта и события,
разделенных символом подчеркивания (_).
Удаление
При удалении
процедуры обработки события следует учитывать некоторые особенности. Если
удаляется процедура, включая Private Sub и End Sub, то удаляется все ее
содержимое. Однако это не значит, что обработка этого события больше
невозможна: просто выберите в списке (Object) имя требуемого элемента, а
в списке (Procedure) — требуемое событие, и Visual Basic создаст для вас
эту процедуру заново, но уже без тела процедуры.
Если же удаляется сам элемент управления, то
все его процедуры обработки событии сохраняются, но поскольку объекта больше
нет в проекте, эти процедуры становятся общими.
Если вы создадите
элемент управления с тем же именем, что и удаленный, то все процедуры
удаленного элемента связываются с новым.
Процедуры
общего назначения
Основной
отличительной чертой процедур общего назначения является то, что они не связаны
ни с каким событием и их вызов разработчик осуществляет по своему усмотрению.
Для создания такой процедуры достаточно ввести ключевое слово sub и имя
процедуры в окне кода (но не внутри другой процедуры или функции) и нажать
клавишу [Enter]. После этого Visual Basic дополнит введенный код оператором
конца процедуры End Sub самостоятельно. Процедуры общего назначения относятся к
секции (General) (рис. 2.4). Так как процедура не связана ни с одним
элементом управления, то поле (Object) окна кода вместо имени объекта
содержит строку (General).
Чтобы просмотреть список процедур общего
назначения, необходимо выбрать в списке (Object) поле (General).
Процедуры общего
назначения используются, как правило, для решения какихлибо общих задач,
например расчетов, которые необходимо выполнять в различных местах программы.
Закрытые
процедуры
Закрытыми называют
процедуры, доступные только внутри контейнера (формы, модуля, класса), в котором
они содержатся.
Private
Начиная с Visual Basic 4.0, все процедуры
обработки событий объявляются по умолчанию как Private. Это значит, что такую
процедуру можно вызывать только внутри этой формы. Общие процедуры формы или
модуля класса также являются закрытыми. Они останутся закрытыми даже после
того, как вы объявите их как Public.
Это можно проверить,
если вызвать в форме Formi общую процедуру формы Form2. В этом случае Visual
Basic выдаст сообщение об ошибке "Sub or Function not defined"
("Процедура или функция не определена").
Примечание
Тем не менее, общую
процедуру можно вызвать из другой формы, если только она не была объявлена как
Private. Для этого следует указать перед ее вызовом имя формы, которой она
принадлежит, например Formi. SomeProcedure.
Общие процедуры
Процедуры называются
общими, если они могут быть вызваны процедурами другого контейнера. Это
возможно только в том случае, если такая процедура содержится в модуле — обычно
каждая процедура модуля может вызываться любой другой процедурой.
В модулях также
полностью проявляется действие ключевых слов Private и Publ i с. Чтобы объявить
процедуру общей, в ее заголовке указывается ключевое слово Public. Это не
обязательно, так как процедуры в модулях общедоступны по умолчанию.
Если вызов процедуры
другим контейнером нежелателен, это можно предотвратить с помощью ключевого
слова Private.
Option Private Module
Выражение Option
Private Module используется в модуле для указания того, что модуль является
закрытым для других приложений. С опцией Option Private Module составные
элементы модуля (переменные, процедуры, функции, пользовательские типы данных и
пр.), не объявленные как Private, доступны другим модулям проекта, но не другим
проектам или приложениям.
В модуле выражение Option Private Module
должно предшествовать всем процедурам.
Аргументы
Как уже говорилось в
первой главе, процедуры могут использовать аргументы, список которых (при
необходимости с указанием типа), размещают в скобках после имени процедуры. В
процедурах событий набор аргументов зависит от события и не может быть изменен
разработчиком:
Private Sub
Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single)
End Sub
В общих процедурах
количество и порядок используемых аргументов определяется разработчиком.
Типы данных
В заголовке процедуры
можно указывать тип данных для аргумента. В приведенном выше примере аргументы
Button и Shift имеют тип Integer, а Х и Y
— тип Single.
Способ передачи аргументов
В Visual Basic
аргументы могут передаваться двумя способами: либо как ссылки (ByRef), либо как
значение (ByVal).
ByRef
Если аргумент
передается как ссылка, то вызванная процедура получает физический адрес памяти
передаваемой переменной.
Различие между двумя
видами передачи аргументов состоит в том, что при передаче аргумента как ссылки
можно изменять значение этого аргумента. Так как вызываемая и вызывающая
процедуры обращаются к одной и той же области памяти, значение переменной для
них идентично.
Для того чтобы
передать аргумент как ссылку, следует перед аргументом указать ключевое слово
ByRef. Однако поскольку по умолчанию аргументы в Visual Basic именно так и
передаются, ByRef можно и опустить:
Private Sub Commandl_Click()
А = 5'
SomeProcedure А, В
Print В "результат: 25 End Sub Sub SomeProcedure
(ByRef First, Second)
Second = First * 5 End Sub
В данном примере
переменные АЙВ
передаются
процедуре SomeProcedure по ссылке. В самой процедуре эти переменные фигурируют
под именами First и Second соответственно. Значение переменной Second изменяется
и затем может быть использовано в процедуре Commandl_Click.
Таким образом,
процедура может возвращать несколько значений. При вызове процедуры ей
передаются аргументы, значения которых она может изменить. Если процедура не
должна изменять аргументы, их следует передавать как значения.
ByVal
Для передачи
аргументов в качестве значений перед именем аргумента в заголовке процедуры
следует указывать ключевое слово ByVal. В этом случае процедуре передается
копия этого значения. При передаче аргументов в качестве значений ключевое
слово ByVal должно указываться обязательно.
Именованные аргументы
Для многих встроенных
функций, операторов и методов Visual Basic обеспечивает возможность
использования именованных аргументов для упрощения ввода их значений.
Обычно аргументы
передают в последовательности, указанной в заголовке процедуры:
Private Sub Cominandl_Click ()
SomeProcedure
1, 2, 3 End Sub Sub SomeProcedure (aOne, aTwo, aThree)
Print aOne, aTwo,
aThree 'вывод: 123 End Sub
Использование
именованных аргументов позволяет передавать часть или все аргументы в любом
порядке. Для этого при вызове процедуры указывается имя аргумента и его
значение, разделяемые специальным знаком — двоеточием со знаком равенства (:=),
например MyArgument :="someValue". Аргументы разграничиваются
запятыми; порядок их следования значения не имеет:
Private Sub Commandl_Click ()
SomeProcedure aThree:=3, aTwo:=2, a0ne:=l End
Sub ; Sub SomeProcedure (aOne, aTwo, aThree) }
Print aOne, aTwo,
aThree "вывод: 123 End Sub '
В примере при вызове
процедуры аргументы указаны в другой последовательности, чем в заголовке,
однако благодаря именованию, каждой переменной присваивается соответствующее
значение.
При вызове процедур
можно передавать именованные и неименованные аргументы комбинированно. Однако
следует помнить, что как только в списке передачи появляется именованный
аргумент, все последующие аргументы должны передаваться также именованными:
Private Sub
Conmtandl_Click () SomeProcedure 1, aTwo:=2, aThree:=3 End Sub Sub SomeProcedure
(aOne, aTwo, aThree) Print aOne, aTwo, aThree 'вывод: 123 End Sub
В этом примере первый
аргумент 1 определяется своей позицией. Два других, 3 и 2, передаются как
именованные.
Именованные аргументы
поддерживают и многие другие функции Visual Basic, Однако именованные аргументы
не поддерживаются методами объектов библиотеки Visual Basic. Они поддерживаются
в Visual Basic for Applications (VBA) и методами доступа к данным библиотеки
DAO.
Использование
именованных аргументов имеет два преимущества: во первых, имя аргумента
разъясняет его назначение, поэтому не нужны дополнительные комментарии;
вовторых, это может предотвратить ошибочное присваивание значений не тем
аргументам. Последнее проявляется при вызове процедур, для которых не
обязательно указывать все аргументы.
Необязательные аргументы
Если при вызове
процедуры указать не все аргументы, то последует сообщение об ошибке. Однако в
процессе описания процедуры можно определить, что не все аргументы указываются
при вызове. Такие аргументы называются необязательными.
Для того чтобы
аргумент стал необязательным, перед именем аргумента ставится ключевое слово
Optional. После первого необязательного аргумента все последующие должны быть
также необязательными:
Private Sub Commandl_Click()
SomeProcedure 1
SomeProcedure 1, 2
SomeProcedure 1, 2, 3
SomeProcedure aThree:=3, aTwo:=2, a0ne:=l End Sub
Sub SomeProcedure(aOne, Optional aTwo, Optional aThree AsInteger)
If IsMissing(aTwo) Then aTwo = 2
If aThree = 0 Then aThree = 3
Print aOne, aTwo, aThree 'вывод: 123 End Sub
В этом примере в процедуре Commandl_ciic)<
показаны различные возможности вызова процедуры с необязательными аргументами.
Для необязательных аргументов наряду с типом Variant можно задавать и другие
типы данных, за исключением пользовательских.
Функция isMissing
позволяет проверить, передан или нет аргумент типа
Variant. |
Если |
некоторые |
необязательные |
аргументы |
не |
были |
переданы |
||||
процедуре, |
они |
инициализируются |
значениями |
по |
умолчанию |
||||||
соответствующего типа данных.
|
|
|
|
||||||||
Возвращаемые значения
Visual Basic 6.0 предоставляет новую
возможность — теперь функции
могут возвращать
массивы. Таким образом, вы можете возвратить массив целых чисел без
дополнительного преобразования его в строку, а затем из строки. Приведем
простой пример функции, возвращающей массив байтов:
Private Sub Form Load() Dim b As Byte
Dim i As Integer Dim
ReturnArray()
As Byte
i = Cbyte(54)
ReturnArray() =
ArrayFunction(b)
For i •= 0 To
Ubound(ReturnArray)
Debug.Print ReturnArray(i) Next End Sub
Public Function
ArrayFunction(b As Byte) As ByteO Dim x(2) As Byte
x(0) = b x(l) ° b +
CByte(200)
x(2)
» b + b \
ArrayFunction = x End
Function
После выполнения
приведенного примера массив ReturnArray () станет массивом из трех элементов,
содержащих значения, присвоенные в функции ArrayFunction. Отметим, что элементы
массива должны быть того же типа данных, что и возвращаемое значение функции (в
данном случае Byte). При вызове функции вы можете передавать массив без
указания скобок.
При создании функции,
возвращающей массив, вы должны задать тип данных этого массива. Таким типом
данных может быть и Variant. В этом случае функция, объявленная как Function х
() As Variant (), может работать без ошибок и в тех случаях, когда функция,
объявленная с указанием явного типа, потерпит крах (например, при попытке
присвоить возвращаемое значение массиву несоответствующего типа). Это связано с
тем, что при вызове функции, возвращающей массив, переменная, принимающая
возвращаемое значение, должна быть массивом, причем массивом того же типа
данных, что и возвращаемое функцией значение. В противном случае вы получите
сообщение об ошибке "Type Mismatch" ("Несовпадение типов").
Операторы управления
порядком выполнения команд
Операторы управления
порядком выполнения команд уже применялись в рассмотренных примерах. Они
позволяют оценить реальную ситуацию и адекватно реагировать на нее, принимая
решения о дальнейших действиях. Visual Basic предоставляет для этого ряд
функций и операторов.
If...Then
Наиболее часто
используется оператор If.. .Then, который может иметь про стую однострочную или
блочную структуру.
Однострочный синтаксис
If Условие Then Оператор [Else Оператор]
Функционирование
оператора такой структуры относительно просто. Если условие после if истинно,
т.е. результат равен True, выполняется оператор, указанный за Then. Если же
результат равен False, то выполняется оператор, следующий за ключевым словом
Else, если такое имеется:
If A ° 7 Then Beep 'операторы If X < 9
Then Print "False!" Else Print "True!"
В первом примере
выдается звуковой сигнал, если переменная ^ равна 7. Во втором примере
выводится текст False!, если значение переменной х меньше 9; в противном случае
выводится текст True!.
Блочный
синтаксис
If Условие
Then (Опера торы 1]
(Elself Условием Then [Операторы 2]
Else [Операторы 3]] End If
В принципе блочная
запись предоставляет такие же возможности, как и однострочная. Но если в
зависимости от условия необходимо выполнить не простую команду, а группу
операторов, следует использовать блочный синтаксис. Это относится и к ветви
Else. Кроме того, блочная структура с Elself позволяет анализировать несколько
условий:
If A 5
Then
Print
"Ждите" ' Печать End If
If Name = "Иванов" Then . .
Print "Ваша
карточка удерживается!" Else
Print "Деньги,
пожалуйста!" End If
If Обращение = 1 Then
Print "Глубокоуважаемый господин" Elself Обращение 2 Then Print "Глубокоуважаемая
госпожа" Elself Обращение = 3 Then Print "Глубокоуважаемые дамы и
госпола" Else Print "Здравствуйте, люди" End If
При формировании
более сложных условий блочная запись удобнее. Использование в этом случае
блочного синтаксиса улучшает читабельность программы.
Select Case
Еще одним оператором
ветвления Visual Basic является Select Case, который позволяет выполнить одну
из нескольких групп операторов в зависимости от значения условия.
Инструкция Select Case имеет следующий
синтаксис: Select
Case Проверочное_выражент
[Case Значение!
[Операторы 1}] [Case Значение 2 [Операторы2]] [Case
Else
[ОператорыЗ]] End Select
Private Sub Command_Click()
nVariable Int (Rnd * 10) +1 'случайное число от 1 до 10 Select Case
nVariable
Case 1
Print "Равно
1" Case 2, 3 Print "Равно 2 или 3" Case 4 То
Print "Больше
или равно 4 и меньше или равно 6" Case Is
>= 9
Print "Больше
или равно 9" Case Else
Print "Ни одно
из предшествующих" End
Select End Sub
В качестве значения
для блока Case можно указывать не только одно значение (1), но и несколько,
разделенных запятой (2, 3). Можно определять также области сравнения (4 то 6)
или воспользоваться относительным сравнением (is >= 9) Вместо
непосредственного проверочного выражения можно
использовать ключевое слово I
s |
|||||||||||||||||
Блок |
Case |
Else |
выполняется, |
если |
ни |
одно |
из |
предыдущих |
условий |
не |
|||||||
является истинным. |
|
||||||||||||||||
Если |
условию |
Select |
Case |
соответствует |
несколько |
блоков |
Case, |
то |
|||||||||
выполняется первый из них |
|
||||||||||||||||
Private Sub Commandl_Click() |
|
||||||||||||||||
Select Case nVariable Case 0 |
|
||||||||||||||||
Print "Равно О"
Case 10 |
|
||||||||||||||||
To 10 |
|
||||||||||||||||
Print "Между 10 и 10,
кроме О" End Select |
|
||||||||||||||||
End Sub
Во втором блоке Case обрабатываются значения от 10 до
10, однако значение О перехватывается первым блоком Case. Поэтому операторы
второго блока Case будут выполняться, если значение условия больше или равно 1
о и меньше о, а также больше 0 и меньше или равно 10.
Циклы
Для многократного
выполнения одного или нескольких операторов предназначены циклы Visual Basic
предлагает две конструкции: цикл For. . .Next дает возможность устанавливать
число проходов цикла, а цикл Do... Loop завершается при выполнении заданного
условия.
For. „Next
Цикл For. . .Next
является самой старой и самой простой конструкцией:
For Счетчик = Начальное_значение То Конечное_значение [Step
Шаг] Операторы
Next [Счетчик]
^ В начале выполнения
цикла значение Счетчик устанавливается в Начальное значение. При каждом проходе
переменная Счетчик увеличивается на 1 или на величину шаг. Если она достигает
или становится больше (меньше, при отрицательном шаге) Конечное значение, то
цикл завершается и выполняются следующие операторы. Разность между начальным и
конечным значением, деленная на величину шага, составляет число проходов:
For I = 1 То 10 Print
I * 100 Next I
For
L °= 100 To 5 Step 0.5
X Y *
L Next I * ~__ For II = 1 To 5
For 12 = 10 To 20
Print II + 12 Next 12 Next II 'Или ..(Next 12,11)
В этом примере
представлены разные конструкции циклов For.. .Next. Часто для вычислений внутри
цикла используются числовые переменные:
'(General)(Declaration) Dim aArray(1997 To
2050) Private Sub Comniandl_Click ()
For I =
LBound(aArray) To UBound(aArray) Print aArray (I) Next I End Sub
В этом примере
выводится все содержимое массива. Для
безусловного выхода из цикла используется оператор Exit For.
Do...
Loop
Если количество
проходов должно зависеть от условия, используют цикл Do... Loop. В зависимости
от позиции условия различают два варианта цикла Do...Loop.
Цикл,
управляемый в начале
Do [(While | Until) Условие] [Опера
торы] [Bxit Do] [Операторы]
Loop
Цикл, управляемый в конце
Do
[Операторы]
[Bxit Do) [Операторы]
Loop [(While | Until} Условие]
Если условие
проверяется в начале цикла, то он никогда не выполняется в случае невыполнения
условия. Если же проверка происходит в конце, цикл выполняется как минимум один
раз, независимо от того, выполнено условие или нет.
Тело цикла
выполняется неопределенное число раз, пока условие не вызовет выход из цикла:
Do Until EOF(Файл)
Input #1, SomeData Loop
Do
X = X + 1 Print
"Hello"
Loop While X < 9
Рассмотренные
варианты циклов Do... Loop предоставляют разработчику большие возможности
организации повторяющихся вычислений.
While^Wend
В Visual Basic цикл
while. .. Wend играет второстепенную роль. Он используется только для
совместимости с другими диалектами Basic, а также для совместимости с более
ранними версиями Visual Basic, в которых не было оператора Do. . .Loop.
While Условие [Операторы]
Wend
Принцип его действия
такой же, как и цикла Do While.. . Loop. Поэтому вместо него проще использовать
Do.. .Loop. Кроме того, для цикла while. . .Wend нет оператора досрочного
выхода типа Exit:
While
X = True Print
Time Wend
Элементы управления
Элементы управления,
их свойства, методы и события будут подробно рассмотрены в следующей главе. В
этом же разделе рассматриваются основные возможности программирования с помощью
элементов управления. В частности, детально объясняется работа с массивами
элементов управления.
Массивы элементов
управления
Массивы элементов
управления подобны обычным массивам переменных. Сам массив и его отдельные
элементы различаются индексом.
Пожалуй, вам уже
приходилось создавать массив элементов управления. Это происходит при
копировании элемента управления в буфер обмена. При вставке в ту же форму в ней
находится еще и первоначальный элемент с тем же именем, что и в буфере обмена.
Поэтому Visual Basic запрашивает, нужно ли создать массив элементов или следует
дать новое имя добавляемому элементу управления.
Если на запрос
ответить Нет, Visual Basic поместит в форму элемент управления и даст ему имя
по умолчанию, например Command!.
После ответа Да в
форме появятся два элемента управления с одинаковым именем. Чтобы Visual Basic
мог различать эти элементы, автоматически устанавливается свойство index.
Это можно заметить и
в окне свойств. В списке элементов отображается несколько элементов управления
с одинаковым именем, после которого в скобках указывается индекс. Значение
индекса совпадает с указанным в строке index.
Если же вы хотите создать массив элементов
управления, не обязательно идти окольным путем с использованием буфера обмена.
Достаточно установить определенное значение для свойства index, в результате
чего элемент управления автоматически становится первым членом массива. При
добавлении следующего элемента он получает то же имя, но другой индекс. При
этом все элементы управления в массиве должны иметь одинаковый тип.
Еще одно преимущество использования массива
элементов управления состоит в том, что все его элементы используют одни и те
же процедуры событий. Для определения элемента, вызвавшего событие. Visual
Basic передает в процедуру события аргумент Index.
Этот аргумент
принимает различные значения для каждого элемента массива. Проверив это
значение, можно определить, какое действие следует выполнять:
Private Sub
CutCopy_Click(Index As Integer)
Call Copy
If Index = 0 Then Call Delete End Sub
В этом примере всегда
вызывается процедура Copy. Если элемент имеет индекс О, то после Copy
дополнительно выполняется процедура Delete.
Для массива элементов
управления нс требуется указание индексов по порядку — каждому элементу можно
присвоить произвольное значение, которое будет использовано в коде.
Предположим, вы хотите с помощью кнопки
установить состояние формы, воспользовавшись свойством windowState, которое
может принимать три значения: О — для окна в нормальном представлении, 1 — в
виде пиктограммы и 2 — для развернутого вида.
Теперь в форму добавим
три кнопки с одинаковыми именами, значения индексов которых соответствует
значениям свойства WindowState.
В общсп процедуре click индекс можно присвоить
непосредственно свойству
WindowSt^i t e :
Private Sub aWindow
Click(Index As Integer) Form!.WindowState = Index End Sub
Если щелкнуть на
кнопке с индексом 0, форма отображается в обычном виде. Кнопка с индексом 1
сворачивает форму в пиктограмму, а третья кнопка разворачивает форму на весь
экран.
Load
Иногда требуется
использовать массив элементов управления, не зная заранее их количество. В этом
случае следует воспользоваться оператором Load, который позволяет загрузить
элемент управления во время работы приложения. Для этого нужен только элемент
управления, определенный как массив (свойство index содержит определенное
значение):
Private Sub Commandl_Click(Index As Integer)
Static nCounter As
Integer
nCounter = nCounter +
1
Load
Commandl(nCounter)
»
Command!(nCounter).Visible
= True
Commandl(nCounter).Top
= nCounter * 100 End Sub
В этом примере в
форме изначально присутствует кнопка с индексом 0. В ходе выполнения программы
каждый щелчок на любой кнопке добавляет новую. Переменная nCounter используется
для определения индекса вновь загруженного элемента. С помощью свойства visible
новый элемент отображается. Так как все свойства совпадают со свойствами
исходного объекта, следует изменить также свойство Тор, чтобы кнопки не
накладывались одна на другую.
Unload
С помощью оператора
Unload удаляются в любой последовательности все загруженные во время выполнения
элементы управления (за исключением тех, которые были созданы при
проектировании):
Private Sub Commandl_Click(Index As Integer)
Unload Commandl(Index) End Sub
Массивы элементов
управления позволяют значительно сократить объем кода, который необходимо
написать для управления программой.
Динамическое
добавление элементов управления
Другой метод
добавления элементов управления заключается в использовании метода Add
семейства Controls. С помощью этого метода вы можете добавить в форму: элемент
управления на основании существующего (например, еще одно поле для ввода);
элемент управления нового типа (например, кнопку в форму в которой кнопок не
было); элемент управления, ссылки на который до этого в проекте не было.
Динамическое добавление элементов управления может быть использовано для
расширения функциональных возможностей приложения даже после его создания и
установки. Например, вы можете создать приложение, способное не только изменять
набор доступных пользователю элементов управления в зависимости от прав
пользователя или круга решаемых задач, но и считывать этот набор из файла или
базы
данных, что позволит модифицировать
приложение без перекомпиляции и переустановки.
Синтаксис метода Add
следующий:
object.Add (ProgiD, name, container)
где: object — обязательный параметр,
представляющий собой объект (семейство Controls), в который добавляется элемент
управления. progiD — обязательный аргумент — строкаидентификатор элемента
управления. Значение ProgiD для большинства элементов управления можно
определить с помощью утилиты Object Browser; это значение обычно составляется
из имени библиотеки и имени класса конкретного элемент управления (например,
для элемента CommandButton ProgiD = VB.CommandButton). name — обязательный
аргумент
— строка,
идентифицирующая элемент семейства. container — необязательный аргумент —
ссылка на объектконтейнер для элемент управления. Если этот аргумент не
определен или равен NULL, то принимается по умолчанию контейнер, которому принадлежит
семейство controls. Приведем несколько примеров использования этого метода. В
первом примере при загрузке формы динамически добавляется элемент управления
CommandButton:
Private Sub Form_Load()
Forml.Controls.Add
"VB.CommandButton", "cmdObjl", Framel With
FormlicmdObjl .Visible
= True
•Width = 2000
.Caption
= "Динамическая кнопка" End With End Sub
Во втором примере
объектная переменная типа CommandButton объявляется с использованием ключевого
слова withEvents, что позволяет приложению обрабатывать события добавляемого элемента
управления. Option
Explicit Private WithEvents btnObj As
CommandButton
Private Sub
btnObj_Click () MsgBox "Это динамически добавленная кнопка." End Sub
Private Sub Form_Load()
Set btnObj =
Controls.Add("VB.CommandButton", "btnObj") With btnObj
.Visible = True
.Width =
2000
•Caption =
"Hello" .Top = 1000 .Left = 1000 End With End Sub
В третьем примере
добавляется элемент управления, ссылки на который в проекте не было. Для
обработки событий такого элемента управления вы должны объявить
объектную переменную типа VBControlExtender и
затем присвоить ей ссылку на объект, возвращаемую методом Add. Обработка всех
событий элемента управления выполняется в процедуре обработки события
ObjectEvent. Option
Explicit Dim ctlExtender As
VBControlExtender
Private Sub
Form_Load() Set ctlExtender = Controls.Add("Projectl.UserControll",
"MyControl") With ctlExtender
.
•Visible = True
.
•Top 1000 \. .Left = 1000 End With End Sub
Private Sub
extObj_ObjectEvent(Info As Eventlnfo) ' Обработка событий добавленного элемента
управления Select Case Info.Name Case "UserName" ' Проверка значения
свойства UserName. MsgBox Info.EventParameters ("UserName")'. Value
Case Else ' Другие события
'
Обработка других событий. End Select End Sub
Примечание
Прежде чем использовать
метод Add для добавления элемента управления, требующего лицензии, необходимо
добавить его лицензионный ключ (license key).
Для удаления
динамически добавленных элементов управления используйте метод Remove. Отметим,
что с его помощью можно удалить только те элементы управления, которые были
добавлены с помощью метода Add.
Formi.Controls.Remove "btnObj" '
Удаляем объект с именем btnObj.
Параметры
настройки приложений
При создании приложений часто возникают
вопросы: где сохранять параметры настройки приложения или куда поместить список
открытых в последний раз файлов?
В Windows 3х все эти данные сохранялись в
INIфайлах. Начиная с Windows 95, 32разрядные приложения помещают эти параметры
в реестр Windows.
Все необходимые
установки приложения должны регистрироваться для текущего пользователя (User).
Это отражено в названии ветви \HKEY_CURRENT_USER. Далее следует ветвь для
приложений: \SOFTWARE. На следующем уровне обычно указывается фирма, но для
приложений Visual Basic предусмотрена собственная ветвь — \VB AND VBA PROGRAM
SETTINGS, где разработчик может сохранять установки приложения. При этом
следует исходить из логики старых INIфайлов. Верхний уровень обозначает имя
приложения, при необходимости с номером версии. Ниже находятся секции,
содержащие записи, через имена которых можно осуществлять доступ к
соответствующим значениям.
Visual
Basic предлагает четыре команды для работы с реестром.
Сохранение параметров
С помощью функции
SaveSetting записи сохраняются в реестре.
Save Setting
SaveSetting (Имя приложения,
Секция, Ключ, Установка)
SaveSetting
"BigMoney", "User", "Name", "Hugo"
В примере создана
новая ветвь реестра с именем BigMoney. Под ней находится ветвь User, а в ней
запись Name со значением Hugo.
Обратите внимание,
что структура должна соответствовать определенному стандарту. Параметр
Имя_приложения обычно содержит имя приложения. Для Windows не имеет значения,
что здесь будет записано, но пользователь, просматривающий реестр, имеет шанс
узнать, какой программе принадлежит запись. Имя секции также должно быть
значимым.
Считывание параметров
Для считывания
установок служит функция GetSetting.
GetSetting
GetSetting (Имя_приложения. Секция, Ключ [,
По_уыолчанию])
Параметр По_умолчанию
помогает узнать, успешно ли выполнено считывание записи. Если считывание
указанной области невозможно, функция возвращает значение, присвоенное
параметру По_умолчанию. Если же процесс считывания завершился успешно, то в
качестве возвращаемого значения получаем сохраненную в реестре запись.
vReturn = GetSetting("BigMoney",
"User", "Name", "Безуспешно")
Если считывание не
может производиться, например изза того, что секции или записи вообще не
существует, то в качестве возвращаемого значения получаем
"Безуспешно", т.е. параметр По_умолчанию.
GetAllSettings
С помощью функции
GetAllSetting считываются все записи из секции. При этом возвращается массив
типа Variant со всеми элементами указанной секции.
GetAllSettings (Имя_приложения,
Секция}
Удаление параметров
При деинсталляции
приложений следует особенно заботиться об удалении ненужных установок в
реестре, что предотвращает накопление информационного мусора.
DeleteSetting
Для этого в Visual
Basic имеется оператор DeleteSetting, который удаляет запись или всю секцию.
DeleteSetting (Имя приложения. Секция[,
Ключ})
DeleteSetting
"BigMoney","User"
В примере удаляется вся информация о
пользователе в секции User. Для работы с другими областями реестра следует
использовать функции Windows API.
Глава 3
Элементы управления
Создание
Windowsприложений в Visual Basic практически невозможно без использования
элементов управления, так как они позволяют пользователю взаимодействовать с
этими приложениями. Набор таких элементов управления не ограничен и может
расширяться за счет так называемых пользовательских элементов управления
(custom controls).
Некоторые элементы
управления подробно описываются в настоящей главе.
Использование
элементов управления
С элементами управления
вы уже сталкивались при добавлении кнопки в форму и обработке ее нажатия.
Однако Visual Basic позволяет обращаться к элементам управления не только при
разработке приложения, но и во время выполнения программы.
Элементы управления и переменные
Главное, что следует
знать при работе с элементами управления, — то, что к ним можно обращаться как
к переменной, присваивая значения определенным свойствам или считывая их.
Изменение свойств
Свойства определяют
внешний вид и функционирование элемента управления. Например, если требуется
установить новую надпись, то следует изменить свойство Caption. Как это
делается на стадии проектирования, вам уже известно. Но как изменять свойства
во время выполнения приложения? Это несложно, если рассматривать элементы
управления как переменные — так, для изменения надписи командной кнопки
Commandl используется ее свойство Caption:
Conimandl .Caption = "Новая
надпись"
В данном примере
свойству Caption объекта Commandl присваивается значение Новая надпись. При
этом имя объекта и свойство разделяются точкой:
Control.Свойство = Значение
Проект обычно состоит
из нескольких форм, каждая из которых может содержать элементы управления с
одинаковым именем. Поэтому синтаксис обращения к свойствам следует несколько
расширить:
[Форма.]Control.Свойство = Значение
Имя формы указывать
не обязательно, если обращаются к элементу управления, принадлежащему этой
форме.
Значения свойств
элементов управления считываются аналогичным образом. Каждое свойство является
как бы внутренней переменной элемента управления, значение которой можно не
только установить, но и считать. Поэтому, чтобы узнать, например, текст на
командной кнопке, достаточно записать:
Надпись? = Conunand.1 .Caption
В этом примере
переменная Надпись после присваивания содержит текст надписи на командной
кнопке. В общем случае значение свойства считывается следующим образом:
Значение = [Форма.]Объект.Свойство
Свойства только для чтения (Read Only)
Большинство свойств
элементов управления доступно как для считывания, так и для изменения. Но есть
свойства, которые во время выполнения доступны только для чтения (Read Only);
другие же могут быть недоступны при проектировании. Сведения о доступности
свойств (для чтения или для изменения, при проектировании или во время
выполнения) содержатся в справочном файле Visual Basic, а также в приложении к
данной книге.
Запомнить все
свойства всех элементов управления практически невозможно. Для получения
информации о какомлибо элементе управления, его свойствах, методах и событиях
следует обратиться к справке. Для этого выделите соответствующий элемент
управления на панели элементов и нажмите клавишу [F1]. После этого Visual Basic
предоставит всю необходимую информацию. .
Основные свойства
элементов управления
Ниже рассматриваются
свойства, которыми обладает большинство элементов управления.
Позиция
Позицию элемента управления
определяют четыре свойства: Left, Top, Height и Width. Эти значения по
умолчанию используют в качестве единицы измерения
твип (twip). Твип — это экраннонезависимая единица
измерения, равная 1/20 точки принтера и гарантирующая независимость отображения
элементов приложения от разрешения дисплея.
Свойства Тор и Left
задают координаты верхнего левого угла элемента управления, свойства Height и
Width — его высоту и ширину. Отсчет в системе координат ведется сверху вниз (Y)
и слева направо (X).
Цвет
Управление цветовым
оформлением элементов осуществляется с помощью свойств BackColor, FillColor и
ForeColor, которым по умолчанию назначаются стандартные цвета Windows.
Свойство BackColor
Цвет фона
устанавливается с помощью свойства BackColor. При проектировании цвет выбирают
в диалоговом окне настройки цвета, а во время работы приложения цвета задаются
либо с использованием цветовой схемы RGB, либо константами библиотеки VBRUN.
Свойства ForeColor, FillColor
С помощью свойства
ForeColor можно определить или установить цвет, используемый для отображения
текста и графики в элементе управления, а с помощью свойства FillColor —
установить цвет заполнения так называемых shapes (рисованных объектов).
Параметры шрифта
Вид
шрифта в элементах управления выбирается путем установки значений свойства
Font.
Таблица 3.1. Параметры шрифта
Свойство |
Значение |
Font.Name |
Имя шрифта |
Font.Size |
Размер шрифта |
Свойство
Значение
Font.Bold |
Полужирный |
|
ф |
Font.Italic |
Курсив |
FontUnderline |
Подчеркивание |
Font.StrikeThrough |
Перечеркивание |
Font.Weight |
Толщина символа |
Доступность и
видимость элемента управления
Часто при работе
приложения требуется сделать недоступными для пользователя некоторые элементы
управления. Для этого используют два свойства — Enabled и Visible. I
Свойство Enabled
Свойство Enabled
определяет, будет ли элемент управления реагировать на .событие или нет. Если
значение свойства равно False, элемент управления будет недоступен и
пользователь не сможет его использовать. Обычно при этом элемент подсвечивается
серым цветом, так же, как элементы меню, которые нельзя выбрать.
Свойство Visible
Свойство visible
позволяет сделать элемент управления невидимым. Если его значение равно False,
то он не виден и обратиться к нему нельзя.
Выбор свойства
Visible либо свойства Enabled остается за вами. Если вы выбираете свойство
Enabled, это означает, что элемент управления есть, но обратиться к нему пока
невозможно. А свойство visible позволяет "скрыть" элемент от
пользователя.
Private Sub Cominandl_Click ()
Commandl.Enabled =
False
End Sub Private Sub
Command2_Click()
Comnrand2 .Visible = False End Sub
Свойство Name
Свойство Name играет
особую роль. Ошибки при его задании часто приводят к серьезным последствиям.
Имя является идентификатором элемента управления. Если в приведенном примере
изменить имя второй кнопки, то код больше не будет выполняться, так как
элемента с именем Comniand2 нет. Окажется невозможным и изменить свойства
кнопки Command2.
Поэтому сначала
всегда следует задавать имя элемента управления и лишь затем писать для него
код обработки его события.
Внешний
вид
Большинство элементов
управления имеет свойство Appearance, отвечающее за отображение элемента
управления (без визуальных эффектов или в трехмерном виде).
Кроме того, для
большинства элементов управления можно установить значение свойства
ToolTipText. Введенный текст отображается в подсказке, которая появляется, если
пользователь установит указатель мыши на элементе управления в форме.
Свойства Parent u Container
Большая часть
элементов управления Visual Basic имеет также свойства Parent и Container.
Свойство Parent указывает на родительский объект. Благодаря этому свойству
возможен доступ к его методам или свойствам. В следующем примере строка
заголовка формы, которой принадлежит соответствующая кнопка, сохраняется в
переменной strCaption:
strCaption$ = Commandl.ParentCaption
Свойство Container,
на первый взгляд, действует аналогично. Однако в отличие от свойства Parent,
доступного только для чтения, свойство Container позволяет не только считывать,
но и изменять контейнер элемента управления. В примере путем изменения свойства
Container кнопка перемещается в элемент pictureBox:
Set Commandl.Contanier = Picturel
Следующие элементы
управления могут служить контейнером для других элементов управления:
.
• Form;
.
• Frame;
.
• Picture;
.
• Toolbar (издание для профессионалов и промышленное).
Свойство Tag
В отличие от других
свойств. Visual Basic не использует свойство Tag для управления элементом
управления — это свойство предназначено для хранения любых дополнительных
данных, необходимых разработчику:
Text.Tag = "Ввод имени порусски"
Вы познакомились
только с наиболее важными свойствами элементов управления Visual Basic.
Остальные будут подробно рассмотрены далее.
Основные
события
В этом разделе
рассматриваются события, которые могут обрабатываться большинством элементов
управления.
События щелчка мыши
Есть два события,
вызываемые щелчком мыши: click и Dbiciick.
Событие Click
Событие click
вызывается, как только пользователь выполнит щелчок на элементе
управления.
Событие DblCHck
Событие Dbl Click
вызывается двойным щелчком кнопкой мыши на элементе управления. Временной
интервал между двумя щелчками двойного щелчка устанавливается в панели
управления Windows. Параметры для процедур обработки этих событий не
передаются.
События, связанные с мышью
Кроме основных
событий
Click и Dblclick, есть еще три.
Событие MouseDown
Событие MouseDown
вызывается при нажатии кнопки мыши. При этом процедуре обработки события передается
несколько параметров:
Control MouseDown(Button
As Integer, Shift As Integer, _ X As Single, Y As Single)
.Private Sub
Commandl_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As
Single) End Sub
Передаваемые
параметры определяют состояние кнопок мыши (Button), управляющих клавиш
(Shift)n позицию курсора (х и Y). Параметры х и Y определяют позицию курсора
мыши на экране относительно верхней левой точки элемента управления.
Таблица 3.2.
Параметры событий MouseUp u MouseDown Параметр Значение
Button |
Нажата кнопка мыши: 1=левая,
2=правая, 4=средняя |
Shift |
Нажата клавиша: 0=ничего, l=[Shift], 2=[Ctrl], 4=[Alt], а также их |
|
б |
X |
Координата Х |
Y |
Координата Y |
Событие MovseUp
Событие Mouseup
вызывается при отпускании кнопки мыши. Его параметры приведены в табл. 3.2.
Событие MouseMove
Это событие
вызывается, когда пользователь передвигает курсор мыши. Синтаксис процедуры
обработки этого события следующий:
Private Sub Control_Mou»*Mov
(Button A« Integer, Shift As Integer, _ X &• Single, Y Aa Single)
Значение передаваемых
параметров для этого события приведены в табл. 3.2.
События клавиатуры
Событие KeyPreview
Подобно событиям,
связанным с мышью, есть также события, связанные с клавиатурой: Keypress, KeyUp
и KeyDown. Обычно событие вызывается для активного элемента управления. Если
свойству формы KeyPreview присвоить значение True, то событие, связанное с
клавиатурой, передается сначала форме, а затем текущему элементу управления.
Событие KeyPress
Событие Keypress
возвращает код ASCII нажатой клавиши. При этом не перехватываются специальные
клавиши, такие как [PrintScreen] или [Alt], а только [Enter], [Esc] и
[Backspace]. Процедура передает параметр KeyASCll, содержащий код ASCII нажатой
клавиши. Этот параметр передается как значение, т.е. его можно изменять. Это
можно использовать, например, для фильтрации вводимых пользователем символов —
если символ недопустимый, то установив значение Ке yASC 11 равным нулю, вы
предотвратите его передачу для дальнейшей обработки (отображение и т.п.).
Contro.I_KeyPress (KeyAscii
As Integer)
События KeyDown, Key Up
Эти события
вызываются при нажатии (KeyDown) или отпускании (KeyUp) клавиши. Они происходят
даже при нажатии специальных клавиш управления, например функциональных клавиш.
При этом передаются два параметра: KeyCode и Shift. Параметр KeyCode содержит
клавиатурный код (а не ASCII) нажатой клавиши, например vbKeyFl, а параметр
shift информирует о состоянии клавиш [Shin], [Ctrl] и [Alt].
Con t:ro.l_KeyOp( Key
Code As Integer, Shift As Integer)
Control_KeyDo»»n
(KeyCode As Integer, Shift As Integer)
После нажатия клавиши
события наступают в такой последовательности: KeyDown, KeyPress И KeyUp.
Фокус
Фокус — это одно из
важных понятий при обращении к элементам управления в Windows, Как уже
упоминалось, система Windows решает, какому приложению передавать нажатие
клавиши — управление получает активный элемент, т.е. элемент, имеющий фокус.
Если элемент получает фокус, то это соответствующим образом отображается на
экране — текстовое поле отображается с мерцающим маркером ввода, командная
кнопка выделяется пунктирной рамкой вокруг надписи.
События LostFocus, GotFocus
Visual Basic
позволяет обрабатывать два события, связанных с передачей
фокуса: LostFocus и
GotFocus. Если перейти от одного элемента управления к другому, то для
предыдущего элемента вызывается событие LostFocus, а для нового — GotFocus.
Форма — окно во внешний мир
Форма дает
возможность сообщаться с "внешним миром", т.е. с пользо вателем, и
поэтому стоит познакомиться с ней поближе. Как уже говорилось, каждая форма
сохраняется в проекте в виде отдельного файла. Этот файл содержит описание
рабочей среды и код, относящийся к элементам управления и форме. Формы
сохраняются как обычные текстовые файлы. В текстовом формате форма может быть
представлена в следующем виде:
VERSION 6.00 Begin
VB.Form Formi
Caption =
"Formi" ClientHeight = 3195
ClientLeft = 60
ClientTop = 345 ClientWidth
= 4680 LinkTopic |
= "Formi" ScaleHeight |
= |
|||||
3195 ScaleWidth |
= 4680 StartUpPosition = 3 |
||||||
'Windows Default Begin
VB.CommandButton |
|||||||
Commandl Caption |
= "Commandl" Height
|
= |
|||||
495 Left |
= 1800 Tablndex |
= 0 Top |
= |
||||
1320 Width |
= 1215 End End |
|
|
||||
Attribute VB_Name =
"Formi" Attribute |
|
||||||
VB_GlobalNameSpace = False
Attribute |
|
||||||
VB_Creatable = False
Attribute |
|
||||||
VB_PredeclaredId = True
Attribute VB Exposed = |
|
||||||
False |
|
||||||
Свойства формы
Кроме стандартных
свойств, таких как Caption, BackColor, Font и т.д., формы имеют и свои
собственные свойства, присущие только им. Эти свойства рассматриваются ниже.
Для просмотра свойств
формы в окне свойств нужно либо щелкнуть в пустом месте формы (но не в строке
заголовка), либо выбрать форму из списка объектов в окне свойств.
Свойство BorderStyle
Стандартное окно
имеет рамку (border). С ее помощью пользователь может изменять размеры окна.
Для этого в системном меню имеется соответствующая команда. Вид рамки можно
изменить с помощью свойства BorderStyle, которое может принимать одно из
следующих значений (табл. 3.2).
Таблица 3.3. Установка рамки окна
Константа |
Значение |
Вид окна |
vbBSNone |
0 |
Окно без рамки. Размер окна
изменяться не |
|
|
может. Нет строки заголовка.
Окно не может |
|
|
перемещаться. Минимизация и максимизация |
|
|
окна также невозможны. |
vbF*xedSingle |
1 |
Фиксированная рамка. Есть заголовок, кнопки |
|
|
минимизации и максимизации, но размер окна |
|
|
изменяться не может. |
vbSizable |
2 |
Значение по умолчанию.
Возможны все |
|
|
изменения размера окна. |
Константа |
Значение |
Вид окна |
vbFixedDialog |
3 |
Окно окаймляется толстой рамкой. Изменения размера |
|
|
невозможны. Нет кнопок минимизации и максимизации. |
|
|
Минимизировать и
максимизировать можно только из |
|
|
системного меню. |
vbFixedToolWindow |
4 |
Поведение такое же, как vbFixedS ingle, но в Windows 95 |
|
|
строка заголовка более узкая и имеет меньший шрифт. |
|
|
Эта форма не отображается на панели задач Windows 95. |
vbSizableToolWindow |
5 |
Поведение такое же, как vbsizeable, но строка заголовка |
|
|
более узкая и имеет меньший шрифт. Эта форма также не |
|
|
отображается на панели задач
Windows 95. |
С помощью рамки можно изменять не только внешний вид
окна, но и его размеры. А это важно, так как содержимое окна не подгоняется
автоматически к его измененному размеру. Это может привести к тому, что элемент
управления после изменения размера будет находиться вне видимой области и
поэтому "забудется". Не включится также и полоса прокрутки.
На рис. 3.3 слева отображено окно приложения с двумя
кнопками, появившееся после запуска приложения, а справа — окно того же
приложения, но после уменьшения пользователем размера окна.
Свойство ControlBox
Свойство ControlBox
определяет, отображается ли системное меню, с помощью которого пользователь
может выйти из программы ([Alt+F4]). Если же системное меню удаляется,
пользователю следует обеспечить другой способ выхода из программы.
Свойство MaxButton
Кнопкой максимизации
пользователь может увеличить окно до размера экрана. Ее наличие определяется
свойством MaxButton формы. Если присвоить этому свойству значение False, то
соответствующая кнопка будет отсутствовать, а команда Maximize
(Развернуть) удаляется из системного меню.
Свойство MinButton
Если для свойства
MinButton задать значение False, то кнопка затемняется, а из системного меню
удаляется строка Minimize (Свернуть).
Основные события формы
С некоторыми из событий
формы вы уже знакомы. Но есть еще несколько событий, на которые необходимо
обратить особое внимание. Следует отметить одну особенность событий формы —
синтаксис процедуры обработки события формы отличается от синтаксиса процедур
обработки событий элементов управления.
Form
Событие((Аргументы...])
Имя процедуры
обработки события формы всегда содержат Form. При этом не важно, как фактически
называется форма.
Событие Load
Одним из наиболее
используемых событий формы является Load. Это событие происходит при загрузке
формы в память. Поэтому Load лучше всего подходит для инициализации объектов и
переменных, принадлежащих форме.
Событие Unload
Событие Unload
вызывается, если форма удаляется из памяти. С помощью параметра Cancel можно
отменить удаление формы с экрана.
Событие Query Unload
Более практичным, чем
Unload, является событие QueryUnload. Наряду с параметром Cancel в процедуру
обработки события передается и параметр UnloadMode, указывающий причину
возникновения события.
Таблица. 3.4.
Параметры OnloadMode в QueryUnload Константа Значение Причина возникновения
события
vbFormControlMenu |
0 |
Пользователь закрыл
приложение посредством |
|
|
[Alt+F4], кнопки Close (Закрыть) окна или |
|
|
одноименной команды системного меню |
vbFormCode |
1 |
В коде выполняется команда
Unload |
vbAppWindows |
2 |
Завершение сеанса Windows |
vbAppTaskManager |
3 |
Выход из приложения с помощью менеджера задач |
vbFormMDIForm |
4 |
Дочерняя форма MDI закрыта,
так как закрыта |
|
|
вышестоящая форма MDI |
Событие Resize
Проблема, возникающая
при изменении размеров формы, уже рассматривалась. Решить ее помогает событие
Resize, которое вызывается при любом изменении размеров формы. При этом следует
учитывать два аспекта. Вопервых, во время обработки события Load форма еще не
видна. Вовторых, при загрузке и отображении формы всегда возникает и событие
Resize, так как при запуске размеры формы изменяются от нулевых до заданных в
свойствах формы. При создании процедур для
связанных событий
типа Activate, GotFocus, Paint и Resize убедитесь, что их действия не находятся
в противоречии друг с другом и что они не вызывают рекурсивных событий.
Основные элементы управления
В этом разделе будут
рассмотрены те элементы управления, которые включены во все издания Visual
Basic. Элементы управления издания для профессионалов будут рассмотрены позже.
В приложении к книге, в ссылке на элементы управления, даются сведения о каждом
элементе: назначение, основные свойства и события, несколько советов и указаний
по обращению с этим элементом.
Кнопка (CommanaButton)
Назначение
Этот элемент
управления используется для того, чтобы начать, прервать или закончить
какойлибо процесс. Кнопка встречается во всех приложениях Windows.
События
Главным событием для
кнопки является Click. Кроме этого события, у кнопки могут быть и другие, но
они применяются редко.
Для вызова события
Click имеются разные способы. Самый простой — непо средственный щелчок на
кнопке мышью. Это же событие вызывается также, если с помощью клавиши [Tab]
переместить фокус на кнопку, а затем нажать клавишу [Enter]. Можно программно
вызвать событие Click, установив равным True значение свойства Value,
доступного только во время выполнения.
Свойства
Есть два интересных
свойства кнопки, связанных с событием Click. Свойство Default определяет, что
данная кнопка является кнопкой, активной по умолчанию. Если это свойство равно
True, то нажатием клавиши [Enter] автоматически генерируется событие Click этой
кнопки независимо от того, какой элемент имеет фокус. Присваивать значение True
этому свойству можно только для одной кнопки.в форме. Следует учитывать, что в
этом случае нажатие клавиши [Enter] перехватывается и передается этой кнопке.
Обычно кнопкой по умолчанию является кнопка ОК.
Свойство Cancel
используется подобно Default. Оно обеспечивает перехват клавиши [Esc] и вызов
события Click для соответствующей кнопки. Обычно это свойство имеют кнопки
Cancel (Отмена).
Надпись (Label)
Надпись (Label)
предназначена для отображения текста, который пользователь не может изменить с
клавиатуры.
События
Хотя некоторые
события этого элемента управления можно обрабатывать, обычно' эта возможность
не используется.
Свойства
Самым важным
свойством надписи является Caption, содержащее отображаемый текст.
Воспользовавшись свойством BorderStyle, можно установить способ отображения
текста — с рамкой или без нее. Оформлять текст можно, используя все возможности
форматирования текста, доступные в окне свойств, — от вида и размера шрифта до
цвета символов. Если текст длиннее, чем поле надписи, то оставшаяся часть
текста просто не отображается (усекается).
Этого можно избежать,
если присвоить значение True свойству AutoSize, что приводит размер надписи в
соответствие с длиной текста. Таким же образом можно корректировать размер
надписи и по вертикали. Для этого одновременно со свойством AutoSize нужно
установить свойство Wordwrap. Тогда слова, не помещающиеся в строке,
автоматически будут переноситься в следующую строку.
Установка в тексте
надписи перед любой буквой символа амперсанд (&) позволяет определить для
выбора объекта клавишу быстрого доступа Так как надпись не может получать
фокус, она передает его следующему элементу управления. Если амперсанд просто
должен появляться в тексте без дальнейшего действия, следует отключить свойство
UseMnemonic.
Текстовое поле (TextBox)
Назначение
Текстовое поле
(TextBox) является основным элементом управления, предназначенным для ввода
данных.
События
При использовании
текстового поля представляют интерес несколько событий Прежде всего, это
событие Change, которое вызывается при изменении содержимого текстового поля.
Это событие происходит каждый раз при вводе, удалении или изменении символа.
Например, при вводе в текстовое поле слова "Hello" событие Change
вызывается пять раз — по одному разу для каждой буквы.
Для анализа
введенного в поле текста лучше всего подходит событие Lost Focus Это событие
вызывается после того, как текстовое поле становится неактивным (после передачи
фокуса другому элементу, т.е. когда пользователь закончит ввод). Однако если
это поле является единственным элементом управления в форме, оно не может
потерять фокус.
Чтобы удалить или
инициализировать содержимое текстового окна, используется событие GotFocus. Оно
вызывается, когда пользователь "входит" в текстовое окно
Свойства
Можно воспользоваться
и другими свойствами текстового поля, о которых стоит поговорить отдельно Самым
важным является свойство Text. Это свойство содержит отображаемый в поле текст
Private Sub
txtInput_LostFocus() strText$ = txtInput.Text End Sub
В данном примере при
возникновении события LostFocus переменной strText присваивается значение
txtinput. Text, т.е. текст поля.
Элементы управления,
которые разрешают ввод символов, имеют свойство Text, а элементы,
предназначенные только для отображения текста, — свойство Caption. Текстовое
поле подобно маленькому редактору. Чтобы использовать его в таком качестве,
достаточно установить свойство MultiLine. Это дает возможность вводить в поле
несколько строк.
В многострочном поле
для перехода на новую строку можно использовать клавишу [Enter]. Но при этом
следует помнить, что для некоторой кнопки, возможно, установлено свойство
Default. Поэтому нажатие клавиши [Enter] вызовет срабатывание этой кнопки. В
таком случае для перехода на новую строку надежнее использовать комбинацию
клавиш [Ctrl+Enter] или [Shift+ Enter].
Если форма не
содержит многострочное текстовое поле и кнопку по умолчанию, то нажатие клавиши
[Enter] в текстовом поле, имеющем фокус, вызовет звуковой сигнал. Для
предотвращения этого напишите следующую процедуру обработки события Keypress
текстового поля:
Private Sub Textl
Keypress (KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii =" 0 End Sub
При этом клавиша
[Enter] просто игнорируется.
При работе с
многострочным текстовым полем можно столкнуться со следующей проблемой: если
вводимый текст больше, чем может поместиться в текстовом поле, текст хотя и не
усекается, но и не отображается полностью. Эта проблема решается установкой
свойства ScrollBars. С его помощью можно определить, какую полосу прокрутки
будет иметь текстовое поле: горизонтальную, вертикальную или обе. При этом
полосы прокрутки функционируют самостоятельно, т.е. вам не нужно писать
дополнительный код.
В текстовом поле, как
это обычно делается в среде Windows, можно также выделять текст. Для этого
Visual Basic предоставляет следующие три свойства текстового окна. Свойство
SelStart определяет начальную позицию выделенного текста в символах. Свойство
SelLength содержит количество выделенных символов. И, наконец, с помощью
свойства SelText можно прочитать или изменить выделенный текст. В следующем
примере выделяется текст со 2го по 6й символ и заменяется на "Hello".
Textl.SelStart = 2 ,
Textl.SelLength = 5 Textl.SelText = "Hello"
Иногда в поле
требуется быстро удалить текст или заменить его новым. Для этого выделяется
весь текст в поле, как только данное поле получает фокус. Приведенный пример
показывает, как это реализовать:
Private Sub txt!nput_GotFocus()
txtinput.SelStart ° 0
txtinput.SelLength =
Len(txtinput.Text) End Sub
Флажок
(CheckBox)
Назначение
Флажки — это элементы
управления, которые можно отмечать (ставить "галочку"), выбирая из
ряда опций одну или несколько. CheckBox может иметь два различных состояния —
отмеченное и не отмеченное. Собственно, он может иметь и третье состояние. В
этом случае элемент управления отображается как отмеченный, но недоступный.
Установить такое состояние элемента управления можно только программно.
События
Важнейшим для флажка,
как и для кнопки, является событие click.
Свойства
Единственным важным
свойством элемента управления CheckBox является его значение (Value). В
зависимости от того, отмечен флажок или нет. Value может принимать следующие
значения:
Таблица
3.5. Значения флажка
Величина |
Значение |
0 |
Не отмечен |
1 |
Отмечен |
2 |
Отмечен, но недоступен |
Переключатель
(OptionButton)
Назначение
Этот
элемент управления, представляющий собой кружок с точкой или без, предназначен
для установки только одной опции из группы. Обычно все переключатели формы
объединены в одну группу. Если вы желаете сформи ровать новую группу
переключателей, то нужно поместить их в отдельный элементконтейнер, например
Frame. Работа с элементамиконтейнерами будет рассмотрена далее.
События
Так же, как и для
элемента управления CheckBox, для переключателей важно только одно событие —
Click.
Свойства
Важнейшим свойством
переключателей является свойство Value. С его помощью можно определить
состояние переключателя. Это свойство может принимать значения True И False.
Список (ListBox)
Назначение
Список — ListBox —
позволяет пользователю выбирать из списка один или
несколько элементов. В любое время в
список можно добавлять новые элементы
или удалять
существующие. Если не все элементы могут одновременно
отобразиться в поле
списка, то в нем автоматически отображаются полосы прокрутки.
События
Основное событие
списка — Click. Это событие вызывается, если пользователь с помощью мыши или
клавиш управления курсором выбирает элемент в списке.
Методы
Окно списка — это
первый из рассмотренных нами элементов управления, для которых важную роль
играют методы. Методы списка необходимы для обработки элементов списка —
добавления или удаления. Для добавления новых элементов используется метод
Addltem:
ListBox.Addltem Элемент!, Индекс]
Параметр Элемент
задает добавляемый элемент списка. С помощью параметра Индекс указывается место
вставки в список нового элемента. Данный метод должен вызываться при вставке
каждого элемента. Как правило, заполнение списка выполняется при загрузке
формы:
Private Sub Form Load
IstBox.Addltem
"Глубокоуважаемый господин,"
IstBox.Addltem
"Глубокоуважаемая госпожа,"
IstBox.Addltem
"Глубокоуважаемые дамы,"
IstBox.Addltem
"Глубокоуважаемые дамы и господа," End Sub
В данном примере для
формирования списка IstBox, содержащего различные варианты обращения, несколько
раз вызывается метод Addltem.
Для удаления элемента
из списка используется метод Remove Item, которому в качестве параметра
передается индекс удаляемого элемента. Индексация элементов списка начинается с
0. Listbox.Removeltem
Индекс_элемента IstBox. Removeltem 2
'Удален третий
элем.ент списка
Для удаления всех
элементов списка используется метод clear:
ListBox.Clear
Свойства
Использование
свойства списка Text — самая простая возможность получить текст выбранного
элемента списка. В любой момент времени значение этого свойства содержит текст
выбранного элемента списка или пустую строку, если ни один элемент не выбран.
Для определения текста выбранного элемента существуют и другие возможности.
Однако следует помнить, что и в памяти все элементы списка сохраняются в виде
списка. При этом первый элемент списка имеет индекс 0. Зная это,
можно воспользоваться
свойством списка List(), которое позволяет определить текст элемента списка по
его индексу:
thirdltem = IstBox.List (2)
Приведенный ниже
оператор списка Listlndex содержит индекс выбранного элемента.
IstNumber
IstBox.Listlndex
Комбинируя свойства
List () и Listlndex, можно получить выбранный элемент списка:
Istltem = IstBox.List(lstBox.Listlndex)
Если в списке не
выбран ни один элемент, значение свойства Listlndex равно 1. Текущее количество
элементов в списке сохраняется в свойстве ListCount.
Элементы поля списка
по умолчанию отображаются в одном столбце. Во время проектирования, при
необходимости, их число можно изменить с помощью свойства Columns. Заполнение
столбцов в этом случае осуществляется последовательно — сначала заполняется
первый, затем второй и т.д.
Свойство Sorted
определяет способ расположения элементов в списке. Если установить это
свойство, то все элементы будут сортироваться по алфавиту, даже если они были
добавлены с указанием индекса. Индекс последнего добавленного элемента содержит
свойство Newlndex.
Это свойство связано
с другим весьма интересным свойством списка — Item Data О, с помощью которого
каждому элементу списка можно поставить в соответствие число типа Long.
Используя это свойство, вы можете составить, например, список сотрудников,
сохранив их индивидуальные номера в свойстве itemData:
IstPersonal.Additem
"Vogel" IstPersonal.ItemData(IstPersonai.Newlndex) = 8763
В приведенном примере
в список добавляется элемент Vogel. Во второй строке свойству ItemData (в
данном случае индивидуальному номеру) добавленного элемента с индексом
IstPersonal. Newlndex присваивается числовое значение.
При добавлении в
список нового элемента следует позаботиться о присвоении (при необходимости)
требуемого значения свойству ItemData, так как оно изначально не
инициализировано соответствующим значением ранее добавленного элемента.
Пользователь может
выбирать одновременно несколько элементов списка. Для этого следует присвоить
свойству Multiselect одно из значений, приведенных в следующей таблице.
Таблица 3.6. Значения
свойства Multiselect
Значение Описание
0 Множественный
выбор невозможен. Щелчком мыши или нажатием
клавиши пробела в списке можно выбрать только один элемент.
' Простой
множественный выбор. Элементы списка выбираются
щелчком мыши или нажатием клавиши пробела.
2 Расширенный
множественный выбор. Пользователь может выбрать несколько элементов с помощью
мыши или клавиш управления курсором с использованием клавиш [Shift] и [Ctrl]
При множественном
выборе свойство Text содержит текст последнего выбранного элемента списка.
Значение свойства Selected () элемента списка показывает, выделен данный
элемент списка или нет. Если свойство равно True, то данный элемент выбран:
If
IstPersonal.Selected (2) Then strName$ = IstPersonal.List (2) End If
Поле
со списком (ComboBox)
Назначение
Поле
со списком или ComboBox — это по сути комбинированный список, который представляет
собой комбинацию двух элементов управления — самого списка со значениями и поля
ввода текста (текстового поля). Поля со списком используются в том случае, если
нельзя заранее определить значения, которые следует включить в список, или
список содержит слишком много элементов. В таком списке нужное значение можно
не только выбирать, но и вводить непосредственно в поле ввода. Новое значение
после ввода автоматически помещается в список.
События
Для поля со списком
важную роль играют события как поля ввода, так и списка. Основные из них<—
Click, используемое для выбора элемента списка, и Change — для изменения записи
в поле ввода текста.
Свойства
Поле со списком имеет
почти все свойства текстового поля TextBox и списка ListBox (исключением
является свойство MultiLine). Однако особо следует выде лить свойство Style,
определяющее внешний вид и функционирование поля со списком.
Таблица 3.7. Свойство Style Константа
Значение Описание
vbComboDropDown |
0 |
Значение по умолчанию. ComboBox представ |
|
|
ляет собой текстовое поле для
|
|
|
редактирования и открывающийся список. |
vbComboSimple |
1 |
ComboBox представляет собой текстовое поле |
|
|
и постоянно открытый список. |
vbComboDropDownList |
2 |
Отличается от списка со значением vbCombo |
|
|
DropDown только тем, что
пользователь не |
|
|
может вводить текст в текстовое поле. |
Полосы прокрутки (ScrollBar)
Назначение
Элемент управления
ScrollBar — это полосы прокрутки окна. Некоторые элементы управления (например,
TextBox, ListBox) используют такие полосы прокрутки, причем от разработчика не
требуется написание программною кода для выполнения прокрутки. Однако полоса
прокрутки как элемент управления Visual Basic хотя и предназначена для
выполнения аналогичных функций, но не выполняет автоматически какихлибо действий,
т.е. ее поведение необходимо программировать. Существует два вида полос
прокрутки: горизонтальная и вертикальная.
События
Полосы прокрутки
имеют два интересных события: change, которое возникает после изменения позиции
бегунка или после программного изменения значения свойства value, и Scroll,
происходящее во время прокрутки (когда пользователь захватил и передвигает
бегунок).
Свойства
Перед тем как
использовать полосу прокрутки, необходимо установить для нее диапазон
прокрутки, который показывает количество шагов прокрутки между крайними
позициями бегунка. Текущее положение бегунка определяется значением свойства
Value.
Диапазон прокрутки
определяется свойствами Min и Мах полосы прокрутки. При этом значение Min
всегда соответствует верхнему концу полосы, а Мах — нижнему (для вертикальной
полосы прокрутки), и при прокрутке содержимого окна сверху вниз значение
свойства Value увеличивается. Чтобы изменить направление изменения свойства
Value, достаточно поменять местами значения свойств Min и Мах.
Щелчок на одной из
двух кнопок со стрелками на полосе изменяет значение свойства Value на
величину, определяемую свойством SmallChange. Если пользователь щелкнет в
области между бегунком и какойлибо из кнопок, то значение свойства value полосы
прокрутки и соответственно положение бегунка изменяется на величину,
определяемую свойством LargeChange.
Таймер (Timer)
Назначение
Использование
таймера является хорошим способом управления вашей про граммой. С помощью
таймера вы можете запускать или завершать процессы приложения в определенные
моменты времени. Таймер может быть полезным и в том случае, если приложение
выполняется в фоновом режиме. Во время проектирования таймер отображается в
форме, но во время выполнения программы он является невидимым.
События
Таймер имеет
единственное событие — Timer, которое вызывается по истечении установленного
временного интервала.
Свойства
Для установки
интервала времени служит свойство Interval, значение которого устанавливается в
миллисекундах. Например, задание значения 250 вызывает событие Timer через
каждые 250 миллисекунд независимо от того, какое приложение активно. Для
отключения таймера следует присвоить свойству Interval значение О или свойству
Enabled значение False.
Максимально
допустимый интервал составляет 64757 миллисекунд. Но следует помнить, что
операционная система может обрабатывать только 18,2 прерывания таймера в
секунду, поэтому точность задания интервала составляет максимум одну
восемнадцатую секунды. Необходимо также учесть, что при большой загрузке
системы (поддержка сети, печать и т.п.) прерывания могут обрабатываться еще
реже.
В Windows вы можете
использование не более 32 таймеров. Поскольку для работы системы также нужен
таймер, то для всех приложений остается максимум 31.
Если обработка события
Timer длится дольше, чем задано значением interval, то новое событие Timer не
вызывается, пока Visual Basic не обработает это событие.
Список, устройств (DriveListBox)
Назначение
Элемент управления
DriveListBox относится к группе элементов управления, предназначенных для
отображения и работы с дисками, каталогами и файлами. DriveListBox служит для
отображения списка всех доступных дисков и устройств
системы и
обеспечивает возможность их выбора.
События
Самым интересным
событием элемента DriveListBox является change. Это событие вызывается при
смене носителя данных.
Свойства
Элемент DriveListBox
обладает почти всеми свойствами обычного поля со списком. Но чаще всего
используется только свойство Drive, возвращающее выбранный диск или устройство
(например, "С:\").
Список каталогов (Directory ListBox)
Назначение
DirectoryListBox или
кратко DirListBox — это второй элемент управления, предназначенный для выбора
файлов. Он отображает структуру выбран ного диска и позволяет осуществлять
выбор и смену каталога.
События
Для этого элемента
также главную роль играет событие Change. Оно вызывается в результате двойного
щелчка мышью на имени каталога в окне^ просмотра.
Свойства
Элемент управления
DirListBox также имеет некоторое сходство со списком. Однако главным его
свойством является свойство Path, возвращающее полный путь к выбранному
каталогу, включая имя диска (например, C:\WINDOWS\WORD).
После добавления в
форму элементов управления DriveListBox и DirListBox они еще не работают
совместно. То есть в один и тот же момент в DriveListBox может отображаться имя
диска С, а в DirListBox — структура каталогов диска D. Поэтому прежде чем
использовать эти элементы управления, их необходимо синхронизировать. Это
происходит при обработке события Change в DriveListBox:
Private
Sub Drivel_Change ()
Dirl.Path = Drivel.Drive End Sub
Обычно для выбора
каталога пользователь нажимает клавишу [Enter]. Однако элемент управления
DirListBox игнорирует эту клавишу. Решением такой проблемы является возможность
обработки события Keypress и программная смена каталога:
Private Sub
Dirl_KeyPress (KeyAscii As Integer) If KeyAscii =13 Then Dirl.Path Dirl.List(Dirl.Listlndex) End If End Sub
Список файлов (FileListBox)
Назначение
FileListBox —
последний элемент управления, который можно использовать для выбора файлов. Он
отображает файлы текущего каталога, откуда их можно выбирать.
События
Для FileListBox основным
событием является Click, которое вызывается при выборе пользователем
имени файла в списке. Представляют также интерес события PathChange и
PatternChange. Событие PathChange происходит после изменения пути
(свойство Path), а событие PatternChange
— после изменения маски выбора файлов
(свойство Pattern).
Свойства
Этот элемент
управления также имеет много общих свойств с элементом Li s tBox. Однако
основным его свойством является свойство FileName, которое содержит имя
выбранного файла (например, BOOK.DOC).
Свойство pattern
позволяет определить тип тех файлов, которые должны отображаться в списке.
Таким образом, установка значений свойства Pattern напоминает установку
параметров команды DSr в MSDOS. Например, для отображения файлов с
расширением *.1СО и *.ВМР необходим следующий код:
Filel.Pattern = "*.ICO;*.BMP"
/
Обратите внимание,
что расширения файлов разделяются точкой с запятой.
Список
файлов также должен синхронизироваться с выбранными
устройствами и каталогом. Это происходит
при обработке события Change для DirListBox.
При этом используется
свойство
Path элемента FileListBox:
Private Sub Dirl Change ()
Filel.Path = Dirl.Path End Sub
Так как элемент
DirListBox уже синхронизирован с выбором диска, все три элемента теперь
работают вместе.
Для отображения
полного имени файла, включая путь, нужно просто сложить соответствующие строки,
содержащие значения имени диска, пути и имени файла. Поместить символ
"\" между путем и именем файла достаточно просто. Это выполняется
следующим оператором:
IblPath.Caption =
Filel.Path & "\" & Filel.Filename
Чтобы избежать
отображения в пути излишнего количества символов "\", например в
случае выбора файла корневого каталога, нужно немного изменить код:
Private Sub Filel_Clic)c ()
If Right (Filel.
Path, 1) = "\" Then
IblPath.Caption =
Filel.Path & Filel.Filename Else
IblPath.Caption Filel.Path &'"\" &
Filel.Filename End If End Sub
Рамка (Frame)
Назначение
Рамка (Frame) — это
один из элементовконтейнеров. Его назначение — объединить в группу несколько
элементов управления. Объекты, объединенные с помощью рамки, можно как единое
целое перемещать, активизировать и деактивизировать, делать видимыми или
невидимыми. Некоторые элементы сами нуждаются в контейнере — например, все
переключатели в форме всегда объединяются в одну группу. Чтобы создать вторую
группу опций, нужно требуемые переключатели объединить в элементеконтейнере.
Для объединения
объектов в группу нужно сначала создать элемент контейнер, а затем добавить в
него нужные элементы управления. Если требуемые элементы управления уже
находятся в форме, их достаточно переместить в элементконтейнер. Чтобы
проверить, действительно ли элемент принадлежит контейнеру, достаточно
переместить контейнер. Элемент управления, принадлежащий контейнеру, будет
перемещаться вместе с ним.
Свойства
Рамка — это элемент
управления, который не имеет особых свойств,
присущих только ей. |
||||||||||||
События |
||||||||||||
События |
рамки |
обычно |
не |
анализир |
уются, |
так |
как |
чаще |
всего |
|||
проектировщик |
работает |
только |
с |
элементами |
|
управления, |
||||||
принадлежащими рамке. |
|
|
|
|
|
|
|
|
||||
Окно с рисунком (PictureBox)
Назначение
Как следует из самого
названия, элемент PictureBox предназначен для отображения рисунков и других
графических объектов. Этот элемент управ ления также является
элементомконтейнером, поэтому его можно использовать для объединения других
элементов.
События
Как и события рамки,
события элемента PictureBox обычно не обрабатываются, хотя при необходимости
это можно сделать.
Свойства
Положение PictureBox
в форме задается свойством Align, которое определяет будет ли PictureBox
закрепляться у одного из краев формы или сохранит положение, заданное разработчиком.
Если элемент управления закрепляется у одного из краев формы, то его размер
(ширина или высота) всегда устанавливается в соответствии с размером формы.
Свойство AutoSize
определяет, будут ли автоматически изменяться размеры элемента управления для
отображения рисунков различного размера.
Самое важное свойство
PictureBox — Picture, которое содержит отображае мый графический объект. Это
может быть растровое изображение (*.ВМР), пиктограмма (*.1СО), метафайл (*.WMF)
или расширенный метафайл (*.EMF), а также GIF и JPEGфайлы.
При выполнении
приложения для изменения свойства используется функция LoadPicture:
Picturel.Picture =
LoadPicture("C:\WINDOWS\AUTOS.BMP")
Сохранить изображение
можно при помощи функции SavePicture:
SavePicture Picturel.Picture,
"BUILD.BMP"
Методы
Методы PictureBox
позволяют нарисовать точку, линию и окружность, а также вывести текст (метод
Print):
picDisplay.Print "Hello world"
picDisplay.Line (0, 0)(100, 500), vbRed
picDisplay Circle (300, 300), 250, vbBlue
Способность элемента
PictureBox отображать рисунки различных форматов можно использовать для
преобразования пиктограммы (*.1СО) в растровое изображение (*.ВМР). Для этого
нужно загрузить пиктограмму и сохранить ее с расширением BMP. Однако растровое
изображение преобразовать в пиктограмму нельзя.
Изображение (Image)
Назначение
Элемент
управления image также создан для отображения рисунков. Но в отличие от
PictureBox, он не является элементомконтейнером. Он не позволяет рисовать и не
допускает группирования объектов. Однако image использует меньше ресурсов и
перерисовывает быстрее, чем PictureBox. Поэтому для отображения рисунков Image
может быть лучшим вариантом.
События
Так как главное
назначение image — отображение рисунков, его события обычно не анализируются.
Свойства
Главным свойством
Image также является Picture. С его помощью можно определить рисунок,
отображаемый элементом управления, на стадии проектирования либо при выполнении
программы. Свойство Stretch определяет, как отображается рисунок. Если значение
свойства Stretch равно True, то размеры рисунка изменяются до размеров элемента
управления image, в противном случае элемент управления изменяется до размера
рисунка.
Меню
Большинство
приложений Windows обладает меню. Вы также можете оснастить им свое приложение,
поскольку меню это тоже элемент управления (рис. 3.5).
Прежде чем
проектировать меню, следует ознакомиться с некоторыми правилами его создания.
Обычно меню состоят
из нескольких уровней. Верхний уровень — это строка меню, в которой находятся
элементы главного меню. Они обозначают главные группы команд, например File
или Edit. Лучше придерживаться общепринятой структуры меню — это
облегчает пользователю изучение программы и работу с ней.
При выборе элемента
меню первого уровня автоматически открывается меню второго уровня. Элементы
второго уровня "выпадают" в виде списка. В большинстве приложений
меню заканчивается на этом уровне. Но можно создать и больше уровней — максимум
шесть.
Правила составления меню
Для обеспечения
простого и удобного обращения с меню следует учитывать следующие правила:
.
• обычно
элементы строки меню позволяют открывать меню следующего уровня. Если же
требуется, чтобы после выбора команды меню выполнялся код, то текст лого элемента
должен заканчиваться восклицательным знаком, например Info!;
.
• ограничивайтесь двумя или тремя уровнями — так пользователю
легченаходить элементы меню;
.
• элементы меню, выполнение которых вызывает появление
диалогового окна,отмечаются тремя точками после имени, например Open....
Создание меню
Создание меню в
Visual Basic осуществляется с помощью специального инстру мента создания меню —
редактора меню. Окно редактора меню открывается одним из трех способов: путем
нажатия комбинации клавиш [Ctrl+E], нажатием соответствующей кнопки на панели
инструментов или после выбора команды меню Tools\Menu Editor.... На
рисунке показано окно проекта меню с уже готовым проектом.
Из рисунка видно, что
элементы меню создаются аналогично элементам управления и имеют такие свойства,
как Caption и Enabled. Меню строится иерархически, и его структура выглядит
примерно так:
Элемент! Строка_заголовка (Уровень_1) Уровень_2 Уровень_3 ~Уровень_4 Уровень_5
Уровень_6 Элемент2 Строка_заголовка
Уровень_2
Проще всего создавать меню при помощи
встроенного редактора меню Visual Basic. Для этого сначала в поле Caption окна
редактора вводится текст, который будет виден в строке меню. Для быстрого
открытия меню или вызова команды используются горячие клавиши. Для определения
горячих клавиш достаточно в поле Caption перед соответствующей буквой
поставить амперсанд (&). Например, для быстрого открытия меню File в
поле Caption диалогового окна редактора меню необходимо ввести
"&File". Если же в качестве горячих клавиш нужно определить
[Alt+i], то в поле Caption следует ввести "F&ile".
Второй шаг —
назначение имени элементу меню (так же, как любому элементу управления).
Учтите, что Visual Basic не задает имя по умолчанию, как для других элементов
управления.
Правила
назначения имени
При назначении имен
элементам меню также нужно соблюдать правила. Имя должно состоять из следующих
частей: прежде всего, префикса, указывающего, что это меню, т.е. mnu; затем
следует: для пунктов главного меню — имя пункта, для подменю — сокращенные
имена родительских пунктов, а затем собственное имя меню. В таблице приводятся
некоторые примеры:
Таблица 3.8. Имена меню
Команда меню |
Имя |
file |
mnuFile |
.ile\Qpen... |
mnuFOpen |
.ile\Send\Eax |
mnuFSFax |
Последняя задача при создании меню — определение
уровней. Для этого вос пользуйтесь кнопками со стрелками. Кнопка со стрелкой
вправо смещает элемент меню на уровень ниже, а со стрелкой влево — на уровень
выше. Кнопки с вертикальными стрелками изменяют позицию отдельных элементов
меню, т.е. перемещают их в списке вверх или вниз.
Поле Shortcut позволяет определить комбинации клавиш
для быстрого доступа к отдельным элементам меню. Среди наиболее часто
используемых приложениями Windows комбинаций клавиш можно отметить следующие:
[Ctrl+X] (Cut), [Ctrl+C] (Copy), [Ctrl+V] (Paste).
Поля
WtadowList и Index будут рассмотрены позже.
Свойства Visible, Enabled, Checked
В последней строке
верхней половины окна редактора меню есть еще три свойства элементов меню.
Свойство visible позволяет отображать или скрывать отдельные элементы меню.
Свойство Enabled функционирует так же, как в других элементах управления: если
его значение False, то текст надписи подсвечивается серым цветом и пользователь
не может выполнить эту команду меню. Свойство Checked встречается в данной
книге впервые. Оно позволяет пометить выбранный элемент меню галочкой.
Свойства элементов
меню можно изменять и во время выполнения. При этом синтаксис такой же, как и
для других элементов управления:
mnuFLoad.Caption =
"&3агрузить" mnuFLoad.Enabled = False mnuFLoad.Visible = False mnuFLoad.Checked
= True
Для создания
процедуры выполнения команды меню следует во время проектирования выбрать
соответствующий пункт в форме. При этом создастся процедура обработки события
click. Другие элементы меню можно найти и в списке объектов окна кода.
Private Sub mnuFLoad_Click ()
LoadSomething End Sub
Советы по работе с
элементами управления
Прежде чем перейти к
следующему разделу, где рассматриваются пользовательские элементы управления,
так называемые Custom Controls, мы предлагаем несколько советов и основных
методов работы с элементами управления.
Горячие клавиши
Горячие клавиши (hot
key) можно назначить почти всем элементам управления, имеющим свойство Caption.
Их можно определять в Caption путем добавления знака "&" перед
соответствующей буквой. Несмотря на то, что текстовое поле не имеет свойства
Caption, для него также можно определить горячую клавишу. Для этого нужно
добавить элемент управления Label перед текстовым окном и определить для него
горячую клавишу. Затем следует присвоить свойству Tablndex элемента управления
Label значение на единицу меньше, чем для такого же свойства текстового поля.
Свойство Tablndex
С помощью клавиши
[Tab] в Windows можно передавать фокус от одного элемента другому. Свойство
Tablndex элемента управления устанавливает последовательность перехода при
нажатии клавиши [Tab]. Значение индекса 0 присваивается свойству Tablndex
элемента управления, который помещается в форму первым. Visual Basic
автоматически увеличивает это свойство. Это значит, что каждый новый элемент
управления формы получает значение свойства Tablndex на единицу больше, чем у
предыдущего элемента управления. Если вас не устраивает предложенная
последовательность перехода, ее можно изменить с помощью свойства Tablndex. При
этом Visual Basic автоматически изменит значения индексов остальных элементов
управления. Если установить значение свойства TabStop элемента управления
равным False, то передать ему фокус посредством клавиши [Tab] будет невозможно.
Элементы управления Windows 95
Специально для
Windows 95 в Visual Basic 5.0 были включены новые элементы управления
(Microsoft Windows Common Controls). B Visual Basic 6.0 их количество
значительно увеличилось.
Таблица 3.9. Элементы управления Windows
Элемент управления |
Назначение |
Animation |
Элемент отображения анимации.
|
CoolBar |
Используется для создания
конфигурируемых пользователем |
|
панелей элементов (аналогично
Microsoft Internet Explorer). |
DTPicker |
Представляет собой комбинацию
текстового поля и календаря, с |
|
помощью которого пользователь
может легко вводить дату и |
FlatScrollBar |
Плоская версия полосы
прокрутки. |
ImageCombo |
Подобен элементу управления
ComboBox с одним |
|
преимуществом: вы можете
добавлять графические |
Элемент управления |
Назначение |
ImageList |
Элемент хранения списков
графических изображении для других элементов управления. |
ListView |
Элемент для отображения списка
какихлибо элементов. |
MonthView |
Элемент управления,
позволяющий пользователю выбирать дату или последовательность дат с помощью
графического представления календаря. |
ProgressBar |
Элемент индикации процесса
выполнения длительных операции. |
Slider |
Скользящий указатель (слаидер)
или элемент установки значения из диапазона, |
StatusBar |
Панель состояния. |
TabStrip |
Элемент для отображения многостраничных
вкладок. |
ToolBar |
Панель инструментов. |
TreeView |
Элемент отображения
иерархических структур. |
Up Down |
Элемент изменения значений. |
ImageList
— набор изображении
imageList
— это элемент управления, который никогда не используется самостоятельно. Он
предоставляет другим элементам управления список графических образов. ImageList
невидим в форме во время выполнения программы. Он только предоставляет
информацию для других элементов управления и не имеет собственных событий.
Отдельные изображения ImageList просто используются другими элементами
управления.
Рис. ?.(S'. Свойства ImageList
Важнейшее свойство
imageList — это index, с помощью которого другие элементы управления выбирают
изображения из ImageList. При этом во вкладке свойств General нужно
установить размер изображения. Для определенных целей, например при просмотре с
использованием элемента управления ListView, предполагается неизменный размер
изображения.
В Visual Basic 6.0
этот элемент управления теперь поддерживает форматы *.GIF, *JPG и *CUR.
ToolBar — панель инструментов
Панель инструментов
(ToolBar) есть в каждом приложении Windows. Ее
можно было
использовать уже в Visual Basic 3.0, но это было достаточно
сложно. Начиная с
версии 4.0, Visual Basic предоставляет элемент
управления
для создания панели инструментов — ToolBar. ToolBar — это панель с различными
кнопками, свойства которых определяются разработчиком.
Важнейшее значение
при этом имеет свойство Key, используемое для определения выбранной
пользователем кнопки.
Для анализа выбора
кнопки обрабатывается событие Buttonciick. Процедуре обработки события
передается объект типа Button, идентифицирующий нажатую кнопку. Затем с помощью
свойства Key определяется, какая кнопка нажата.
Private Sub
Toolbarl_ButtonClick(ByVal Button As Button) If Button.Key = "tbLoad"
Then MsgBox "Теперь загружается" End If End Sub
Кнопки панели
инструментов можно оформить графическими изображениями, для чего используется
элемент управления ImageList.
Новые возможности
В Visual Basic 6.0 возможности
элемента управления ImageList были расширены добавлением нового семейства
ButtonMenus. Это семейство содержит набор объектов ButtonMenu, каждый из
которых представляет собой элемент меню, появляющегося при нажатии на кнопку
(если такое меню было добавлено при разработке). Однако в этом случае значение
свойства Style такой кнопки должно быть равным tbrDropdown.
Новые свойства
Были добавлены также
и новые свойства. Вопервых, DisabledlmageList, которое содержит ссылку на
элемент управления ImageList, — набор графических изображений, используемых в
случае, если кнопка становится недоступной (disabled). Вовторых, свойство
HotImageList, которое подобно свойству DisabledlmageList, но дополнительно
содержит ссылку на список графических изображений, отображаемых при открытии
меню. Еще одно свойство — Style, определяющее стиль панели инструментов. И,
наконец, свойство TextAlignment, с помощью которого можно определить или задать
позицию вывода текста — под рисунком (tbrTextAlignBottom) ИЛИ справа ОТ него (tbrTextAlignRight).
Новые события
Событие
ButtonDropDown происходит после щелчка на стрелке (dropdown arrow) элемента
управления Button. Такая стрелка присутствует у элемента управления только
тогда, когда значение его свойства Style равно tbrDropdown. Событие
ButtonDropDown происходит до события ButtonMenuCiick и может быть использовано
для определения набора пунктов открывающегося меню (их добавления, удаления или
редактирования). Событие ButtonMenuCiick происходит после щелчка мышью на
объекте ButtonMenu.
StatusBar — панель состояния
Панель
состояния (StatusBar) — это тоже важный элемент, который должен быть в каждом
приложении Windows 95/98. Речь идет об узкой полосе внизу окна, отображающей
различную информацию, например дату, время и многое другое.
Рис. 3.10. Панель
состояния Word для Windows
Для
создания такой панели состояния в семействе Windows Common Controls имеется
элемент управления StatusBar.
Панель состояния
может содержать до 16 отдельных панелей, в которых отображается различная информация:
время, дата, число страниц и пр.
С помощью свойства
style можно установить вид панели состояния: она может быть простой или
состоящей из нескольких частей.
Таблица 3.10. Константы стиля панели
состояния Константа
Значение Вид панели
sbrNormal о Составная sbrSimple 1 Простая
текстовая
ртдельные части или
поля панели состояния описывают определяемые пользователем свойства. С их
помощью можно добавлять новые поля или изменять их содержимое.
Отдельные части
панели состояния обслуживаются семейством объектов panels. Во время выполнения
программы можно изменять ее содержимое, параметры выравнивания текста и
графики, оформление и т.д.
События панели
состояния имеют второстепенное значение, так как этот элемент обычно
используется только для отображения информации. Но он, конечно, может
обрабатывать события click и Dbiciick.
TabStrip — отображение вкладок
Еще один признак новых приложений Windows (и
особенно Windows 95/98) — диалоговые окна с вкладками, которые использует и
Visual Basic. Для создания такого диалогового окна в Visual Basic есть
специальный элемент управления — TabStrip. TabStrip содержит семейство объектов
Tab, но не является контейнером, поэтому для отображения в нем элементов
управления необходим элементконтейнер, например Frame.
Из рисунка видно, что
при проектировании TabStrip, имеющего несколько вкладок, в форме возникает
беспорядок.
При работе приложения
должен быть видимым только элементконтейнер активной вкладки. Поэтому
рекомендуется не только скрывать Frame, но и сдвигать их при проектировании, а
во время выполнения опять настраивать. Значительно упрощает обращение с Frame
создание из них массива элементов управления.
Для того чтобы
выполнить переключение между вкладками, лучше всего воспользоваться свойством
Index свойства Selectedltem при обработке события Click.
Свойство
Selectedltem. Index содержит индекс выбранной вкладки, восполь зовавшись
которым можно отобразить соответствующий Frame:
'Переменная для
запоминания старого индекса Dim mOldIdx As Integer
Private
Sub TabStripl_Click()
If mOldIdx = TabStripl.Selectedltem.Index
Then
Exit Sub 'вкладка не изменяется! End If
'Новый Frame становится видимым и
позиционируется, 'а
старый скрывается
myFrame(TabStripl.Selectedltem.Index).Visible = True myFrame(TabStripl.Selectedltem.Index).Top
= 600 myFrame(TabStripl.Selectedltem.Index).Left = 240 myFrame(mOldIdx).Visible
= False mOldIdx •= TabStripl.Selectedltem.Index End Sub
Новые
возможности
В Visual Basic 6.0 к этому элементу
управления добавлены новые свойства, методы и события. Новое свойство
CausesValidation определяет, должно ли происходить событие Validate для
элемента управления при потере им фокуса. Обрабатывая это событие, вы можете
предотвратить потерю фокуса элементом управления, пока не будут выполнены определенные
условия, например пока пользователь не введет корректную дату.
Свойство HighLighted позволяет задать или
определить, будет ли объект Tab (вкладка) выделяться при отображении. С помощью
свойства HotTracking можно управлять поведением строки заголовка каждой
вкладки. Если свойству присвоить значение True, то при прохождении курсора мыши
над заголовком вкладки он будет подсвечиваться.
Если значение
свойства MultiSeiect установить равным True, то пользователь сможет выбрать
несколько вкладок одновременно (для этого значение свойства Style элемента
управления TabStrip должно быть равным True).
Свойство placement позволяет
определить положение вкладок по отношению к элементу управления: над элементом (tabPlacementTop),
под ним (tabPlacementBottom), справа от него (tabPlacementRight)
или слева (tabPlacementLeft).
С помощью свойства
Separators можно задать, следует ли отображать разделители (separators) между
кнопками (если для элемента управления TabStrip задан СТИЛЬ tabButtons ИЛИ
tabFlatButton).
Свойство TabMinWidth
позволяет узнать или задать минимально допустимую ширину вкладки. Это свойство
игнорируется, если значение свойства TabwidthStyle равно tabFixed.
С помощью свойства
TabStyle вы также можете управлять работой вкладок. Если значение этого
свойства равно tabTabOpposite и вкладки в окне расположены в несколько рядов,
то при выборе вкладки из одного ряда все вкладки из других рядов перемещаются
на противоположную сторону.
Метод DeselectAll
позволяет отменить множественный выбор (доступен только если значение свойства
MultiSeiect равно True).
ProgressBar —
отображение процесса выполнения операций
Индикатор или
ProgressBar можно найти во многих приложениях Win dows 95/98. Этот элемент
управления отображает, насколько продвинулся процесс копирования, перемещения,
загрузки или сохранения файлов.
Важнейшими свойствами являются Min (нижняя
граница). Мах (верхняя граница) и Value (текущее значение). Если необходимо
отображать процесс от 0 до 100%, то устанавливается Min = 0, Мах = 100 и затем для
Value — значение в данный момент.
Определение значения
свойства value предоставляется разработчику, так как сам элемент управления не
имеет возможности отслеживания продвижения процесса:
'Пример
для загрузки нескольких файлов Sub LoadFiles () Progressi.Min = О Progress!.Max
= nFiles For i = 1 To nFiles Call LoadFile(i) Progress!.Value = i Next i End Sub
Так могло бы
выглядеть отображение прогресса при загрузке нескольких файлов, изображений и
т. п.
Новые возможности
Новое свойство Orientation позволяет
задать ориентацию этого элемента управления — вертикальную (ccOrientationVertical)
или горизонтальную (ccOrientationHorizontal), а свойство Scrolling
определяет способ отображения на экране процесса — непрерывный (ccScrollingSmooth)
или сегментарный (ccScrollingStandard). Метод Refresh позволяет
принудительно вызвать перерисовку элемента управления.
TreeView —
отображение иерархических структур
В Windows 95/98 очень
часто используется элемент управления TreeView. Такой способ отображения
иерархических структур применяется также и в Windows Explorer.
Каждый элемент дерева
представляет объект типа Моае. Для добавления нового элемента или ветви
используется метод Add:
Private Sub
Form_Load() Dim nodX As Node
Set nodX = TreeViewl.Nodes.Add(, ,
"R", "Правка", 6) Set nodX =
TreeViewl.Nodes.Add("R", tvwChild, _
"Cl", "Вход", 2) Set nodX =
TreeViewl.Nodes.Add("Cl", tvwChild, _
"C1C1", "от Майкла", 4) Set
nodX = TreeViewl.Nodes.Add("R", tvwChild, _
"СЗ", "Выход", 3) Set
nodX = TreeViewl.Nodes.Add("СЗ", tvwChild, _
"C4C1", "Тине", 5) End
Sub
В данном примере формируется дерево,
представленное на рис. 3.16.
TreeView.Nodes.Add(Relative,
Relationship, Key, Text, Image, _
Selectedlmage)
Таблица 3.11.
Параметры метода Add Параметр Что он обозначает
Relative Свойство
Index или Key существующего объекта
Relationnship Вид
отношения к указанному в Relative объекту
Key Уникальная
строкаидентификатор
Text Надпись
Image Графическое
изображение (индекс из imageList)
Selectedlmage
Графическое изображение выбранного объекта (индекс из ImageList)
Надпись отдельного
узла (Node) по умолчанию доступна для изменения. Для предотвращения этого можно
установить значение свойства Label Edit равным
1. В" результате
пользователь не сможет больше редактировать надпись.
Второй путь — это
обработка событий BeforeLabelEdit и AfterLabelEdit. BeforeLabelEdit вызывается до
изменения текста надписи, а AfterLabelEdit — после. Процедуре обработки
события AfterLabelEdit передаются два аргумента:
Cancel, определяющий возможность прекращения
редактирования, и NewString
— новое значение
надписи:
Private Sub
TreeViewl_AfterLabelEdit(Cancel As Integer,_ NewString As
String)
MsgBox NewString
& "Недействительное имя"
Cancel = True End Sub
В данном примере
предотвращается изменение названия после
редактирования.
Следующими полезными событиями могут быть Expand и
Collaps, вызываемые
при разворачивании и
сворачивании ветви. Аргумент Node содержит ссылку на соответствующую ветвь. . Событие
NodeClick — это аналог события Click, но для конкретной ветви, ссылка
на которую передается в процедуру обработки этого события.
Новые возможности
В Visual Basic 6.0
для данного элемента управления введено несколько новых . свойств. Если
свойству Checkboxes присвоить значение True, то ветви дерева будут отображаться
в виде флажков (CheckBox). Свойство FullRowSelect позволяет задать или прочесть
значение, определяющее полный выбор ветви. Свойство Scroll определяет, будут ли
отображаться полосы прокрутки, a SingleSel задает возможность разворачивания
ветви при ее выборе.
Новое событие
NodeChek, также введенное в Visual Basic 6.0, происходит при изменении
состояния ветви (отмечена/не отмечена), если значение свойства Checkboxes равно
True.
ListView — просмотр
списков
С
элементом управления TreeView часто используется элемент управления ListView,
тоже предназначенный для просмотра списков, но без иерархиче ской структуры
(рис. 3.17). Элемент управления ListView может отображать
элементы в виде
пиктограмм (маленьких и больших), списка или таблицы. Различные виды
отображения можно увидеть на примере Windows Explorer.
Каждый элемент списка
представляет собой объект типа Listltem и хранится в семействе Listltems.
Добавление элементов в семейство осуществляется с помощью метода семейства Add:
Listiterns.Add([Index],[Key],Text,[Icon],[Smalllcon])
Таблица 3. 12.
Параметры метода Add
Параметр Значение
Index |
Индекс добавляемого элемента |
Key |
Уникальная строкаидентификатор
|
Text |
Текст элемента списка |
Icon |
Индекс крупных пиктограмм в
ImageList |
Smalllcon |
Индекс мелких пиктограмм в
ImageList |
Каждый объект Listltem обладает свойством Subltems, в
котором хранятся дополнительные данные, но отображаются они только если
установлен режим отображения (свойство view) "Таблица". В этом случае
при просмотре информация представляется в нескольких столбцах, которые хранятся
в семействе columnHeaders. Добавление столбцов происходит с помощью метода Add:
ColumnHeaders.AdiH [Index] , [Key] ,
text, [width] , [alignment] )
Таблица 3.13. Параметры
метода Add |
Значение |
Index |
Индекс столбца в семействе |
Key |
Уникальная строкаидентификатор |
Text |
Текст заголовка столбца |
Width |
Ширина столбца |
Alignment |
Выравнивание текста в столбце
|
В качестве примера можно привести следующий код:
Private Sub Form_Load() Dim Col As ColumnHeader
Set Col = ListViewl.ColumnHeaders.Add(, ,
"Caption", _ ListViewl.Width / 3)
Set Col = ListViewl.ColumnHeaders.Add(, ,
"Name", _ ListViewl.Width / 3)
Next f Set Col ListViewl.ColumnHeaders.Add(, ,
"Visible", _ ListViewl.Width / 3)
ListViewl.Icons = ImageListI Dim f As Form Dim Insert
As Listltem For Each f In Forms
Set Insert =
ListViewl.Listltems.Add (, , f.Caption, 1) Insert.Subltems(l) •=
"f.Name" End Sub
В результате выполнения данной процедуры отображается
список всех загруженных форм с указанием их заглавий, имен и указанием,
является ли форма видимой (свойства Caption, Name и Visible).
Редактирование
надписей обрабатывается так же, как и для элемента управления TreeView — здесь
тоже есть свойство LabelEdit и события BeforeLabelEdit и
AfterLabelEdit. :•.. ,,•••
Для обработки событий
щелчка мыши, кроме события click, можно обрабатывать и события itemClick и
ColumnClick, наступающие при щелчке соответственно на отдельном элементе или
столбце.
Новые возможности
Новое семейство List
Sub I terns содержит объекты Li s t Sub I tern, которые представляют собой
подэлементы (subitem) элемента управления Listview и заменяют массив строк
Subltems, используемый в предыдущих версиях этого элемента управления.
С помощью свойства AllowColumnReorder
разработчик может разрешать или запрещать пользователю изменять порядок колонок
в списке с помощью мыши. Чтобы такая возможность существовала, необходимо
установить значение свойства равным True.
Свойство ColumnHeaderIcons содержит
ссылку на элемент управления ImageList, который обеспечивает рисунками
семейство ColumnHeaders.
Свойство FlatScrollBar определяет
внешний вид полос прокрутки — стандартный (False, по умолчанию) или
плоский (True).
Свойство uriciLines
определяет, будут ли отображаться линии сетки, если элемент управления ListView
отображается в виде отчета (Report view). По умолчанию присваивается значение
False и линии сетки не отображаются.
Свойство
HoverSelection позволяет определить поведение объекта Listltem при перемещении
по нему курсора мыши. Если значение свойства равно True, то при перемещении
курсора мыши по объекту ListView соответствующий объект Listltem будет
автоматически активизироваться.
Свойство picture
содержит графическое изображение, которое будет появляться в элементе
управления. Загрузить рисунок во время работы приложения можно с помощью
функции LoadPicture. Позиция рисунка в объекте задается значением свойства
PictureAlignment.
Порядок следования
объектов ColumnHeader можно задавать с помощью свойства Position этого объекта.
Его значение может быть любым целым числом в диапазоне от 1 до п, где n —
количество объектов ColumnHeader.
Фон текста для
объекта Listltem задается с помощью свойства TextBack ground. Если его значение
равно IvwTransparent, то фон будет прозрачным, а если IvwOpaque, то цвет фона
будет определяться значением свойства BackColor.
Событие ItemCheck, подобно
событию NodeCheck элемента управления TreeView, происходит при
изменении состояния элемента (отмечен/не отмечен), если элементы отображаются
в виде флажков.
Элемент управления ListView имеет
также новые свойства CausesValidation, Checkboxes, FullRowSelect,
HotTracking и новое событие Validate, которые были описаны ранее.
Slider — элемент
установки значения из диапазона
Slider — элемент
управления, также часто встречающийся в приложениях Windows 95/98. Он позволяет
выбрать дискретное значение или набор значений из определенного диапазона.
В принципе, этот
элемент функционирует аналогично ScrollBar. Он также имеет свойства Min, Max и
Value, которые устанавливают границы области значений и текущее значение.
Параметры изменения значения при перемещении в области значений определяют
свойства SmallChange И LargeChange.
В отличие от
ScrollBar, для этого элемента можно определить не только одно значение, но и
некоторый диапазон значений. Для этого следует воспользоваться
свойствами SelStart и SelLength. Но само
выделение диапазона должно выпол няться программно.
Новое свойство Text
позволяет задавать текст надписи, который будет отображаться при перемещении
ползунка. Позиция отображения этой надписи определяется значением свойства
TextPosition. Новым является также и событие Validate.
Элемент управления UpDown
Назначение
Элемент управления
UpDown также присутствует во многих приложениях Windows. Он используется для
установки различных значений.
Свойства
Важнейшее
преимущество этого элемента управления заключается в том, что он может
использоваться без написания кода — достаточно правильно определить его
свойства AutoBuddy, SyncBuddy,BuddyControl и BuddyProperty.
Buddy — это элемент
управления, значение которого меняет UpDown. Buddy можно установить с помощью
свойства BuddyControl или свойства AutoBuddy; при этом автоматически будет
использоваться элемент управления со свойством Tablndex на единицу меньшим, чем
у UpDown.
Свойство BuddyProperty указывает, какое
свойство элемента Buddy должно синхронизироваться со свойством Value элемента
UpDown. Для этого дополнительно устанавливается свойство SyncBuddy. Область
значений устанавливается с помощью. свойств Min, Max и Value.
Элемент управления
Animation
Назначение
Элемент управления
Animation предназначен прежде всего для отображения небольшой анимации в
диалоговом окне, как например, в Windows 95 при копировании файлов.
При этом могут
воспроизводиться только несжатые AVIфайлы без звука либо сжатые с
использованием технологии RunLength Encoding (RLE). Некоторые из файлов
инсталлируются в каталоге графики Visual Basic.
Методы
Важными являются
методы Open и Play, с помощью которых можно загружать и воспроизводить
видеофайлы.
Элементы управления
для работы с датами и временем
Для обработки
значений дат и времени в Visual Basic 6.0 добавлены два элемента управления —
DateTimePicker и MonthView.
Элемент управления MonthView
Элемент управления MonthView позволяет
пользователю выбирать дату или последовательность дат с помощью графического
представления Календаря. Свойства Day, Month и Year позволяют задавать или
считывать соответственно день, месяц и год. С помощью свойств MinDate и MaxDate
разработчик может офаничить диапазон дат, с которыми может работать
пользователь. Свойство MultiSelect определяет возможность выбора непрерывной
последовательности дат, а свойство MaxSelCount —'длину этой последовательности
в днях. Для считывания или установки начальной и конечной даты
последовательности предназначены свойства SelStart и SelEnd. Свойства
MonthColumns и MonthRows позволяют указать количество месяцев, которые будут
отображаться на экране (по горизонтали и по вертикали). Это позволяет
просматривать одновременно на экране календарь на несколько месяцев (но не
более 12). Этот элемент управления можно также связать с определенным полем
базы данных, для чего тоже предусмотрен набор свойств.
Среди событий этого
элемента управления выделим DateClick и DateDblclick, которые происходят после
соответственно одинарного или двойного щелчка на дате. Обрабатывая эти события
и используя свойство Value, разработчик имеет возможность определить значение
даты, выбранной пользователем.
Элемент управления DateTimePicker
Элемент управления
DateTimePicker выглядит, как поле со списком, и позволяет отображать дату и/или
время, а также вводить дату при помощи элемента управления MonthView. Этот
элемент управления может функционировать в двух режимах:
.
• режим ниспадающего календаря (по умолчанию) — позволяет
пользователювыбирать требуемую дату в календаре; , »
.
• режим форматирования времени — позволяет пользователю
выбирать поле в отображаемой дате (день, месяц, год, и т.п.) и изменять его
значение, нажимая кнопки на элементе управления UpDown, отображаемого в правой
части поля со списком. Среди свойств этого элемент управления отметим, кроме
свойств Day,
Month и year, также свойства Hour, Minute и
Second, содержащие значения часов, минут и секунд.
Важными являются
также свойства Format и CustomFormat, определяющие формат отображения значений
даты и времени. Свойство Format может принимать одно из следующих значений:
dtpLongDate (дата отображается в длинном формате), dtpShortDate (дата
отображается в кратком формате), dtpTime (формат времени) или dtpCustom
(пользовательский формат). Если значение свойства Format равно dtpCustom, то
при отображении Даты/времени используется пользовательский формат, определяемый
свойством CustomFormat.
Среди событий отметим,
вопервых, событие closeUp, происходящее после закрытия ниспадающего календаря.
Вовторых, событие change, происходящее при изменении содержимого элемента
управления. И, наконец, событие validate, обрабатывая которое, можно
предотвратить потерю элементом управления фокуса при вводе некорректного
значения пользователем.
Элемент управления
CootBar
Этот элемент
управления содержит семейство объектов Band и может быть использован для
создания конфигурируемых пользователем панелей элементов (аналогично Microsoft
Internet Explorer). Ссылку на это семейство содержит свойство Bands.
Элемент
управления FlatScrollBar
Элемент управления
FlatScrollBar функционирует аналогично обычному элементу управления ScrollBar
за исключением того, что он обеспечивает улучшенный интерфейс. Элемент
управления FlatScrollBar может отображаться в одном из трех видов, определяемых
значением свойства Аррегеапсе: как обычная трехмерная полоса прокрутки (fsb3D),
как двумерная плоская полоса прокрутки (fsbFlat) или как двумерная плоская
полоса прокрутки с ползунком, который становится трехмерным при прохождении над
ним указателя мыши (fsbTrack3D).
Заключение
В этой главе вы
познакомились в общих чертах почти со всеми основными элементами управления.
Некоторые из них, например элементы работы с базами данных, описываются в
отдельных главах.
Visual Basic не
является "неподвижной" системой и может в любое время расширяться
путем добавления новых элементов.