Динамические эффекты

Предварительная подготовка

Эффекты форматирования

Графические объекты

Движение объектов

Ожившие графики

Другие варианты

Вентильные схемы

Автоматизация тестирования

Автоматизация оценки

Проект "Машина времени"

Игра "Жизнь"

Заполнение аттестатов

На главную

Проект «Машина времени»

Часть 1: Вечные календари без макросов

Часть 2: Дополнения к вечным календарям

Часть 3: Часы цифровые

Часть 4: Часы со стрелками  

Часть 4

 

Часы со стрелкамиЧасы перемещаемыеЧасы трансформируемые Итак…

Часы со стрелками

Воспользовавшись диаграммой, нам удалось заметно оживить ход времени в таймере и сделать его более наглядным. А ведь, несмотря на свою дешевизну, электронные часы не могут вытеснить давнишнее изобретение – часы с циферблатом и стрелками. Более того, многие из них, хоть и имеют числовую природу, рядятся под механические. Причина этого именно в обзорности и наглядности. Хотелось бы, чтобы и наши часы обрели такие качества. Но откуда взять стрелки в MS Excel и как заставить их вращаться?

Вспомним, что в приложениях Microsoft Office есть панель рисования, с помощью которой можно создавать не только множество типовых автофигур, но и свои собственные экземпляры, воспользовавшись в меню «Автофигуры – Линии» инструментами «Кривая», «Полилиния» или «Рисованная кривая». Впрочем, достаточно будет стандартных – равнобедренного треугольника, трапеции или тех же стрелок.

Однако, как нетрудно убедиться, центр вращения графических объектов в MS Office лежит в геометрическом центре габаритного прямоугольника, заключающего фигуру, что не годится для стрелки часов. На первый взгляд ситуация кажется безвыходной, но…

Рис. 16.
Заготовка
стрелки.

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

Создадим вертикальную стрелку, выбрав в меню «Автофигуры – Основные фигуры» примитив «Трапеция», которую развернем меньшим основанием вверх. Ниже нарисуем вертикальный отрезок. Выделим обе фигуры и через панель «Рисование – Выровнять/распределить» выберем «Выровнять по центру». Попробуем их сгруппировать. Если положение центра группы нас не удовлетворяет, выполним отмену и сдвинем отрезок немного вверх или вниз, после чего опять повторим группировку. Добившись ситуации, когда центр габаритного прямоугольника группы окажется немного выше большего основания трапеции, выделим отрезок и сделаем его прозрачным, выбрав «Цвет линий: Нет линий». Оставшиеся стрелки создадим аналогично или путем копирования и последующей трансформации только что созданной.

Отградуировать циферблат предлагаю следующим способом. Создадим короткий отрезок, равный длине минутного деления и его копию. Разнесем их в положения, соответствующие 12 и 6 часам, выровняем по центру и сгруппируем. Скопируем группу и, вставив, выберем в меню приложения «Формат – Объект…», где на вкладке «Размер» диалогового окна установим угол поворота равным 6°. Повторим операцию вставки и поворота еще три раза: для углов 12°, 18° и 24°. Вернемся к исходным делениям, которые будут соответствовать часам, поэтому сделаем их толще и длиннее. Все группы выделим, выровняем с помощью панели рисования по центру и посередине, а затем сгруппируем и скопируем. По аналогии с предыдущим случаем, выполним вставку группы с последующим поворотом на углы 30°, 60°, 90°, 120° и 150°. Снова выделим все группы и приведем их к единому центру.

Оцифровку лучше всего выполнить с привлечением панели WordArt, так как это позволит масштабировать наш циферблат. Перед завершением работы над циферблатом рекомендую произвести полную разгруппировку всех его компонентов, а затем объединить все элементы в единую группу. Это поможет избежать некоторых дальнейших проблем.

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

Рис. 17.
Часы простейшие.

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

Воспользуемся первым вариантом часов, где в диапазоне B4:B7 рабочего листа, были занесены формулы:

=ТДАТА()

=ЧАС(B4)

=МИНУТЫ(B4)

=СЕКУНДЫ(B4)

Привяжем секундную стрелку к ячейке B7, для чего, выделив ее, определим в поле «Имя» левой части строки формул номер группы, под которым она зарегистрирована в рабочей книге. Перейдя в редактор VBA, добавим в цикл процедуры Clock() следующую строку, сделав поправку на номер группы:

ActiveSheet.Shapes("Group 1").Rotation = Range("B7") * 6

Если все сделано правильно, то секундная стрелка вздрогнет и, перескочив в текущее положение, начнет ритмично отсчитывать время. Впору воскликнуть: «Ура, заработало!»

Подключим остальные стрелки, минутную:

ActiveSheet.Shapes("Group 4").Rotation = Range("B6") * 6 + Range("B7") \ 10

Затем часовую:

ActiveSheet.Shapes("Group 7").Rotation = Range("B5") * 30 + Range("B6") \ 2

Дело сделано.

Часы перемещаемые

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

Нас может выручить уже знакомая последовательность действий по центровке элементов часов. Записав ее в виде макроса и отредактировав, получим следующую процедуру:

Sub Сбор()

  With ActiveSheet.Shapes.Range(Array("Group 1", "Group 4", "Group 7", "Group 10"))

    .Align msoAlignCenters, False

    .Align msoAlignMiddles, False

  End With

End Sub

Подключим ее в подпрограмме Clock() оператором:

Call Сбор

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

Справедливости ради стоит отметить, что такая перемещаемость не отличается «послушаемостью». То есть смещение часов действительно происходит в сторону сдвига того или иного элемента, но в промежуточное положение, не соответствующее желаемому.

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

Рис. 18.
Часы перемещаемые.

Реализуя замысел, объявим в зоне «(General)» переменные для координат центра так, чтобы они были доступны в других макросах.

Dim x0, y0 As Single

В теле процедуры Clock() присвоением (это допустимо в VBA) введем следующие переменные:

сек_стрелка = "Group 1"

мин_стрелка = "Group 4"

час_стрелка = "Group 7"

стекло = "Oval 10"

циферблат = "Group 11"

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

t = Now()      'Определяем время

ts = Second(t) 'секунды

tm = Minute(t) 'минуты

th = Hour(t) Mod 12 'часы

Проверим состояние «крышки» часов:

With ActiveSheet.Shapes(стекло)

  x = .Left    'абсцисса

  y = .Top     'ордината

  w = .Width   'ширина

  h = .Height  'высота

End With

Вычислим текущие координаты центра и углы поворота секундной, минутной, а также часовой стрелок:

x0 = x + w / 2

y0 = y + h / 2

us = ts * 6

um = tm * 6 + ts \ 10

uh = th * 30 + tm \ 2

Смещение остальных узлов наших часов обеспечим вызовом процедуры Сдвиг(Объект, Угол):

Call Сдвиг(сек_стрелка, us)

Call Сдвиг(мин_стрелка, um)

Call Сдвиг(час_стрелка, uh)

Call Сдвиг(циферблат, 0)

Сама процедура будет иметь вид:

Sub Сдвиг(объект, ug)

  With ActiveSheet.Shapes(объект) 'Устанавливаем

    .Left = x0 - .Width / 2       'абсциссу

    .Top = y0 - .Height / 2       'ординату

    .Rotation = ug                'угол поворота

  End With

End Sub

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

Часы трансформируемые

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

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

Рис. 19. Часы перемещаемые и трансформируемые.

Преодолев все преграды, вы наверняка столкнетесь, если это уже ни произошло, с некоторыми непривычными эпизодическими явлениями, которых до сих пор в MS Excel вам наблюдать не доводилось. Связаны они с дополнительной, довольно значительной нагрузкой, создаваемой процедурой Clock(), работающей почти в режиме зацикливания.

Так может оказаться, что отдельные панели приложения неактивны. В этом случае перейдите на другой лист и вернитесь.

Если в Excel 2003 не появляются маркеры выделения, то для модификации остановите часы, трансформируйте их «стекло» и запустите снова.

В Excel 2007 окно приложения может не закрываться соответствующей кнопкой или часы не перемещаться мышкой. В первом случае можно остановить часы, воспользоваться аккордом Ctrl+F4 или контекстным меню на панели задач, а во втором – клавишами управления курсором.

Итак…

Вооружившись замечательным приложением Microsoft Excel, мы прошли большой путь, дерзко покоряя время. Перед нами открылись необъятные просторы от кратчайших мгновений до многих тысячелетий. Созданы реальные навигационные приборы для гипотетической машины времени, которые позволяют не заблудиться в путешествиях как в прошлое, так и в будущее.

Мне известно несколько реализаций вечных календарей в виде отдельных приложений. Есть в моей коллекции даже один созданный в MS Excel на основе макроса, доступ к коду которого закрыт паролем. Но все они или ограничены коротким диапазоном времени или начинают давать ошибки даже в пределах одного столетия. А вот календарей, созданных только на основе стандартных средств Excel или часов в электронных таблицах, тем более со стрелками, встречать не доводилось. Более того, еще год назад, столкнувшись с такими проблемами, я полагал, что это даже невозможно, и теперь с удовлетворением признаю, что я ошибался. Потенциал, заложенный в это приложение, поистине неисчерпаем.

Календарная часть модулей, несмотря на некоторые отличия представления даты в OpenOffice.org Calc и электронных таблицах IBM Lotus Symphony, работает и в них. Только в последнем придется ограничиться ручным вводом данных, так как в офисе от IBM не предусмотрен счетчик как элемент управления. Что касается часов, то язык для записи макросов OpenOffice.org Basic, встроенный в приложения с открытым кодом, имеет заметные отличия от Microsoft Visual Basic for Application. Так что в этом случае макросы придется переработать, используя те же идеи. Следует отметить, что, в отличие от проприетарного MS Excel, в open source приложениях существует возможность изменения положения центра вращения фигур, а также присутствуют такие элементы управления, как поле даты и поле времени, чем также не грех воспользоваться.

Представленные варианты исполнения модулей машины времени неидеальны, да и неполны. Они не содержат, например, возможности определения момента восхода, захода и долготы дня в зависимости от широты и времени года. Вне сферы внимания остались мусульманский лунный, китайский, еврейский и другие календари. Далек от идеала модуль с часовыми поясами. Не реализованы возможности регулировки часов на опережение или отставание. Не учитывается, что из-за уменьшения угловой скорости вращения Земли, продолжительность суток на временных промежутках в миллиарды лет заметно отличается. Пофантазировав, можно было бы предложить даже часы и календари для планет солнечной системы, например, для Марса, или Венеры, путешествия к которым – дело не столь отдаленного будущего.

Тем не менее, хочу выразить надежду, что предлагаемые разработки могут найти применение:

– в быту;

– в качестве наглядных пособий на уроках информатики, для демонстрации возможностей электронных таблиц;

– на уроках географии и астрономии;

– в исторических исследованиях и прогнозировании;

– в качестве элективного курса или его составляющей;

– во внеклассной работе при проведении соревнований и конкурсов;

– в самостоятельных проектах учащихся на факультативной или кружковой основе;

– в исследовании процессов реального времени;

– в дальнейших творческих замыслах.

И будут способствовать:

– развитию творческих способностей;

– глубокому освоению потенциала офисных приложений;

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

Файлы с работающими примерами можно загрузить с начальной страницы раздела "Проект «Машина времени»" этого сайта или с портала газеты «Информатика»: http://inf.1september.ru/download/time_09.rar. Модули и макросы, код которых доступен, снабжены подробными комментариями. Их содержательная часть может несколько отличаться от описанной в данной статье, но это не значит, что вам были предложены нерабочие варианты.

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


Источники

1. Ошибка високосного года в Microsoft Excel. «Информатика» № 21/2008.

2. Создание календаря в Microsoft Excel. «Информатика» № 18/2008.

3. Справочная система Microsoft Excel.

4. http://www.abc-people.com/event/crush.php.

5. http://www.astronet.ru/db/msg/1182321/node4.html.

На верх

 

Динамические эффекты Предварительная подготовка Эффекты форматирования Графические объекты
&Движение объектов Ожившие графики Другие варианты Вентильные схемы Автоматизация тестирования
Автоматизация оценки Проект "Машина времени" Игра "Жизнь" Заполнение аттестатов

© 2009 Государственное областное образовательное учреждение
"Россошанская школа-интернат для детей-сирот и детей, оставшихся без попечения родителей"