Средствами Visual Basic легко создать необходимое Windows-приложение.

Ее реализация на Visual Basic (VB) любой версии (даже 1.0 десятилетней давности) может выглядеть следующим образом:

  • запустить среду VB;
  • выбрать единственный пока компонент — форму нового проекта;
  • в появившемся окне в процедуре Form_Load ввести строку: MsgBox «Привет, мир!»;
  • запустить программу на выполнение.

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

Текстовый редактор

Рис. 1

Шаг 1. Выберите в среде VB новый проект Standard EXE (рис.1) и установите заголовок формы, например, как «Текстовый редактор». Для создания интерфейса текстового редактора понадобятся дополнительные элементы управления. Чтобы подключить их к панели инструментов, выберите команду Components из меню Project; в появившемся диалоговом окне Components отметьте флажком элементы Common Dialog Control, Rich Textbox Control и Windows Common Controls и щелкните OK.

Шаг 2. С помощью редактора Menu Editor (рис. 2) создайте стандартное меню «Файл» (имя компонента mnuFile) с командами «Создать» (mnuNew «горячие» клавиши +N), «Открыть» (mnuOpen +O), «Сохранить» (mnuSave +S), «Печать» (mnuPrint +P) и «Выход» (mnuExit +X), а также меню «Правка» (mnuEdit) с командами «Вырезать» (mnuCut +B), «Копировать» (mnuCopy +C), «Вставить» (mnuPaste +V), «Шрифт» (mnuFont), «Найти» (mnuFind +F) и «Следующее» (mnuNext ). Отдельные команды можно сгруппировать с помощью разделителей.

Рис. 2

Шаг 3. Поместите на форму элемент управления RichTextBox, на основе которого создадим собственное окно редактора текста. В отличие от простого TextBox этот элемент управления может также работать с форматированным текстом. Кроме того, c помощью методов LoadFile и SaveFile он читает и записывает не только TXT-, но и RTF-файлы. К тому же при работе с RichTextBox можно загружать данные просто методом перетаскивания.

Установите для RichTextBox свойство Scrollbars как Both, что обеспечит прокрутку текста в окне в горизонтальном и вертикальном направлениях. Однако следует иметь в виду, что горизонтальная линейка прокрутки появляется только в том случае, если правая граница текстовой строки находится за пределами окна, т. е. RightMargin>Width. Чтобы текстовое поле было автоматически привязано к форме при изменении ее размеров, напишите следующий текст в событийной процедуре Form_Resize:

Private Sub Form_Resize()
	Offset = 0 
	RichTextBox1.Height = Me.ScaleHeight — Offset
	RichTextBox1.Width = Me.ScaleWidth
	RichTextBox1.Top = Offset
	RichTextBox1.Left = 0
End Sub

Шаг 4. Для выбора имени файла при операциях открытия и записи понадобится элемент управления CommonDialog; поместите его на форму. Щелкнув правой клавишей мыши на изображении CommonDialog, выберите в меню команду Properties. В появившемся диалоговом окне во вкладке Open/Save установите два следующих поля:

DefaultExt = ?txt?
Filter = ?Текстовые файлы|*.txt|Форматированные _
	файлы|*.rtf|Все файлы|*.*?

Шаг 5. Напишем процедуру для выполнения операций, соответствующих командам меню. Начнем с меню «Файл» (см. листинг 1).

Теперь нужно прерваться и попробовать запустить наш проект, который уже обладает качествами простейшего текстового редактора: он позволяет создавать новый текст, корректировать старые файлы, а результаты работы записывать на диск. При этом можно пользоваться командами меню и «горячими» клавишами, а также механизмом перетаскивания. Однако мы на этом не остановимся и продолжим формирование программы.

Для выполнения команды Print напишем соответствующую процедуру (см. листинг 2).

Шаг 6. Займемся той частью программы, которая отвечает за выполнение команд из меню «Правка». Команды копирования используют свойство SelText текстового окна в сочетании с методами GetText и SetText объекта Clipboard (см. листинг 3).

Операции поиска также выполняются с помощью соответствующей процедуры (см. листинг 4).

Будьте внимательны: если не включена опция Option Explicit, то при тестировании, скорее всего, обнаружится, что команда «Следующий» не работает. Дело в том, что под именем sFind в обеих процедурах поиска будут созданы две разные локальные переменные. Если же Option Explicit была включена, то при запуске появится сообщение о неопределенных переменных и следует определить одну переменную Private sFind As String в секции Declarations модуля формы.

Теперь реализуем команду выбора шрифта (см. листинг 5).
Рис. 3

Проектирование меню может оказаться утомительным занятием, поскольку даже мастера создания приложений не освобождают от необходимости вводить процедуры обработки команд вручную. Чтобы сократить время разработки, следует использовать собственные шаблоны форм с заготовками. Для этого сначала создайте форму со стандартным набором меню: «Файл», «Правка», «Вид», «Справка» и пр. Введите текст программы, реализующей стандартные команды этих меню. После этого сохраните файлы FRM и FRX, например, в каталоге Visual BasicTemplateForms. Теперь всякий раз, когда понадобится форма со стандартным меню, пользуйтесь командой Add Form из меню Project и выбирайте форму, содержащую необходимое меню.

Вот и все — мы создали вполне сносный текстовый редактор (рис. 3). Возможно, в первый раз на это потребовалось минут 10-15, но со второй-третьей попытки вы легко уложитесь в обещанные пять.

Элемент управления ToolBar

Текстовый редактор — это, конечно, замечательно, но какая же современная Windows-программа может обойтись без панели инструментов, благодаря которой пользователи получают быстрый доступ к основным функциональным возможностям пакета без помощи меню? Разработчики, использующие VB, могут достаточно легко решить такую задачу благодаря элементам управления ToolBar и ImageList, входящим в состав расширенного набора компонентов профессиональной версии VB 6.0.

Особенностью структуры такого элемента, как ToolBar, является иерархическая объектная модель, поэтому он более сложен в применении, чем элементы управления RichTextBox и CommonDialog. ToolBar содержит коллекцию объектов Button со своими собственными свойствами и методами. Но изображения кнопок хранятся не внутри элемента управления ToolBar, а внутри коллекции ListImages элемента управления ImageList (видимо, чтобы программистам жизнь медом не казалась).

Шаг 7. Расположите элемент управления ToolВar между линейкой меню и текстовым окном. И сразу же в процедуре Form_Resize() замените строку:

Offset = 0

на:

If Toolbar1.Visible Then Offset = _
	Toolbar1.Height Else Offset = 0

Это позволит учесть наличие панели инструментов при автоматическом размещении текстового окна.

Рис. 4

Шаг 8. Поместите в любом месте формы элемент управления ImageList, он может располагаться так же, как и CommonDialog, поскольку не виден во время выполнения приложения. Щелкните на изображении компонента правой кнопкой мыши и выберите команду Properties из меню для вывода диалогового окна Property Pages. Перейдите во вкладку Images и нажмите кнопку Insert Picture. В папке BitmapsTlBr, находящейся в одном каталоге с VB, вы найдете большой набор изображений (bitmaps) для кнопок панели инструментов. Вставьте рисунки для кнопок «Создать», «Открыть», «Сохранить», «Печать», «Найти», «Выровнять влево», «Выровнять по центру» и «Выровнять вправо» (рис. 4)*.

Затем перейдите во вкладку Colors и измените значение свойства BackColor на системный цвет Menu Bar, а значение свойства MaskColor — на системный цвет Button Face. Если не произвести такую настройку цветов, то изображения на кнопках панели инструментов будут размыты и трудно различимы.

Шаг 9. Правой кнопкой мыши выберите компонент ToolВar; появится соответствующее диалоговое окно Property Pages. Во вкладке General измените свойство ImageList, чтобы связать панель инструментов со своим элементом управления ImageList1 (рис. 5).

Рис. 5

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

Чтобы добавить кнопку в процессе разработки программы, щелкните на Insert Button во вкладке Buttons диалогового окна Property Pages элемента управления ToolBar. Объекты Button могут содержать либо изображение, либо название, либо то и другое вместе. Наверное, не имеет смысла делать кнопки с названиями, поскольку каждая из них обладает свойством ToolTipText (строка-подсказка). Но обязательно установите свойство Key для каждого объекта Button таким образом, чтобы можно было идентифицировать кнопку, на которой щелкнул пользователь.

Разместите пять кнопок на своей панели инструментов и установите их свойства Key как New, Open, Save, Print и Find, а свойства ToolTipText — как «Создать», «Открыть», «Сохранить», «Печать» и «Найти». Свяжите эти кнопки с изображениями от одного до пяти элементов управления ImageList. Щелкните на кнопке Apply и вы увидите только что созданную вами панель инструментов. Кроме того, каждая панель инструментов имеет набор объектов Button, которые можно добавлять к ней в процессе выполнения приложения с помощью метода Add коллекции Buttons элемента управления ToolBar.

Шаг 10. Панель инструментов можно усовершенствовать, создав разделители между кнопками и объединив некоторые из них в группы. Для этого воспользуемся свойством Style объекта Button. (Применяемый по умолчанию стиль — это обычная кнопка, наподобие тех, что находятся на экране в тот момент, когда вы создаете это приложение.) Отделим кнопку «Печать» от трех кнопок «Создать», «Открыть» и «Сохранить», для чего поместим между ними еще одну кнопку со свойством tbrSeparator.

Чтобы сделать это, переместитесь к кнопке Save во вкладке Buttons, измените значение свойства Index на 3 и снова щелкните на Insert Button. Измените свойство Style на tbrSeparator и поместите кнопки-разделители между кнопками «Печать» и «Найти», а также после кнопки «Найти».

Кнопки можно объединять в группы со стилем tbrButtonGroup, каждая из которых окружена кнопками со стилем tbrSeparator. В любой момент пользователь может нажать только одну из таких кнопок. Например, для выравнивания текста.

Шаг 11. Поместите на панель инструментов еще три кнопки, а свойство Key для каждой из них установите как Left, Center и Right, свойство ToolTipText — как «Выровнять влево», «Выровнять по центру» и «Выровнять вправо» соответственно. После этого установите для них свойство Style как tbrButtonGroup. (Свойство Style для всех кнопок можно устанавливать как tbrPlaceholder, что позволяет добавлять другие элементы управления к панели инструментов.)

Панель инструментов

Рис. 6

Расположим на панели инструментов также элемент управления — комбинированное окно списка (ComboBox), благодаря чему пользователи будут иметь возможность задавать размер шрифта.

Поместим еще две кнопки на панель инструментов: для первой установим свойство Style как tbrSeparator, а для второй — как tbrPlaceholder. Зададим свойство Key последней кнопки как Combo1, а свойство Width — как 1000. Затем разместим там элемент управления ComboBox. И вот наконец наша панель инструментов приобретает такой вид, как показано на рис. 6.

Шаг 12. Напишем программу, которая заполняет комбинированное окно списка данными о размерах шрифта. Для этого в процедуре Form_Load введите дополнительный текст (см. листинг 6).

Чтобы элемент управления ComboBox всегда оставался в одном и том же месте на панели инструментов, добавьте следующий текст в событие Form_Resize:

With Combo1
		.Width = Toolbar1.Buttons(?combo1?).Width
		.Left = Toolbar1.Buttons(?combo1?).Left
		.Top = Toolbar1.Buttons(?combo1?).Top
	End With

Шаг 13. Перейдем к обработке щелчков мыши по панели инструментов. Это не составляет особого труда, поскольку у нас уже есть команды для большинства функций, включая такие, как «Создать», «Открыть» и «Сохранить». Вызовем соответствующие команды меню. Событие ButtonClick панели инструментов передает объект Button, выбранный пользователем, так что мы можем написать оператор Select для свойства Key кнопки (см. листинг 7).

Три новые строки (операторы Case «Left», Case «Center» и Case «Right») устанавливают свойство выравнивания элемента управления RichTextBox в соответствии с выбором пользователя. Данная часть программы изменяет выравнивание текущего абзаца или выделенного текста. Установив для каждой кнопки в событии SelChange элемента управления RichTextBox свойство Value, при перемещении курсора по тексту (или при выделении фрагмента) мы будем видеть на панели инструментов режим его выравнивания. Обратите внимание, что в операторе Case Else (см. листинг 8) все кнопки группы «отпускаются» (Unpressed), если выравнивание задано каким-либо иным способом помимо вариантов «влево», «по центру» или «вправо», как, например, при выделении двух фрагментов, выровненных по-разному.

Последняя строка в подпрограмме RichTextBox1_ SelChange использует свойство SelFontSize для вывода размера шрифта при просмотре текста.

Шаг 14. Изменить размер шрифта в выделенном фрагменте текста не составит никакого труда. Для этого просто установите свойство SelFontSize элемента управления RichTextBox как значение по умолчанию комбинированного окна списка и установите курсор на элемент управления RichTextBox:

Private Sub Combo1_Click()
	? Установка размера шрифта
	RichTextBox1.SelFontSize = Combo1
	RichTextBox1.SetFocus
End Sub
Рис. 7

Шаг 15. Теперь мы получили полнофункциональную панель инструментов для приложения. Запустите его на выполнение и убедитесь в этом сами (рис. 7).

Шаг 16. Одно из замечательных свойств, которым обладает элемент управления ToolBar, — это возможность настраивать панель инструментов, перемещая и убирая кнопки во время выполнения приложения. Если установить свойство AllowCustomize как True, то двойной щелчок мышью на панели инструментов выведет на экран диалоговое окно настройки, в котором пользователь может модифицировать созданную панель.

Кроме того, никто не мешает написать процедуру для события Change элемента управления ToolBar, в котором посредством метода SaveToolBar можно сохранить текущие установки панели инструментов в Регистре Windows, а затем с помощью метода RestoreToolBar загрузить их при следующем запуске приложения.

Мастера для создания приложений

В приведенном выше примере мы специально создавали все компоненты интерфейса вручную, чтобы продемонстрировать основы технологии. Однако для ускорения многих операций можно воспользоваться мастерами VB 6.0, которые автоматически создают базовые программные конструкции. Наиболее часто прибегают к услугам мастера Application Wizard, появившегося еще в VB 5.0 (в VB 6.0 список мастеров существенно расширился).

Рис. 8

Применим Application Wizard для создания текстового редактора и вызовем его двойным щелчком мыши в окне New Project (рис. 8).

Пройдя через несколько диалоговых окон, укажем нужные параметры будущего приложения (тип интерфейса, состав меню и кнопок панели инструментов, подключение дополнительных форм, режим взаимодействия с базой данных и пр.). Нажимая кнопку Next, вы принимаете все предлагаемые параметры по умолчанию. В последнем окне нажмите кнопку Finish, и мастер создаст заготовку приложения.

Полученная программа будет иметь интерфейс типа Multiple Document Interface (MDI), обеспечивающий режим многооконного текстового редактора. По окончании работы мастера вы обнаружите, что сформирован проект с именем Project1 (заменим его на более информативное, например MDInote), который имеет две формы (основную frmMain и дочернюю MDI frmDoc) и один модуль.

Запустив проект на выполнение, вы увидите симпатичное приложение с полным набором меню, панелью инструментов и строкой состояния, на которой показаны дата и время, а также MDI-дочерним окном с заголовком «Document 1».

Испробуйте этот многооконный текстовый редактор и вы убедитесь, что за 10 с мастер Application Wizard создал законченное, готовое к работе приложение. Действительно, он не только сформировал меню, панель инструментов и другие элементы интерфейса, но и написал текст программы для выполнения почти всех необходимых операций:

  • обработка большинства команд меню;
  • обеспечение связки кнопок панели инструментов с командами меню и с состоянием текстового окна редактора;
  • автоматическое управление размерами окон при изменении форм;
  • установка различных типов многооконного интерфейса (каскад, вертикальное и горизонтальное деление формы);
  • управление отдельными элементами оконного интерфейса.

Следует также обратить внимание на то, что мастер обозначил комментарием To Do («Сделать») места, где, возможно, потребуется дописать часть программы вручную, а нереализованные команды сопровождаются выводом сообщения MsgBox «Add ?mnuFileSaveAll_Click? code!» («Добавьте текст программы в процедуру обработки команды File|Save As!»).

Короче говоря, мастер выполнил почти все, на что мы потратили несколько минут очень тщательной работы в первой части статьи. Зачем же тогда так много говорить о программировании меню и панели инструментов? Не проще ли было сразу показать работу мастера? Отнюдь. Для разработки оригинального приложения все равно придется «работать руками». Например, в созданном мастером приложении нет команд поиска текста и управления шрифтами, которые мы использовали ранее. Да мало ли какие другие полезные операции нужно будет реализовать в вашем приложении! Не говоря уже о том, что, скорее всего, придется самостоятельно заменить все названия команд меню и подсказок с английского языка на русский.

Для упрощения последней операции можно написать довольно простую утилиту, преобразующую файл frmMain.frm: она заменит в нем английские термины на русские. Кроме того, такая утилита может легко добавить команды меню, которых нет в мастере (например, те же команды поиска текста или выбора шрифтов).

Интеграция с VBA

Конечно, сегодня трудно кого-либо удивить простым текстовым редактором, который мы создали (даже в двух вариантах — проекты TxtEdit. vbp и MDINote.vbp). А вот похвастаться возможностью функционально расширить откомпилированный исполняемый модуль за счет использования внутреннего макроязыка, могут только высококлассные профессионалы.

Хотите, чтобы в вашем приложении пользователь одним щелчком мыши открывал среду Visual Basic Applications (VBA), в которой можно было бы программировать так же, как в офисных пакетах Microsoft (Word, Excel и пр.)? Тогда сохраните созданные проекты — после получения ваших сигналов о готовности (присылайте свои соображения в редакцию по e-mail: argo@pcworld.ru) мы займемся их интеграцией с VBA. Это тоже не сложно — хватит 5-10 минут.


* Функцию «Выровнять по ширине», известную каждому пользователю Word, реализовать средствами VB не удается. — Прим. ред.


Создание панели инструментов для приложения

  1. Добавьте элемент управления ToolBar к форме.
  2. Поместите элемент управления ImageList на форму.
  3. Заполните коллекцию ListImages элемента управления ImageList рисунками, которые будут находиться на кнопках панели инструментов.
  4. Задайте свойство ImageList элемента управления ToolBar, чтобы связать панель инструментов с элементом управления ImageList.
  5. Создайте объекты Button для панели инструментов.
  6. Задайте свойства каждой кнопки так, чтобы связать их с соответствующими рисунками.
  7. Напишите процедуру, реализующую щелчки на кнопках панели инструментов.