Создание приложения «Календарь наших дел» в среде VB 6.0

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

Часть 1. Формирование прообраза приложения с использованием Мастеров

     I этап. Создание приложения с помощью Мастера Application

     II этап. Создание базы данных

     III этап. Создание формы для ввода данных с помощью Мастера DataForm

Часть 2. Доводка приложения до «профессионального» вида

     IV этап. Модернизация формы для ввода данных

     V этап. Использование элемента управления DataRepeater

     VI этап. Реализация логики окна «Контроль дел»

     VII этап. Связываем приложение воедино

     VIII этап. Решаем проблемы дистрибьюции

     Последний этап — стань Мастером!

 

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

Мы уже несколько раз рассматривали возможности новых версий Visual Basic на примере задач типа «создание первого приложения». В частности, в статье «Приложение на VB за пять минут. И даже за три!» (КомпьютерПресс 11’97, с. 129) в ходе разработки небольшого текстового редактора проводилось сравнение версий VB 4.0 и VB 5.0.

Сейчас мы хотим показать, что версия VB 6.0 резко расширила возможности разработчика — за те же несколько минут теперь можно создать гораздо более сложное приложение. Это достигается за счет не только появления новых Мастеров и элементов управления, но и значительного функционального расширения уже существовавших ранее средств (см. табл. 1.).

В этой статье мы продемонстрируем, как построить достаточно сложное приложение типа «будильник» или «календарь», предназначенное для хранения информации о некоторых временных событиях и для напоминания о моменте их наступления (рис. 1). Для этого нам понадобятся: усовершенствованные Мастера Application и Data Form, новые (DateTimePicker и DataRepeater) и уже знакомые (ADO Data и Timer) элементы управления, а также конструктор Visual Data Manager. Мастера будут использовать несколько уже известных, а теперь модернизированных элементов управления.

Но Мастера нам понадобятся только для создания прообраза приложения, описанного в первой части статьи. Для доводки программы до профессионального уровня, во второй части, нам придется «поработать руками», решая довольно интересные проблемы. Например, по ходу разработки проекта мы сделаем пользовательский элемент управления ActiveX, а в конце рассмотим непростые вопросы дистрибьюции нашей программы.

Замечание. Разработка проекта будет выполняться в несколько этапов. Обратите внимание, что каждый из них будет завершаться запуском созданного на этот момент варианта программы и проверкой работоспособности реализованных фрагментов. Если вы будете четко следовать приведенным ниже инструкциям, то, скорее всего, вы не встретите во время этих промежуточных запусков программы каких-либо проблем. И тем не менее: технология разработки программы требует поэтапного проведения отладки по мере создания отдельных компонентов проекта. Подход «сначала все кодируем, а потом все отлаживаем» — является принципиально неверным.

Часть 1. Формирование прообраза приложения с использованием Мастеров

I этап. Создание приложения с помощью Мастера Application

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

Шаг 1. Запустим VB 6.0 и в диалоговом окне New Project, содержащем список имеющихся Мастеров, выберем VB Application Wizard (рис. 2). Щелкнем OK. Теперь нам предстоит пройти последовательность диалоговых окон и ответить на содержащиеся в них вопросы. Как и во всех остальных Мастерах в VB 6.0, для перемещения между окнами мы будем пользоваться кнопками Back и Next.

Шаг 2. Окно Introduction (рис. 3) дает возможность выбрать ранее сохраненные установки из раскрывающегося списка Profile (такой возможности в Мастере VB 5.0 не было). Эти установки, предназначенные для дальнейшего использования, записываются на последнем шаге создания приложения. В нашем случае выберем None из списка Profile и пойдем дальше (Next).

Шаг 3. В окне Interface Type (рис. 4) вы можете выбрать необходимый вам интерфейс пользователя. Для нашего приложения установим переключатель SDI (Single-Document Interface — однодокументный интерфейс), а также заменим предлагаемое по умолчанию имя Project1 на Reminder и щелкнем кнопку Next.

Примечание. Отметим, что если бы мы создавали многооконный текстовый редактор, подобный тому, что представлен в статье «Приложение за три минуты в VB 5.0», то, ничего не меняя в окне Interface Type, можно было бы просто нажать кнопку Finish, приняв все последующие установки Мастера по умолчанию. И через 5 секунд (а не минут!) мы получили бы законченный редактор. Это обеспечивает модернизированный вариант Мастера в VB 6.0: он, в частности, сразу устанавливает окно RichTextBox, а самое главное  автоматически формирует почти весь необходимый программный код.

Шаг 4. Окно Menus (рис. 5) позволяет сформировать систему команд меню для создаваемого приложения. Здесь имеется гораздо больше возможностей по сравнению с VB 5.0: там можно было выбирать меню, не изменяя состава самих команд (что делалось потом с помощью редактора VB Menu Editor). К тому же в VB 6.0 гораздо больше предлагаемых меню и команд. Данное (и следующее) окно содержит кнопку Reset, которая дает возможность вернуться к предлагаемым по умолчанию установкам, — так что не бойтесь экспериментировать. Для нашего проекта выберите меню File, View и Help. Затем, выделив File, укажите команду Exit; выделив View, — команды Status Bar и Web Browser; наконец, выделив Help, — команду About.

Шаг 5. Окно Customize Toolbar (рис. 6) является новым для Мастера Application в VB 6.0 (в VB 5.0 формировалась панель инструментов стандартного вида). Оно обеспечивает поддержку технологии «перетащи и оставь», а также просмотр будущей панели инструментов в режиме реального времени. У вас даже появилась возможность выбрать сразу несколько элементов списка в левой части окна.

К сожалению, окно Customize Toolbar обладает двумя небольшими недостатками. Во-первых, если вы любите использовать большое количество кнопок в своем приложении, то вы заметите, что данное окно позволяет просматривать только две первые строки панели инструментов, хотя при запуске приложения она выводится целиком. Во-вторых, панель инструментов не синхронизирована с системой меню, созданной в окне Menus. В большинстве случаев вам хочется, чтобы кнопки панели инструментов соответствовали определенным командам меню, а для этого желательно наличие возможности перемещения вперед и назад между окнами Menus и Customize Toolbar.

В нашем же случае пойдем дальше, не создавая никакой панели инструментов, — стандартные команды нам не понадобятся, так как они в данном случае не используются, а пользовательские кнопки мы не будем создавать, чтобы не отвлекаться от главной цели разработки. Для очистки панели нажмите кнопку Move All Buttons to the Left (рис. 6).

Примечание. Важное новшество Мастера Application в VB 6.0 — автоматическое создание кода обработки для самых необходимых команд меню и кнопок панели инструментов, который ранее приходилось писать «руками». Именно это новшество позволило бы нам сделать «редактор за 10 секунд». К сожалению, в силу специфики нашей сегодняшней задачи, нам эти возможности почти не пригодятся (мало команд меню и нет панели инструментов). Читатели могут убедиться в справедливости наших слов, выполнив создание тестового редактора самостоятельно и сравнив его с решением в среде VB 5.0.

Вместе с тем нужно отметить, что такое формирование кода выполняется Мастером довольно странным образом. Например, для варианта MDI код команды File|Save формируется, а для варианта SDI (который проще в реализации) — нет.

Шаг 6. Теперь мы попадаем в окно Resources (рис. 7), где создается файл ресурсов, упрощающий распространение создаваемого продукта в различных языках и повышающий его производительность. Он хранится в памяти с помощью дополнения Resource Editor до тех пор, пока вы не сохраните проект. После этого RES-файл, относящийся к категории Related Documents, появится в списке файлов проекта. Сейчас нам эта возможность не понадобится, поэтому мы выберем переключатель No и перейдем к следующему окну.

Шаг 7. Окно Internet Connectivity (рис. 8) дает вам возможность указать URL-адрес для доступа к Internet, Intranet или Extranet. Выделите переключатель Yes и установите в поле адрес, который будет использоваться в вашем приложении по умолчанию, например http://visual.2000.ru, а затем щелкните кнопку Next. Обратите внимание, что, указав эту опцию, вы автоматически обеспечили подключение к приложению формы Web Browser и обращение к ней из меню главной формы Main.

Шаг 8. С помощью окна Standard Forms (рис. 9) вы можете подключить одну или несколько стандартных VB-форм к своему приложению. Установите флажок у формы Splash Screen, которая создает окно заставки, появляющееся при запуске проекта, а также у формы About Box, которая обычно выводит информацию о программе и ее авторах. Последнее окно также содержит полезную кнопку System Information, предоставляющую подробную информацию об операционной системе, в среде которой выполняется данное приложение. Кроме того, если у вас есть готовые шаблоны форм, их можно добавить к проекту, нажав кнопку Form Templates в этом окне.

Шаг 9. Теперь мы попадаем в окно Data Access Forms (рис. 10), где запускается Мастер Data Form. Однако, чтобы воспользоваться последним, необходимо иметь готовую базу данных. Создаваемое нами приложение Reminder использует базу данных Access (MDB), которую мы сделаем чуть позже. Сейчас же нужно просто запомнить, что Мастер Data Form можно запустить как в автономном режиме, так и ВНУТРИ Мастера Application.

Шаг 10. И, наконец, последнее окно — Finished (рис. 11), которое позволяет сохранить все установки, сделанные при прохождении Мастера Application, в одном файле, о чем мы говорили при описании окна Introduction. Щелкните на кнопке с изображением многоточия (...) и сохраните установки в файле Reminder.rwp. С помощью кнопки View Report можно создать краткий отчет и при желании записать его на диск. Теперь щелкните на кнопке Finish, и Мастер сохранит все ваши установки, а также создаст новый проект на их основе.

Шаг 11. После этого вы увидите диалоговое окно Application Created, объявляющее о том, что Мастер Application завершил свою работу. Щелкните OK для закрытия этого окна, а затем выберите команду Save Project из меню File в среде VB 6.0, чтобы сохранить свой новый проект. Удалите префикс frm в каждом имени файла, появляющемся в диалоговом окне Save File As. Таким образом вы сохраните 6 файлов: Browser.frm, About.frm, Splash.frm, Main.frm, Module1.bas и Reminder.vbp (рис. 12).

Все Мастера в VB 6.0 генерируют код, который часто содержит комментарии ToDo, указывающие на те места, где следует настроить код. Многие из комментариев сопровождаются оператором MsgBox, который НЕ содержит знака комментария. Поэтому если вы вручную не откорректируете полученный код, то ваши пользователи увидят окна сообщений, сгенерированные Мастерами, что было бы крайне нежелательно. Созданное нами сейчас приложение не содержит таких комментариев, поскольку все выбранные нами команды имеют готовый (очень простой) код.

Шаг 12. Проверим, что мы сделали к данному моменту, — запустим наш проект на выполнение. На мгновение мелькнет окно заставки, и сразу же покажется главная форма приложения. Пока она реализует всего четыре команды, с помощью которых можно, например, посмотреть окно About, а через него — информацию о системных ресурсах своего компьютера. (Правда, надо сказать, что эта информация показалась нам какой-то странной — по крайней мере скудной. Например, состав приложений системы почему-то ограничен пакетами Office 2000.). Но есть одна вполне законченная функция обращения к окну Web-браузера, с помощью которой наше приложение может автономно работать с Internet (рис. 13).

Сейчас мы осуществим единственную программную доработку проекта, чтобы окно заставки показывалось в течение более длительного промежутка времени, например 2 секунды. Для этого в подпрограмме Main модуля Module1 после строки rmSplash.Refresh напишем такой код:

Start = Timer
    Do
        DoEvents
    Loop While Timer < Start + 2

(Подробнее об управлении заставкой приложения см. «Совет 247» в КомпьютерПресс 2’2000.)

Сейчас самый подходящий момент, чтобы сразу модернизировать стандартную информацию на формах About и Splash на реальные сведения о программе и ее авторах, в том числе изменить состав элементов управления и их расположение по своему усмотрению. Кроме того, если вы собираетесь распространять эту программу среди широкого круга клиентов, полезно заменить все заголовки и названия меню на русские.

Совет. Если вы часто пользуетесь Мастером Application и после этого постоянно выполняете локализацию интерфейса, можно написать довольно простую утилиту, которая будет преобразовывать файлы форм, меняя английские термины на русские. Кроме того, такая утилита могла бы легко добавлять команды меню, которых нет в Мастере, а также добавлять, удалять или изменять элементы управления и пр. Короче говоря, несложно написать собственный Мастер с новыми функциями...

В начало

В начало

II этап. Создание базы данных

Для хранения записей-напоминаний нам нужно создать базу данных. Мы сейчас не будем заниматься изысками в области структуры БД (с точки зрения минимизации ее объема и универсальности применения), поэтому наша база данных будет состоять из одной таблицы с тремя полями: RemindTime — дата и время, когда должно произойти соответствующее им событие, RemindMemo — текст, напоминающий об этом событии, DeleteMe — отметка о необходимости удалить данную запись.

Для упрощения задачи будем считать, что все записи имеют уникальные параметры RemindTime (время напоминания). И это условие не противоречит реалиям — нельзя в один и тот же момент делать два разных дела. Кроме того, для хранения текста самой записи-напоминания будем использовать поле типа Memo. Это несколько снизит скорость работы с базой данных по сравнению с использованием текстового поля фиксированной длины, но на наших объемах данных (сколько записей может хранить один человек — сто, тысячу?) это будет совершенно незаметно. Взамен нам не придется ломать голову над тем, сколько места нужно отвести для записи — 100 или 500 байт.

Шаг 12. Для создания базы данных воспользуемся приложением Visual Data Manager или просто VisData (о работе с ним мы уже подробно писали в статье «Создание персональной адресной книги на VB 5.0» в КомпьютерПресс 7’98, с. 187). Запустим его с помощью команды Visual Data Manager из меню Add-Ins, а затем выберем команду File|New|Microsoft Access|Version 7.0 MDB. Назовем создаваемый файл Reminder.mdb и сохраним его в том же каталоге, где находится наш файл проекта Reminder.vbp.

Шаг 13. Щелкните правой кнопкой мыши внутри окна Database и выберите команду New Table из быстрого меню. Введите Reminder в поле текста Table Name и потом щелкните кнопку Add Field, чтобы добавить три поля: RemindTime, RemindMemo и DeleteMe. Задайте тип поля RemindTime как Date/Time, затем установите флажок Required и щелкните OK. Для поля RemindMemo задайте параметр Type как Memo, установите флажок AllowZeroLength (не устанавливая флажок Required) и щелкните OK. И, наконец, для DeleteMe задайте параметр Type как Boolean, используемое по умолчанию значение (DefaultValue) — как False, установите флажок Required и щелкните OK.

Теперь закройте диалоговое окно Add Field (Close) и щелкните кнопку Add Index для установки индекса. В поле Name введите имя индекса PrimaryKey, затем выберите поле RemindTime из списка Available Fields, и вы увидите, что поле RemindTime появилось в списке Indexed Fields. Установите флажки Primary и Unique и закройте это диалоговое окно. Сейчас структура нашей таблицы имеет такой вид, как показано на рис. 14. Щелкните кнопку Build the Table, и все — таблица Reminder создана!

Примечание. Если элемент управления ADO Data связан с DateTimePicker, а в соответствующем источнике данных не существует никаких записей, то при запуске приложения в VB 6.0 возникает ошибка, которая выводит сообщение Unable to bind to field or DataMember: «RemindTime».

Шаг 14. Чтобы избежать такой ситуации, добавьте одну запись к базе данных. Для этого дважды щелкните таблицу Reminder в окне Database, щелкните кнопку Add и введите, к примеру, 27.03.2050 10:00 в поле RemindTime и «Sample memo (do not delete)» в поле RemindMemo. (Такая «далекая» дата не позволит этой служебной записи появляться в будущем при работе с «просроченными» датами в нашем «будильнике». Конечно, мы не сомневаемся в ценности нашего приложения, но вряд ли оно прослужит нам до 2050 года...) Щелкните кнопку Update, а затем — Close. Теперь можно закрыть приложение VisData и вернуться в среду VB.

Примечание. В VisData 6.0 так же, как и в версии 5.0 (см. статью «Создание персональной адресной книги на VB 5.0» в КомпьютерПресс 7’98), существует проблема с вводом и просмотром русского текста (именно поэтому мы ввели английское название пустой записи). Во-первых, в процессе ввода не производится переключение на русскую раскладку клавиатуры, во-вторых — для просмотра данных используется нерусифицированный шрифт.

В начало

В начало

III этап. Создание формы для ввода данных с помощью Мастера DataForm

Шаг 15. Создадим форму для ввода данных при помощи Мастера DataForm. Мы могли бы воспользоваться им еще на этапе применения Мастера Application, но для этого нам нужно было сначала создать базу данных (тем самым поменяв местами этапы I и II). Сейчас же поступим следующим образом: добавим новую форму к проекту, используя команду Add Form из меню Project. На экран выведется диалоговое окно Add Form, в котором во вкладке New выберите значок VB Data Form Wizard и щелкните кнопку Open.

Примечание. В этих двух вариантах создания формы мы обнаружили одно отличие, которое, скорее всего, объясняется ошибкой в программе. В ходе дальнейшей работы, для того, чтобы подключить базу данных, мы будем применять механизм ADO/OLE DB, для чего потребуется ссылка на соответствующую библиотеку MS ActiveX Data Objects 2.x Library. При использовании автономного варианта создания формы с помощью команды Add Form такая ссылка устанавливается автоматически самим Мастером. Но при обращении к Data Form из Мастера Application эта ссылка не устанавливается: данную операцию придется выполнять вручную (Project|References), иначе при запуске программы будет выдаваться сообщение, что переменная ADODB не определена.

Шаг 16. Окно Introduction, аналогично соответствующему окну в Мастере Application, позволяет выбрать установки, сохраненные во время предыдущих сессий. Проигнорируем эту возможность и щелкнем кнопку Next.

В окне Database Type выводится список возможных типов баз данных. К сожалению, в VB 6.0 этот список ограничен только двумя позициями — Access и Remote (ODBC), тогда как в VB 5.0 он существенно шире и включает такие распространенные сегодня типы, как dBASE и Paradox. Выберем Access и перейдем к следующему окну.

Окно Database запрашивает путь и имя базы данных MDB, которую мы собираемся использовать. Щелкните кнопку Browse, чтобы перейти в каталог, где мы сохранили созданную на предыдущем этапе базу данных Reminder.mdb, и щелкните Open.

В следующем окне Form введите frmRemindersSet в качестве имени формы, выберите Single Record из окна списка Form Layout и установите переключатель ADO Data Control в рамке Binding Type (рис. 15). Аналогичное окно в VB 5.0, к сожалению, не содержит рамки Binding Type с флажками, из-за чего вы не можете задать там тип связывания формы с данными.

Окно Record Source (рис. 16) позволяет выбрать таблицу, которая будет служить в качестве источника записей для элемента управления ADO Data, заданного в предыдущем окне. Щелкните стрелку в раскрывающемся списке Record Source и выберите таблицу Reminder. В окне списка Available Fields появится перечень доступных полей, из которого выберите поле RemindTime, а затем щелкните кнопку с изображением направленной вправо одиночной стрелки, чтобы перенести поле в окно списка Selected Fields. Выполните аналогичную операцию для поля RemindMemo. Поле DeleteMe оставим на месте. Укажите в списке Column to Sort By поле RemindTime в качестве столбца для сортировки записей.

Теперь вы попадаете в окно Control Selection (рис. 17), где можете решить, какие стандартные кнопки для работы с базой данной следует поместить на форму. Щелкните кнопку Select All, чтобы установить все флажки, и двигайтесь дальше.

И наконец, последнее окно Finished дает вам возможность сохранить все выбранные установки в файле Profile. Введите Dataset в качестве имени такого файла, нажав сначала кнопку [...], чтобы выбрать также каталог, и щелкните кнопку Finish для завершения работы. Теперь у вас появилась форма Dataset, которую необходимо сохранить под названием Dataset.frm командой Save Dataset из меню File.

Шаг 17. Программный код, создаваемый Мастером DataForm, не содержит комментариев и окон сообщений типа ToDo, и поэтому его можно запускать на выполнение в том виде, какой есть. Это мы сейчас и сделаем, но для автономного тестирования формы Dataset требуется установить имя frmRemindersSet в списке Startup Objects в окне Project Properties|General (в дальнейшем для тестирования всего приложения нужно будет вернуть исходную установку — подпрограмму Main).

Запустим наш проект на выполнение, и мы увидим созданную форму, которая обеспечивает просмотр и редактирование (обновление, удаление, добавление записей) нашей таблицы Reminder (рис. 18). Пользуясь случаем, заменим английский текст начальной записи на русский (чего мы не могли сделать в VisData).

Обратите внимание, что в данном случае мы реализовали самый простой вариант диалогового интерфейса взаимодействия с базой данных в виде работы с отдельной записью. Но при желании этот интерфейс можно было бы сделать в виде таблицы, иерархической структуры и пр. (см. рис. 15).

В начало

В начало

Часть 2. Доводка приложения до «профессионального» вида

IV этап. Модернизация формы для ввода данных

Теперь приступим к «ручной» модернизации формы frmRemindersSet. Для начала изменим свойство Caption у формы на «Формирование памяток».

Шаг 18. Заменим поле текста RemindTime на новый дополнительный элемент управления DateTimePicker, который позволит выполнить ряд специфических операций с данным полем базы данных — датой и временем. В частности, он обеспечивает выбор даты с помощью календаря (рис. 19). DateTimePicker реализован в виде файла Mscomct2.ocx, и, чтобы добавить его, выберите команду Components из меню Project, установите флажок Microsoft Windows Common Controls-2 6.0 и щелкните OK. Тогда на панели инструментов VB 6.0 появится соответствующий значок с названием DTPicker.

Замечание. Панель инструментов ToolBox не имеет линейки вертикальной прокрутки, поэтому нельзя догадаться по ее внешнему виду, видите ли вы весь набор элементов управления или только его часть. Так что всегда выбирайте размер панели таким образом, чтобы явно видеть внизу пустую строку (рис. 20).

Раздвиньте форму вверх, на свободное место поместите элемент управления DateTimePicker и установите его свойство Name как dtpRemindTime. Теперь посмотрите, какие значения установлены для свойств DataSource и DataField у существующего поля текста RemindTime. Они равны datPrimaryRS и RemindTime соответственно. Установите такие же значения для соответствующих полей элемента управления dtpRemindTime.

По умолчанию DateTimePicker работает только с датой. Нам же нужно, чтобы приложение Reminder предоставляло возможность задавать время с точностью до минуты (секунды вряд ли понадобятся в реальной жизни). Создадим достаточно простую маску ввода для dtpRemindTime, установив его свойство CustomFormat как «dd/MM/yyy hh:mm». (Это очень странно, но, чтобы вывести четырехзначное обозначение года, в этом поле требуется указать три буквы «y».) Теперь, чтобы DateTimePicker использовал заданную нами маску ввода, установите свойство Format как 3-dtpCustom.

После этого удалите поле текста RemindTime, находящееся справа от одноименной метки, а на его место переместите элемент управления dtpRemindTime.

Шаг 17. Теперь немного автоматизируем операцию ввода даты пользователем. Для этого дважды щелкните элемент управления ADO Data, находящийся в нижней части формы, в окне кода найдите подпрограмму datPrimaryRS_WillChangeRecord, а в ней — оператор Case adRsnAddNew, после которого напишите следующее:

dtpRemindTime.Value = Format(Now(), “dd/mm/yyyy hh:mm:00”)

Данный код обеспечивает то, что dtpRemindTime всегда показывает текущую дату и время (отбрасывая секунды), когда пользователь добавляет новую запись-напоминание. Обратите внимание, что используемая здесь функция Format требует другого формата для даты и времени. Так, здесь требуется писать yyyy, чтобы выводилось четырехзначное значение года, в отличие от элемента управления DateTimePicker, где надо указывать yyy.

Шаг 18. Теперь преобразуем поле текста RemindMemo: установим свойство Name как txtRemindMemo и очистим свойство Index. Чтобы поле стало многострочным, установим MultiLine как True, а ScrollBars — как 2-Vertical. После этого увеличим высоту поля текста.

Шаг 19. И, наконец, последнее — измените свойства Caption оставшихся элементов управления, если хотите, чтобы ваши пользователи работали с русскоязычным приложением. После этого вы получаете уже готовое для использования окно ввода данных. Конечно же, здесь можно все изменить и расположить элементы управления на форме по своему усмотрению. Запустите форму frmRemindersSet на выполнение и убедитесь, что с ее помощью можно работать с базой данных. Кроме того, сейчас подходящий момент для ввода в базу данных нескольких записей о будущих делах (рис. 21). Введите не менее десятка таких записей с разными датами, чтобы потом можно было отладить процедуру их удаления.

В начало

В начало

V этап. Использование элемента управления DataRepeater

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

Вначале создадим пользовательский элемент управления ActiveX, который привяжем через ADO Data к источнику данных, а потом с помощью элемента управления DataRepeater (новинка!) повторим User-компонент необходимое число раз.

Шаг 20. Сохраните наш основной проект Reminder.vbp и создайте новый проект типа ActiveX Control. (Более подробно технология создания и отладки пользовательского элемента управления описана в статье «Как создать элементы управления в среде VB», КомпьютерПресс 6’97.)

Разместите на форме элементы управления Label, TextBox и CheckBox и установите их свойства Name как lblRemindTime, txtRemindMemo и chkDeleteMe соответственно. Задайте свойство MultiLine поля текста как True, а свойство ScrollBars — как 2-Vertical. Кроме того, установите свойство Caption флажка как «Удалить». Затем сгруппируйте эти элементы управления таким образом, чтобы между ними оставалось как можно меньше свободного пространства, поскольку создаваемый нами компонент ActiveX будет располагаться в нескольких строках сетки (рис. 22). Установите свойство Name элемента управления User как Memos, а затем выберите команду Properties из меню Project и установите Project Name как Rmemos.

Теперь напишем процедуры Property Let и Property Get для каждого элемента управления, а также включим вызовы метода PropertyChanged в событиях chkDeleteMe_Click и txtRemindMemo_Change (см. листинг 1).

Здесь нужно обратить внимание на один важный момент. Состояние флажка chkDeleteMe описывается целочисленной переменной, которая может иметь значение 0 или 1. В базе же данных Reminder для хранения этой информации зарезервировано поле типа Boolean, которое также может хранить два значения переменной: False или True. Но дело в том, что этим двум логическим переменным соответствуют целочисленные значения — 0 или -1. Таким образом, мы столкнулись с ситуацией несоответствия типов данных, и именно этим объясняется довольно замысловатый код в процедурах Property Let и Property Get для поля DeleteMe. В этом плане, наверное, было правильнее описать поле DeleteMe в базе данных тоже как целочисленное, чтобы не путаться в подобных преобразованиях.

Чтобы элементы управления, находящиеся в компоненте User, были связаны с источником данных, вызовите команду Procedure Attributes из меню Tools, а затем щелкните кнопку Advanced. Раскрывающийся список Names содержит имена всех элементов управления, входящих в компонент User. Выберите элемент управления RemindTime и установите флажки Property is data bound и Show in DataBindings collection at design time (рис. 23). Повторите то же самое для свойств RemindMemo и DeleteMe, после этого щелкните OK.

Сохраните элемент управления User и проект как Memos.ctl и Rmemos.vbp соответственно. Затем выберите из меню File команду Make Rmemos.ocx, которая создаст новый элемент управления ActiveX и зарегистрирует его в Регистре Windows под названием Rmemos.Memos (наш OCX-файл содержит один компонент).

Шаг 21. Откройте созданный нами ранее проект Reminder.vbp и добавьте к нему новую форму Form. Установите свойство Name формы как frmRemindersPopup, а свойство Caption — как «Контроль запланированных дел», BorderStyle — 2-Sizable, ControlBox — False и запишите форму на диск как Popup.frm.

Подключите элемент управления DataRepeater к своей панели инструментов (Microsoft DataRepeater Control 6.0 (OLEDB) в окне Components) и поместите его на свою форму.

Установите его размеры таким образом, чтобы внутри мог располагаться элемент управления Rmemos.ocx. В нижней части формы разместите элемент управления ADO Data (в панели инструментов он носит название ADODC). Установите для него свойство ConnectionString равным той же самой строке, которая используется для элемента управления ADO Data в форме frmReminderSet.

Задайте свойство RecordSource как Select * from Reminder Order By RemindTime Desc (данный SQL-оператор запрашивает записи-памятки в порядке их появления на экране — от самой последней до самой ранней). Кроме того, для события Adodc1_MoveComplete введите такую строку кода:

Adodc1.Caption = “Запись: “ & _
        CStr(Adodc1.Recordset.AbsolutePosition)

Щелкните элемент управления DataRepeater и установите его свойство Caption как «Что делать», а DataSource — как Adodc1. Щелкните свойство RepeatedControlName, чтобы раскрыть список имеющихся элементов управления, и выберите из них компонент Rmemos.Memos, который мы только что создали. После этого вы должны увидеть его внутри DataRepeater.

Шаг 22. Чтобы связать Rmemos.Memos с источником ADO-данных, щелкните правой кнопкой мыши элемент управления DataRepeater и выберите команду Properties из «быстрого» меню. Щелкните вкладку RepeaterBindings и раскройте список PropertyName. Выделите RemindTime, а затем в раскрывающемся списке DataField выберите поле базы данных, с которым это свойство связано, — для нашего приложения это поле RemindTime. Щелкните кнопку Add, чтобы добавить данную связь к сетке RepeaterBindings. Повторите эти шаги для свойств RemindMemo и DeleteMe (рис. 24). Затем щелкните вкладку Format и выделите свойство RemindTime (рис. 25). Установите для него Format Type как Custom, а Format String — как «c» (метод показа даты и времени с помощью одного символа). Для остальных полей оставьте значение Format Type как General. Щелкните OK.

Шаг 23. Установите теперь на время отладки имя формы frmRemindersPopup в списке Starup Objects окна Project Properties|General и запустите ее на выполнение. Убедитесь, что вы можете просматривать все записи, занесенные в базу данных, в порядке возрастания даты (рис. 26).

В начало

В начало

VI этап. Реализация логики окна «Контроль дел»

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

Логика работы данной формы должна выглядеть следующим образом. Открыв форму, пользователь может просмотреть записи-памятки, контрольное время которых уже наступило. Здесь он имеет возможность отметить записи для последующего их удаления с контроля (удалить из базы данных). Далее пользователь либо закрывает форму, прекратив работу с ней, либо минимизирует ее размеры (поместив в виде кнопки на панель задач) и переводит ее в режим автоматического отслеживания наступления новых событий. Причем в последнем случае мы предусмотрели два варианта «спящего отслеживания событий».

Шаг 23. Сразу добавьте к форме все элементы управления, которые понадобятся в дальнейшем. Разместите на ней четыре командные кнопки и установите свойства Name и Caption первой из них как cmdClose и «Закрыть», второй — cmdSleep и «Спрятать», третьей — cmdSnooze и «Убрать на время», четвертой — cmdDeleteMe и «Удалить сделанное». Кроме того, поместите на форму элемент управления Timer (таймер) и установите его свойство Name как timReminders.

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

Private SnoozeTime As Date ‘ контрольное время разворота формы
Private UseSnooze As Boolean ‘ указатель режима “Убрать на время”
Private ReminderCount As Long ‘ число записей перед обновлением

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

Для этого в модуле формы создадим такую подпрограмму формирования необходимого набора данных:

Private Sub AdodcRefreshDate(MyDate As Date)
    ‘ формирование набора данных с записями на
    ‘ заданный момент времени ControlDate
    Dim SQL As String, TimeSql$
    ‘ этот вариант формирования литерала даты
    ‘ обеспечивает независимость от национальных
    ‘ установок конкретной системы
    TimeSql$ = Format(MyDate, “MM.dd.yyyy HH:mm”)
    Mid(TimeSql$, 3) = “/”
    Mid(TimeSql$, 6) = “/”
    ‘
    SQL = “Select * from Reminder Where RemindTime <= #” & _
        TimeSql$ & “#” & “ Order By RemindTime Desc”
    Adodc1.RecordSource = SQL
    Adodc1.Refresh
    ‘
    ‘ обновляем заголовок списка
    Me.Caption = “Контроль срочных дел: число записей = “ & _
        Adodc1.Recordset.RecordCount & “ на “ & MyDate
End Sub

При загрузке формы нужно выполнить следующие операции инициализации:

Private Sub Form_Load()
    ‘ формирование списка записей-памяток на заданное время
    Call AdodcRefreshDate(Now)
    ‘ фиксируем текущее число записей в списке
    ReminderCount = Adodc1.Recordset.RecordCount
    ‘
    ‘ устанавливаем период опроса обновлений
    timReminders.Interval = 60000 ‘ одна минута
    ‘ запустить таймер
    timReminders.Enabled = True
End Sub

Анализ появления новой информации будет проводиться по таймеру; для этого следует написать такую процедуру:

Private Sub timReminders_Timer()
    ‘ обновление списка
    Call AdodcRefreshDate(Now())
    ‘
    If Adodc1.Recordset.RecordCount > ReminderCount Then
        ‘ появились новые записи в списке
        MsgBox “Появились новые записи!”, , _
            “Этим нужно срочно заняться!”
        ‘ фиксируем текущее число записей в списке
        ReminderCount = Adodc1.Recordset.RecordCount
        If WindowState = vbMinimized Then
            ‘ здесь можно вместо простого сообщения о новых записях
            ‘ задать вопрос о том, нужно ли открывать форму полностью
            WindowState = vbNormal ‘ раскрываем окно
        End If
    End If
End Sub

И, наконец, сформируем простую процедуру выключения формы:

Private Sub cmdClose_Click()
    ‘ запись в базу данных всех обновлений
    Adodc1.Recordset.UpdateBatch adAffectAll
    Unload Me ‘выгрузка формы
End Sub

Теперь, после загрузки формы, в ее списке появляются записи о делах, которые нужно выполнить на текущий момент. Этот список постоянно обновляется с периодичностью в 1 минуту, о чем выдается соответствующее сообщение. Запустите форму на выполнение и убедитесь, что все работает именно так.

Шаг 25. Реализуем еще одну функцию — удаление сделанных дел. Для этого для кнопки «Удалить сделанное» напишем такой код:

Private Sub cmdDeleteMe_Click()
    ‘ удаление всех записей, помеченных как “сделанные”
    Dim SQL As String
    Dim Conn As Connection
    ‘
    ‘ запись в базу данных всех обновлений
    Adodc1.Recordset.UpdateBatch adAffectAll
    ‘ операция удаления
    Set Conn = New Connection
    Conn.ConnectionString = Adodc1.ConnectionString
    Conn.Open
    SQL = “Delete from Reminder Where DeleteMe = True”
    Conn.Execute SQL
    Conn.Close
    ‘ обновление списка
    Call AdodcRefreshDate(Now)
End Sub

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

Шаг 26. Последние операции с формой — создание кода для кнопок «Спрятать» и «Убрать на время». Первая из них сворачивает форму frmRemindersPopup и помещает ее в виде кнопки на панель задач до тех пор, пока не наступит контрольное время следующей записи. Вторая делает то же самое, но дополнительно обеспечивает автоматическое «развертывание» окна спустя заданный интервал времени (для примера установим его равным 10 минутам). Разумеется, пользователь имеет возможность в любой момент развернуть окно, щелкнув мышью кнопку формы. Напишем такой код для обработки нажатия соответствующих кнопок:

Private Sub cmdSleep_Click()
    UseSnooze = False ‘ режим Sleep (спрятать)
    WindowState = vbMinimized ‘ сворачиваем форму
    Visible = True
End Sub
Private Sub cmdSnooze_Click()
    UseSnooze = True
    ‘ режим Snooze (свернуть на время)
    ‘ устанавливаем время возврата окна — через 10 минут
    SnoozeTime = DateAdd(“n”, 10, Now())
    WindowState = vbMinimized
    Visible = True
End Sub

Код, уже сформированный нами в процедуре обработки таймера timReminders_Timer(), вполне годится для обработки режима Sleep, а для режима Snooze перед последним оператором End If нужно добавить такой код:

Else ‘ новых записей нет, но, может быть,
    ‘ истекло контрольное время режима Snooze?
    If UseSnooze Then ‘ режим Snooze
        If WindowState = vbMinimized Then
            ‘ окно закрыто
            If Adodc1.Recordset.RecordCount > 0 Then
                ‘ есть записи
                If Now >= SnoozeTime Then
                    ‘ время ожидания истекло
                    WindowState = vbNormal ‘ раскрываем окно
                End If
            End If
        End If
    End If

Шаг 27. Мы закончили формирование формы frmRemindersPopup. Запустите ее на выполнение и убедитесь, что все созданные нами функции работают надлежащим образом (рис. 27).

В начало

В начало

VII этап. Связываем приложение воедино

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

  1. модуль Module1 и формы frmMain, frmBrowser, frmAbout и frmSplash (единственная полезная функция такого приложения — доступ в Internet через простенький браузер — не имеет отношения к основной нашей задаче);
  2. форма frmRemindersSet, обеспечивающая полный набор функций по просмотру и редактированию базы данных Reminder.mdb;
  3. форма frmRemindersPopup, осуществляющая функции контроля за заданиями, которые занесены в базу данных Reminder.mdb, с помощью внешнего OCX-компонента Memos.

Шаг 28. Привязка двух последних форм к основному проекту очень легко реализуется через команды меню. Для этого вызовите редактор Menu Editor и вставьте новое меню между позициями «Просмотр» и «Справка», а затем установите Caption как «НашКалендарь», а Name — как mnuReminders. Добавьте к нему две команды с такими параметрами:

Запишите следующий код для обработки этих команд:

Caption			Name 
ФормированиеКалендаря	mnuRemindersSet 
КонтрольНашихПланов	mnuRemindersPopup
Private Sub mnuRemindersPopup_Click()
    ‘ показывает форму для контроля
    ‘ за записями-памятками
    Load frmRemindersPopup
    frmRemindersPopup.Show
End Sub
Private Sub mnuRemindersSet_Click()
    ‘ показывает форму для ввода данных
    frmRemindersSet.Show vbModal
End Sub

Теперь установите (уже окончательно!) имя Sub Main в списке Startup Objects окна Project Properties|General и запустите наше приложение на выполнение. Убедитесь, что оно работает так, как и было задумано (рис. 28). После этого можно создать исполняемый модуль проекта Reminder.EXE.

В начало

В начало

VIII этап. Решаем проблемы дистрибьюции

Мы создали отличную программу, однако она страдает одним серьезным внутренним недостатком. Чтобы убедиться в этом, сохраните проект, переименуйте каталог, где он находится (точнее, где находится база данных Reminder.mdb), загрузите проект еще раз и запустите программу на выполнение. Вы увидите, что она не будет работать из-за двух появившихся проблем.

Проблема 1. При запуске выдается целая серия сообщений «не найден файл базы данных», что соответствует действительности.

Прежде чем перейти к решению этой проблемы, нужно обратить внимание на два очень важных момента:

  1. Жесткая привязка приложения к абсолютным адресам имен используемых файлов является принципиальной ошибкой. (Если только речь не идет о какой-то хитрости. Впрочем, от таких «хитростей» больше всех страдает сам разработчик.) Поэтому использование стандартных диалогов для формирования адресов при привязке программных компонентов к файлам (как это сделано на шаге 16) является допустимым только при начальном формировании программного кода. Крайне желательно сразу же заменять статическое определение адреса файла на динамический, программный вариант.
  2. Особую проблему представляет необходимость привязки двух или более компонентов к одному источнику данных (как это реализовано в нашем случае для элементов управления ADO Data в формах frmRemindersSet и frmRemindersPopup). Для этого необходимо использовать механизм, который бы автоматически гарантировал тождественность адресов в разных компонентах. В частности, простое копирование строк ConnectionString из окна свойств одного элемента управления в другое (см. шаг 21) не решает эту проблему, так как в последующем, возможно, мы решим изменить данное свойство и забудем сделать это для другого компонента. Вариант назначения адреса файла для второго компонента через диалоговое окно Open заключает в себе дополнительную опасность того, что пользователь может даже не заметить, что случайно выбрал другой файл (это довольно часто случается при отладке, когда существует несколько вариантов похожих баз данных с одинаковыми именами, но в разных каталогах).

Мы не выполнили эти два условия по ходу разработки программы только потому, чтобы сейчас обратить ваше внимание на эту проблему. Ее решение достаточно простое — нужно программным образом осуществлять привязку приложения к базе данных во время выполнения приложения.

Мы предлагаем следующий вариант: переменная MyConnectionString, которая хранит строку для связи с базой данный Reminder.mdb, будет описана как глобальная в модуле Module1.bas, и ее содержимое будет формироваться там же. Определение свойств элементов управления для связи с базой данных станет выполняться программно каждый раз при загрузке соответствующей формы.

Шаг 29. Принимая во внимание, что файл нашей базы данных находится в одном каталоге с проектом, мы должны добавить такой код в модуль Module1.bas:

Public MyConnectionString As String
Sub Main()
    ‘ Этот код можно включить в самое начало процедуры:
    ‘ описание строки соединения с базой данных
    MyConnectionString = _
        “Provider=Microsoft.Jet.OLEDB.3.51;” & _
        “Persist Security Info=False;” & _
        “Data Source=” & App.Path & “\Reminder.mdb”
    ...
End Sub

Шаг 30. Проблема программной привязки формы к источнику данных заключается в том, что здесь недостаточно провести замену только одного свойства ConnectionString у элемента управления ADO Data — нам необходимо откорректировать все свойства компонентов, связанные с этим источником данных. Для этого нужно поместить следующий код в процедуру Form_Load формы frmRemindersSet:

‘ программная настройка компонентов формы на
‘ связь с источником данных
With datPrimaryRS ‘ привязка ADO Data
    .ConnectionString = MyConnectionString
    .RecordSource = “Select RemindTime,” & _
        RemindMemo from Reminder Order by RemindTime”
End With
‘ привязка элемента DateTimePicker
Set dtpRemindTime.DataSource = datPrimaryRS
dtpRemindTime.DataField = “RemindTime”
‘ привязка TextBox
Set txtRemindMemo.DataSource = datPrimaryRS
txtRemindMemo.DataField = “RemindMemo”

Таким образом получается, что нам нужно продублировать установки, созданные с помощью оконного интерфейса в среде VB. Более того, для корректной работы формы необходимо очистить все установки данных свойств у соответствующих элементов управления в окне Properties Window. То есть требуется, чтобы в исходном состоянии поля ConnectionString и RecordSource для datRrimaryRS и поля DataSource и DataField для dtrRemindTime и txtREmindMemo были пустыми.

Для формы frmRemindersPopup поместите следующий код в самое начало процедуры Form_Load:

With Adodc1 ‘ элемент ADO Data
    .ConnectionString = MyConnectionString1
    .RecordSource = “Select * from Reminder _
        Order By RemindTime Desc”
End With
‘ привязка элемента DataRepeater
Set DataRepeater1.DataSource = Adodc1

При этом следует очистить все переопределяемые поля элементов управления. Но обратите внимание: в данном случае допускается использование установленных нами в диалоговом режиме параметров RepeaterBindings для элемента управления DataRepeater (см. шаг 22). Однако при желании эти установки можно также осуществить программным образом (предварительно очистив соответствующие параметры RepeaterBindings, см. рис. 22), для чего необходимо добавить следующий код:

DataRepeater1.RepeaterBindings.Add “RemindTime”, _
    “RemindTime”
DataRepeater1.RepeaterBindings.Add “RemindMemo”, _
    “RemindMemo”
DataRepeater1.RepeaterBindings.Add “DeleteMe”, _
    “DeleteMe”

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

Проблема 2. Пропала связь элемента управления DataRepeater с пользовательским компонентом Rmemos.OCX.

Действительно, даже при работе в среде VB вы увидите, что элемент управления заполнен простым серым полем, как это было в начальный момент его установки до привязки с используемым в нем компонентом. Причина этого понятна — связь с компонентом Rmemos.OCX осуществляется через его регистрацию в Реестре Windows. Мы изменили местоположение файла, и связь оказалась утерянной.

В данном случае можно только сожалеть, что VB не выдает никакой диагностики относительно того, что он не может обнаружить нужный ему компонент (как в случае с ошибкой в адресе источника данных). Мало того, разработчик может быть введен в заблуждение тем, что компонент Rmemos.Memos находится в списке зарегистрированных элементов управления в списке поля RepeatedControlName и, более того, — указан там в качестве актуальной связи (рис. 29).

Чтобы убедиться, что эта информация неверна, выполните следующие действия. Выберите для свойства RepeatedControlName какой-нибудь другой компонент, например RichTextBox. А затем попробуйте опять произвести связку с Rmemos.Memos — появится сообщение о невозможности выполнения данной операции.

Чтобы решить данную проблему, нужно провести перерегистрацию файла Rmemos.OCX. Это можно сделать двумя способами:

  1. В среде VB командой Project|Components откройте вкладку Controls окна Components и с помощью кнопки Browse добавьте файл Rmemos.OCX (этот файл, возможно, был в списке Controls и ранее, но его нужно «обновить»).
  2. В среде Windows эта операция осуществляется с помощью системной утилиты RegSrv32.exe, запускаемой из командной строки.

Также следует помнить, что регистрация ActixeX-компонентов выполняется автоматически при их компиляции и создании автономно исполняемого файла.

Совет. Отведите для хранения всех готовых ActiveX-компонентов, которые вы создаете сами или переписываете откуда-то автономно, отдельный каталог. Только не используйте для этого «мусорный ящик», называемый системным каталогом Windows, — создайте что-нибудь вроде C:/MyActiveXComponents. Перепишите туда саму утилиту RegSrv32.exe. Далее, переписывая в этот каталог новые ActiveX-компоненты (OCX и DLL), можно будет сразу выполнять их регистрацию:

RegSrv32.exe MyNew.OCX

Если вы хотите удалить ненужные компоненты, сначала отмените их регистрацию в Реестре:

RegSrv32.exe /i MyOld.OCX

и только потом физически удаляйте файл с диска. Помните, что только таким образом можно удалить ненужные компоненты из списка Components|Controls в среде VB.

В начало

В начало

Последний этап — стань Мастером!

Итак, подведем итоги:

  1. Вначале с помощью Application Wizard мы сформировали проект в составе пяти взаимосвязанных компонентов: модуля Module1 и формы frmMain, frmBrowser, frmAbout и frmSplash. (И проверили работоспособность этого приложения, хотя единственная его полезная функция — доступ в Internet через простенький браузер — не имеет отношения к основной нашей задаче.) Затем с помощью утилиты VisData мы создали базу данных Reminder (точнее — ее конфигурацию), а потом для работы с этой БД сделали форму frmReminders, используя Мастер DataForm.
  2. Далее мы начали писать программу «руками». Сначала была создана небольшая модернизация формы frmRemindersSet — мы заменили простое текстовое окно на более удобный для работы с датами вариант DateTimePicker. Мы проверили работу этого окна в автономном режиме, заполнив заодно нашу базу данных некоторым числом записей-напоминаний.
  3. Затем мы спроектировали окно frmRemindersPopup, предварительно создав пользовательский компонент Rmemos.OCX. В этом окне мы использовали новый полезный компонент DataRepeater для создания окна с прокруткой списка, строками которого являются визуальные элементы управления, связанные с базой данных. Написав программный код для этого окна, мы проверили его работоспособность, переводя в различные режимы ожидания и удаляя «выполненные дела».
  4. Связали все отдельные формы нашего приложения Reminders.vbp воедино, дописав всего две команды меню с очень простым кодом для главного меню.
  5. В завершение мы выполнили очень важную коррекцию приложения, реализовав динамическую привязку компонентов приложения к базе данных. Теперь его работоспособность никак не зависит от месторасположения на диске. Заодно вспомнили о том, как выполнять и отменять регистрацию ActiveX-компонентов.

Конечно, созданное нами приложение далеко от идеала. Для его практического применения понадобится провести еще много усовершенствований, например реализовать управление временем «спящего режима» или возможность выбора нужной базы данных во время работы.

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

Зачем же нужно изучать их работу? Оказывается не столько для того, чтобы воспользоваться их готовым кодом, сколько для лучшего понимания общей логики и конкретных технических приемов разработки. Короче говоря, чтобы самому стать МАСТЕРОМ.

КомпьютерПресс 5'2000