В начало
Статьи
Библиотека
Разное

Вот здесь - новый сайт, заходите немедленно!

kift - Коллекция Интересных Фактов и Теорий

А тут можно поболтать и побухтеть, милости просим:

kift - неизданное

Введение в программирование на примере VBA

Часть II. Создание макроса-приложения

Аннотация
Предисловие
Часть I. Макрос Word
     1. Проектирование и запись макроса
     2. Разбор макроса
     3. Внесение исправлений
     Итоги
Часть II. Макрос-приложение
     4. Проектирование
     5. Визуальное редактирование
     6. Запуск и остановка
     7. Вывод данных
     8. Выбор ответа
     9. Перемещение по списку
    10. Обратное перемещение
     11. Новая версия
     12. Реализация новой версии
     13. Завершение работы
     Итоги
Часть III. Объект на основе класса
     14. "Основное" приложение
     15. Компонент-таймер
     Итоги
Послесловие

Занятие 10. Обратное перемещение по списку вопросов

Это занятие посвящено продолжению написания кода и формированию минимально завершенного приложения.

Подцикл 6. Обратное движение по списку вопросов

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

Требования

Опишем требования к этому действию.

При нажатии на кнопку cmdPrev должен отображаться предыдущий вопрос и связанные с ним ответы. По достижении начала списка кнопка cmdPrev должна быть блокирована для предотвращения ошибочного перехода за границы набора.

Не правда ли, это требование очень напоминает то, что делалось нами применительно к кнопке cmdNext? За исключением того, что передвижение делается в обратном порядке, и немного по-другому обрабатывается ситуация достижения границы набора.

Проектирование
  • Давайте создадим схему последовательности действий, используя схему, сделанную нами ранее.

Как видите, здесь мы не делаем проверку, не на первом вопросе ли находимся.

Блокирование кнопки предотвратит выход за границы набора. Флаг fStart введен по аналогии с флагом fEnd, на всякий случай.

  • Составим «псевдокод» процедуры перехода назад.

<счетчик_вопросов> = <счетчик_вопросов> – 1

Если <счетчик_вопросов> = 1 То
     fStart = True

<чтение_вопроса> <счетчик_вопросов>

Все бы хорошо, но не забывайте о том, что при продвижении вперед был установлен флаг fEnd. Когда мы перейдем на предыдущий вопрос, этот флаг следует сбросить – ведь мы уже не в конце набора. Также надо будет изменить надпись на кнопке cmdNext.

Сброс флага достижения конца набора при обратном продвижении

  • Сделайте это:

  • Псевдокод примет вид:

<счетчик_вопросов> = <счетчик_вопросов> – 1
fEnd = False
cmdNext.Caption = captNext

Если <счетчик_вопросов> = 1 То
     fStart = True
     <блокирование кнопки cmdPrev>
<чтение_вопроса> <счетчик_вопросов>

Реализация
  • Теперь преобразуем псевдокод в нормальный код VBA, тем более что все недостающее у нас есть:

intCurrentRecord = intCurrentRecord – 1
fEnd = False
cmdNext.Caption = captNext

If intCurrentRecord = 1 Then
     fStart = True
     cmdPrev.Enabled = False
End If

RecordRead intCurrentRecord

В этом коде вам неизвестно еще свойство кнопки EnabledДоступность. Если это свойство сброшено – то есть равно False, то элемент управления становится «бледным» и какие-либо действия с ним невозможны. Установка свойства Enabled = True делает контрол доступным для работы, при этом он приобретает нормальный вид.

Очевидно, что созданный код следует поместить в обработчик события Click кнопки cmdPrev.

  • Сделайте это самостоятельно.
  • Не забудьте объявить новый флаг в начале модуля basShell:

Public fStart As Boolean

Отладка

Теперь можно попробовать сделать пробный запуск программы.

  • Не забудьте сохранить проект перед запуском.
  • Попробуйте передвигаться вперед-назад по списку вопросов.

Ошибка при достижении начала списка

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

  • Аналогично тому, как происходил сброс флага fEnd и изменение надписи на кнопке cmdNext, сделаем нужные действия – но уже в обработчике прямого движения по списку:

Private Sub cmdNext_Click()
If fEnd = True Then
Summary
Else
    fStart = False
cmdPrev.Enabled = True
    intCurrentRecord = intCurrentRecord + 1
RecordRead intCurrentRecord
If intCurrentRecord = intQuestions Then
fEnd = True
cmdNext.Caption = captFinish
End If
End If
End Sub

Казалось бы, разница в структуре обработчиков прямого и обратного движения – момент проверки достижения границы набора.

В обработчике прямого движения проверку достижения конца списка вопросов следует выполнять после чтения данных, а в обработчике обратного движениядо чтения данных.

Но в нашем случае это несущественно. Мы предусмотрели блокировку выхода за границы набора.

  • Сохраните проект и сделайте пробный запуск.

Если вы были внимательны – приложение работает как надо. Перемещение по списку вопросов происходит без ошибок.

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

На этом первый цикл разработки закончен.

Итог занятия

Это занятие получилось небольшим, не в пример предыдущему. Единственно новые сведения – о свойстве Enabled, присущем не только контролам CommandButton, но и большинству других.

Имеется большая группа свойств, характерных для всех – или почти всех элементов управления. К этой группе можно отнести, например, свойства:

  • Enabled,
  • Visible,
  • Font,
  • FontSize (иногда свойство Size относится к объекту Font вот так: Font.Size),
  • Height,
  • Width,
  • Top,
  • Left,
  • ForeColor,
  • BackColor,
  • Caption,
  • Text,
  • Picture,
  • Value.

За недостатком места и времени мы не будем подробно останавливаться на этих свойствах. Но вот вам задание-конспект (а как вы думали? Занятие-то маленькое!) – составьте конспект к каждому свойству из этого списка, вот в таком формате:

  • Название свойства, перевод названия.
  • Смысл свойства.
  • Тип значения (логический, целочисленный или другой – какой?...).
  • По возможности – пример применения.

Материал вы без труда найдете в справочной системе VBA. Ответ (с примером использования) должен занимать не более 4-5 строк для каждого свойства. Главное – понять смысл и научиться искать ответы.

Hosted by uCoz