Logo    
Деловая газета CitCity.ru CITKIT.ru - все об Open Source Форумы Все публикации Учебный центр Курилка
CitForum    CITForum на CD    Подписка на новости портала Море(!) аналитической информации! :: CITFORUM.RU
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

22.05.2017

Google
WWW CITForum.ru
С Новым годом!
2004 г.

Подвижный VBA'стик в кислотной ActiveX-среде

Арсений Чеботарев, "Комиздат"

Обычно книги и статьи по VBA посвящены тому, что можно сделать на VBA, но для чего он совсем не предназначен. Так, например, у меня есть книга (на 800 страниц), посвященная, в основном, таким вещам, как системные вызовы и конструирование древовидных структур вручную. Это как раз то, чего нужно бы избегать,- если вы не пишете трояны, конечно.

В этом смысле данная статья - полная противоположность книгам такого рода, то есть мы займемся именно тем, для чего VBA предназначен: созданием и "оживлением" COM-объектов. Полученная программка будет полезна не только в качестве примера, но и практически - то есть ее можно использовать и даже, если повезет, продать.

Use Case с точки зрения программиста

Проиллюстрированная далее программа показывает, как VBA получает доступ, создает и управляет ActiveX-элементами за пределами иерархии классов Office. Создавать элементы управления не имеет особого смысла, если не обрабатывать специфические для них события. Поскольку ActiveX-элементы у нас будут создаваться динамически и их количество не будет даже предварительно известно, то и обработчики будут генерироваться динамически. Да и поведение наших "кнопок", хотя и будет выбираться из нескольких вариантов, но все-таки должно определяться в последний момент… Короче, если вы пробовали генерировать программы, начиная от LISP и prolog и заканчивая визардами в VS, то вы представляете, о чем речь.

Use Case с точки зрения пользователя и заказчика

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

Прежде чем начать работу, включите выполнение макросов: в Сервис> Макросы> Безопасность поставьте переключатель в положение Низкая.

Не страшно ли включать макросы в Office? Нет, не страшно. Проблема распадается на два случая. Если у вас стоит антивирус - то трояны в макросах "отдыхают" по-любому. Если же антивируса у вас нет - то и макровирусов вам тоже незачем бояться, у вас уже и так, наверное, полный диск другой живности.

Ко всему прочему, макровирусы не отличаются жестокостью, так что вы можете установить антивирус, но не включать его в режиме постоянного сканирования, а всего лишь раз в день запускать на сканирование. Дополнительно можно рекомендовать антивирусную защиту почты - пользуйтесь почтовым сервером, который применяет антивирусные сканеры, поскольку этот путь инфицирования сейчас наиболее распространен. (Из личного опыта: за 15 лет работы за клавиатурой я не потерял ни единого бита из-за вирусов - а всё только по причине собственной рассеянности и пьянства. Так что для меня вирусы - скорее легенда, чем реальная угроза.)

И последнее: никто не отменял резервного копирования и других методов backup'а, таких как хранение эталонной системы в формате Norton Ghost. Благо, CD-RW и прочие носители сейчас дешевле грибов.

Постановка задачи

Есть сборник вопросов в некоторой предметной области (в терминах экзаменаторов - банк данных). Вопросы разделены на несколько тем или групп - уровень деления 1, то есть у тем нет подтем. Все вопросы имеют свой "вес" от 50 до 100, вес определяет важность вопроса: 100 соответствует наиболее важным, а 50 - самым "проходным" вопросам. Каждому вопросу соответствует несколько (обычно 3-5) ответов. Каждый ответ тоже имеет свой "вес" от 100 до 0: 100 соответствует абсолютно правильным и полным ответам, 80 - частично правильным, 50 - не лишенным элементов истины и 0 - полностью неверным. Предполагается, что для каждого вопроса существует один и только один абсолютно правильный ответ. Для проведения экзамена из всего банка случайным образом выбирается определенное количество вопросов, их порядок меняется произвольным образом. При этом можно выбрать одну, несколько или все темы. Ответы также меняются местами. Предварительно выбранные вопросы кладутся в "конверт", который экзаменуемый вскрывает во время экзамена.

После ответов подсчитывается общий балл. Происходит это следующим образом: складываются все веса всех вопросов как максимальное число баллов, которое возможно набрать. Реально набранное число баллов определяется суммой Sum (Vx*Mx) - то есть веса вопросов на вес полученного ответа. Успеваемость экзамена вычисляется как процент набранных баллов от максимально возможных.

Дополнительные условия

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

  • программа должна работать на любых компьютерах, на которых запускается Windows, в том числе без CD и сети;
  • программа должна работать без инсталляции какого-либо ПО, системы управления базами данных, сети, интернета и так далее. Единственная предпосылка - наличие на компьютере Windows и Word. Это довольно строгое ограничение - но, тем не менее, жизненное: инсталляция (или проверка наличия) того же BDE или MS Access на 100-200 компьютерах может значительно откорректировать бюджет любого начинания;
  • вопросы должны изменяться самым простым и непосредственным образом, для этой операции не нужно проходить никакого инструктажа или обучения;
  • подготовленные "конверты" с вопросами должны иметь минимальную степень защиты от модификации, так чтобы экзаменуемый в присутствии экзаменатора не мог нечаянно или с минимальными усилиями изменить результаты в свою пользу. Безусловно, это не касается "людей от компьютера", которые в комфортных условиях и при наличии времени могут сломать и видоизменить все что угодно - подразумевается, что экзаменуемый находится в системе тестирования и не занимается хаком нашей программы.

Итак, отталкиваясь от всего перечисленного, начнем строить нашу тестовую систему. Первое, что приходится сделать, это выбрать Word как в качестве источника данных, так и в качестве среды выполнения. Такое решение - самое естественное, поскольку ни на какой другой рантайм мы не можем рассчитывать. Первой идеей было использовать текстовый режим и gcc+couses. Но редактирование текстовых файлов в dos-кодировке - это задача, с которой справится не каждый современный пользователь, и, как говорят, "текстовый режим выглядит не современно".

Первое последствие из выбора Word в качестве инструмента: наша база данных будет представлена обычным Word-документом определенного формата. В силу некоторых исторических причин формат текста был следующим:

&Вопросы для системного администратора

"100" Чем нужно зажимать сетевой джек:
"100" Специальным инструментом.
"50" Плоскогубцами.
"0" Зубами.
"0" А зачем его вообще зажимать?

"80" Что вы делали на Новый Год:
"0" Гулял с друзьями.
"100" Переставлял Линукс.

"100" Как у вас проложен сетевой кабель:
"50" В коробе.
"0" По полу.
"100" Мы давно перешли на WaveLAN.

То есть первая строка со значком & обозначает начало темы, потом идут группы строк, первая из которых - вопрос, а остальные - ответы. Строки предваряются весовыми коэффициентами: "важности" - для вопросов, и "степени верности" - для ответов. Согласитесь, что ввести и модифицировать такой файл может любой пользователь. Для представления банка данных создадим три тривиальных класса:

' class BLine
Public Weight As Integer
Public Value As String
Public ff As InlineShape
Public loc As Range
Public Sub Parse (s As String)
p1 = InStr (s, """")
p2 = InStr (p1 + 1, s, """")
If (p1 > 0) And (p2 > p1) Then
Weight = Val (Mid (s, p1 + 1, p2 - 1))
Value = Trim (Mid (s, p2 + 1))
Else
Weight = 0
Value = s
End If
End Sub

' class Question
Public Question As New BLine
Public Answers As New Collection 'Of BLine (s)

' class Theme
Public Title As String
Public Questions As New Collection 'Of Question (s)
Public Selected As Boolean

Как видите, вопрос - это собственно вопрос и коллекция ответов, а тема - это название темы и коллекция вопросов. Это похоже на представление списков в LISP - голова и хвост. Самый главный кирпич всей иерархии, класс BLline, включает в себя строку и ее вес, а также дополнительные поля, смысл которых прояснится позже. Тривиальный метод Perse принимает строку и преобразует ее в поля объекта - немудреный суржик перегрузки конструктора в C++.

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

Есть четыре возможности запустить макрос: по нажатию горячей клавиши, по нажатию кнопки на панели, по системному событию и явно через меню Макросы. Поскольку этот вопрос нас пока не занимает, то пусть наш процесс запускается по Ctrl+K - кнопки на панелях инструментов имеют свойство теряться, а сами панели - быть закрытыми шаловливыми конечностями пользователей.

С высоты птичьего полета выполняем такие вот действия:

  • инициализируем используемые структуры и получаем ссылки на необходимые системные (в смысле, Word) объекты;
  • строим иерархическое дерево Test - Theme (s) - Question (s) - Bline + Bline (s);
  • выводим список тем и количество вопросов в каждой - для выбора вопросов только по этим темам. Опуская сам процесс выбора и задействованное при этом диалоговое окно, можно только сказать, что после его закрытия поле Selected выбранных тем принимает значение TRUE;
  • после того как темы выбраны, все вопросы по всем темам сбрасываются в одну большую коллекцию и как следует тасуются. Поскольку объекты представляются ссылками, то новая коллекция содержит только ссылки, а не сами объекты;
  • формируется новый документ с отобранными вопросами в нужном количестве. Документ имеет несколько необычных свойств: он защищен на уровне защиты страницы, в нем отключена проверка правописания (для подавления ненужных визуальных эффектов) и в него внедрены ActiveX-элементы типа checkbox. К каждому элементу динамически прикрепляется обработчик. Задача обработчика - воспринимать ввод пользователя. Как только пользователь выбирает один ответ, другие варианты блокируются и сам вопрос подсвечивается определенным цветом - в зависимости от правильности ответа.

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

Обратите внимание на то, как мы динамически создаем OLE controls в слое документа (есть еще слой векторной графики с абсолютными координатами). Существует также два уровня доступа к OLE-элементу - фактически для каждого элемента создается мини-контейнер со своими собственными свойствами. Для доступа к настоящему OLE приходится обращаться на уровень ниже - к полю Object (это похоже на то, как MFC или Delphi инкапсулирует объекты Windows). К каждому элементу управления "приделывается" персональный и в общем случае ни на что не похожий обработчик - с помощью техники, знакомой конструкторам Wizard'ов и прочих RAD'ов.

Текст основной (а фактически - и единственной) функции приведен в листинге 1. Имя ее не имеет значения - главное, чтобы она вызывалась по Ctrl+K или другим известным способом.

Модуль Module1, экспортируемый из первичного документа и импортируемый в "билет" через файл. Небольшая обработка на предмет "а не закончились ли у нас вопросы?"; если да - то заполнение "протокола" (листинг 2).

Обработчики событий для формы выбора тем - приводится для полноты изложения листинг 3. Сама форма выглядит примерно так, как показано на рисунке.

Размещение рекламы — тел. +7 495 4119920, ICQ 232284597

Подписка на новости IT-портала CITForum.ru
(библиотека, CITKIT.ru, CitCity)

Новые публикации:

24 декабря

CITKIT.ru:

  • Новогодние поздравления
  • Сергей Кузнецов. Цикл Операционные системы: Ностальгия по будущему:

  • Алексей Федорчук. OpenSolaris 2008.11 Release

  • Сергей Голубев:

  • Евгений Чайкин aka StraNNik (Блогометки):

    17 декабря

  • С.Д.Кузнецов. Базы данных. Вводный курс

    10 декабря

    CITKIT.ru:

  • OpenSolaris 2008.11 Release

  • Альтернативные ОС: две грустные истории (С.Кузнецов)
  • Nokia N810 — доведение до ума
  • CitCity:

  • Платформа 2009: заоблачные перспективы Microsoft

    4 декабря

  • Лекция С.Д.Кузнецова Понятие модели данных. Обзор разновидностей моделей данных

    CITKIT.ru:

  • OpenSolaris 2008.11 Release. Первые впечатления

  • Linux vs FreeBSD: продолжим "Священные войны"?

  • Nokia N810 as is

  • Индульгенция для FOSS

  • Друзья СПО'2008

    26 ноября

  • Нечеткое сравнение коллекций: семантический и алгоритмический аспекты

    CitCity:

    CITKIT.ru:

  • Глава из книги А.Федорчука
    Сага о FreeBSD:
  • 19 ноября

  • Проблемы экономики производства крупных программных продуктов

  • Язык модификации данных формата XML функциональными методами

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    Заметки к книге:

  • FreeBSD: монтирование сменных устройств и механизм HAL
  • Текстовый редактор ee

    12 ноября

  • Правило пяти минут двадцать лет спустя, и как флэш-память изменяет правила (Гоц Грейф, перевод: Сергей Кузнецов)

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:
  • OSS в России: взгляд правоведа (В.Житомирский)

  • Новая статья из цикла С.Голубева "Железный марш":

    29 октября

  • О некоторых задачах обратной инженерии

  • Веб-сервисы и Ruby

  • Тестирование web-приложений с помощью Ruby

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

  • PuppyRus Linux - беседа с разработчиком (С.Голубев)

  • Сергей Кузнецов. Заметка не про Linux

    22 октября

  • Обзор методов описания встраиваемой аппаратуры и построения инструментария кросс-разработки

    CITKIT.ru:

  • Сергей Кузнецов. Почему я равнодушен к Linux

  • Глава из книги А.Федорчука
    Сага о FreeBSD:
  • Что надо иметь
    3. Базовые познания

    CitCity:

  • Управление IT-инфраструктурой на основе продуктов Microsoft

    15 октября

  • Методы бикластеризации для анализа интернет-данных

    CitCity:

  • Разъемы на ноутбуках: что они дают и зачем их так много?
  • AMD Puma и Intel Centrino 2: кто лучше?

    CITKIT.ru:

  • Новый цикл статей С.Голубева
    Железный марш:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    8 октября

  • Автоматизация тестирования web-приложений, основанных на скриптовых языках
  • Опыт применения технологии Azov для тестирования библиотеки Qt3

    Обзоры журнала Computer:

  • SOA с гарантией качества
  • Пикоджоуль ватт бережет
  • ICT и всемирное развитие

    CitCity:

  • Пиррова победа корпорации Microsoft

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    Статья из архива:

  • Я живу в FreeBSD (Вадим Колонцов)

    Новые Блогометки:

  • Перекройка шаблона Blogger или N шагов к настоящему
  • Blogger. Comment style
  • Screenie или глянцевый снимок экрана

    2 октября

    CITKIT.ru:

  • Сага о FreeBSD (А. Федорчук)

    Zenwalk: пакет недели

  • Банинг — интеллектуальное развлечение (С.Голубев)

    CitCity:

    25 сентября

  • Клермонтский отчет об исследованиях в области баз данных

    CITKIT.ru:

  • Пользователям просьба не беспокоиться... (В.Попов)

  • Снова про ZFS: диск хорошо, а два лучше
  • Командная оболочка tcsh (А.Федорчук)

    Zenwalk: пакет недели

    17 сентября

  • T2C: технология автоматизированной разработки тестов базовой функциональности программных интерфейсов
  • Технология Azov автоматизации массового создания тестов работоспособности

    CITKIT.ru:

  • FreeBSD: ZFS vs UFS, и обе-две — против всех (А.Федорчук)

    Zenwalk: пакет недели

  • Дачнет — практика без теории (С.Голубев)

    10 сентября

  • За чем следить и чем управлять при работе приложений с Oracle
  • Планировщик заданий в Oracle
    (В.Пржиялковский)

    CITKIT.ru:

  • Microsoft: ответный "боян" (С.Голубев)

  • Причуды симбиоза, или снова "сделай сам" (В.Попов)

  • Файловые системы современного Linux'а: последнее тестирование
  • Zsh. Введение и обзор возможностей
    (А.Федорчук)

    Описания пакетов Zenwalk: Zsh, Thunar, Thunar-bulk-rename, Xfce4-places-plugin, Xfce4-fsguard-plugin

    Блогометки:

  • Google Chrome
  • Лончер для ASUS Eee PC 701

    3 сентября

    CITKIT.ru:

  • Заметки о ядре (А.Федорчук):

    Добавлены описания пакетов Zenwalk: Galculator, Screenshot, Gnumeric, Pidgin

    В дискуссинном клубе:

  • И еще о Википедии и Google Knol

  • Лекция для начинающего линуксоида (С.Голубев)

    26 августа

  • Транзакционная память (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • Открыт новый проект Zenwalk: пакет недели

  • Статья Текстовые процессоры и их быстродействие: конец еще одной легенды?

    21 августа

    CITKIT.ru:

  • Почему школам следует использовать только свободные программы (Ричард Столлман)
  • Беседа Сергея Голубева с учителем В.В.Михайловым

  • Википедия или Гуглезнание? Приглашение к обсуждению (Алексей Федорчук)
  • Народная энциклопедия от Google (StraNNik)

  • Обзор Mandriva 2009.0 Beta 1 Thornicrofti
  • Новичок в Линукс: Оптимизируем Mandriva 2008.1

  • Книга Zenwalk. Приобщение к Linux:

    13 августа

    CitCity:

  • Мирный Atom на службе человеку. Обзор платы Intel D945GCLF с интегрированным процессором
  • Обзор процессоров Intel Atom 230 на ядре Diamondville

  • iPhone - год спустя. Скоро и в России?

    CITKIT.ru:

  • Интермедия 3.4. GRUB: установка и настройка (из книги Zenwalk. Приобщение к Linux)

    6 августа

  • СУБД с хранением данных по столбцами и по строкам: насколько они отличаются в действительности? (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • Интермедия 2.2. Что неплохо знать для начала (из книги Zenwalk. Приобщение к Linux)

  • И снова про шрифты в Иксах (А.Федорчук)

  • 20 самых быстрых и простых оконных менеджеров для Linux

  • Дело о трех миллиардах (С.Голубев)

    30 июля

  • OLTP в Зазеркалье (Пересказ: С. Кузнецов)

    CitCity:

  • Будущее BI в облаках?
  • Тиражные приложения и заказная разработка. Преимущества для заказчика
  • Дискуссия со сторонниками заказной разработки

    CITKIT.ru:

  • Новые главы книги Zenwalk. Приобщение к Linux:
  • Глава 8. Пакеты: средства установки, системы управления, системы построения
  • Глава 9. Zenwalk: репозитории, пакеты, методы установки

    23 июля

    CITKIT.ru:

  • Все против всех. 64 vs 32, Intel vs AMD, tmpfs vs ext3
  • Две головы от Intel

  • Zenwalk: обзор штатных приложений (глава из книги "Zenwalk. Приобщение к Linux")

  • Нормально, Григорий...

    16 июля

    Обзоры журнала Computer:

  • Перспективы и проблемы программной инженерии в XXI веке
  • Большие хлопоты с большими объемами данных
  • Перспективы наноэлектроники

    CITKIT.ru:

  • Интермедия о лицензиях (А.Федорчук. "Zenwalk. Приобщение к Linux")

  • Есть ли будущее у KDE?

  • Linux в школе: альтернативный вариант в задачах

  • Шифр (приключения агента Никодима)

    10 июля

    CITKIT.ru:

  • Новые разделы книги А. Федорчука Zenwalk. Приобщение к Linux:
  • Интермедия вступительная. Linux или GNU/Linux? Как вас теперь называть?
  • Глава 5. Среда Xfce
  • Глава 6. Xfce: приложения и плагины

  • ZUR (Zenwalk User Repository) FAQ

    2 июля

  • Персистентность данных в объектно-ориентированных приложениях (С. Кузнецов)

    CITKIT.ru:

  • Новые разделы книги А. Федорчука Zenwalk. Приобщение к Linux:
  • Интермедия 1.2. Дорога к Zenwalk'у. Период бури и натиска
  • Интермедия 3.3. Немного о Linux'е и "железе"
  • Глава 4. Настройка: инструментами и руками
  • Интермедия 4.1. Zenpanel и конфиги: поиски корреляции

  • Интервью с Жан-Филиппом Гийоменом, создателем дистрибутива Zenwalk

  • Linux в школе: первые итоги (С. Голубев)

    25 июня

    CITKIT.ru:

  • Zenwalk. Приобщение к Linux (А. Федорчук)

  • Логика и риторика (С.Голубев)

  • Технология Tru64 AdvFS

  • Ханс Райзер предлагает отвести полицейских к телу Нины

    18 июня

  • Проекты по управлению данными в Google (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • ОС и поддержка "железа": мифы и реальность (А. Федорчук)

  • Linux в школе: другие дистрибутивы

  • Пинок (С. Голубев)

    4 июня

  • Ландшафт области управления данными: аналитический обзор (С. Кузнецов)

    CITKIT.ru:

  • Linux в школе: слово заинтересованным лицам

  • SlackBuild: пакеты своими руками

  • Linux от компании Novell. Установка и обзор openSUSE Linux

    Все публикации >>>




  • IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы — тел. +7 495 4119920, ICQ 232284597 Пресс-релизы — pr@citcity.ru
    Послать комментарий
    Информация для авторов
    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2007 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...