Отслеживание даты в COREL DRAW, или GlobalMacroStorage и Metadata
Недавно создал любопытный макрос, не самый обычный. Суть его заключается в том, чтобы автоматически отслеживать дату у документов и менять её на актуальную. Для его создания потребовалось задействовать GlobalMacroStorage и Metadata.
Как вообще обычно работают макросы для COREL DRAW? Чаще всего они что-то создают по нажатию кнопки пользователем. То есть, например, выбирает параметры пользователь и макрос вжух и рисует какой-то фасад. Или же пользователь выбирает фигуру и макрос проставляет площадь. Да что я вам объясняю, если вы это читаете, то наверняка уже имели дело с корелом и имеете представление о расширениях для него.
В общем, это все стандартные функции и, как правило, если заказчик может мне все объяснить, то создать такую программу не вызывает сложности. Если, конечно, я могу эти объяснения передать компьютеру, заключить в строгие логические инструкции.
Так вот, недавний заказ с самого начала вызвал у меня сильный интерес. Суть работы была в том, что необходим был макрос, который при открытии документа автоматически бы менял дату. Для меня тут основное затруднение было в том: каким образом дать понять компьютеру, что вот именно эту дату надо менять? Давайте вообще декомпозируем задачу.
Первое. Как я уже писал выше, обычно все действия происходят по нажатию кнопки. В программировании это называется «обработка нажатия кнопки». Здесь кнопки у нас нет, необходимо привязаться к другому событию. К событию открытия документа. На самом деле это несложно.
У вашего созданного макроса есть секция с названием ThisMacroStorage.
В ней есть раздел с событиями GlobalMacroStorage. Давайте посмотрим на методы, которые можно создать (переопределить)
И ура, мы тут видим событие DocumentOpen, теперь можно создать метод и в нем писать логику работы.
Но это самая простая часть дела. Как же все-таки нам добраться до даты? Изначально я предполагал, что она будет, например, в одном месте одним шрифтом. Тогда просто перебираем объекты, находим нужные и вперед.
Однако, заказчик сказал, что дата может быть где угодно и иметь какой угодно шрифт, размер и тд. Окей, сказал я, тогда может быть можно как-то помечать дату? Или самому создавать. Да, согласился заказчик, можно сделать кнопку создания даты.
Теперь алгоритм становится понятен. Создаем дату, запоминаем StaticID шейпа, при открытии вызываем нужную процедуру и ставим сегодняшюю дату. Все? Вопрос решен? Не совсем.
Есть еще момент: а каким образом хранить идентификатор шейпа даты для документа? Учитывая, что документов может быть много, они могут иметь одинаковые имена и даже пути (перезаписывание). Хранить в базе или текстовом файле? Но что если документ переименуют? Нет, надо делать проще.
Надо хранить идентификатор вместе с документом. Как? В метаданных. Вы наверняка слышали, что у картинок могут храниться зашитые данные – геопозиция, автор и тд. Так вот и в документах корела полно такой же информации. Плюсом можно вшивать свою.
Самый простой способ это сделать например так
Set s = ActiveLayer.CreateArtisticText(1, 2, dtToday, , , "GOST type A", 24, cdrFalse) ActiveDocument.Metadata.LocalizableKeywords.SetLangString "my", s.StaticID ActiveDocument.Dirty = TrueИзвлечь
Dim my As String my = ActiveDocument.Metadata.LocalizableKeywords.GetLangString("my")После извлечения меняем дату
Dim dtToday As String dtToday = Format(Date, "dd.mm.yy") Set s = ActivePage.FindShape(StaticID:=my) s.Text.Story = dtTodayВот, в общем и все. Буквально несколько строк кода и макрос готов, работает. Кнопкой пользователь первый раз ставит дату, идентификатор объекта записывает в метаданные, а затем при открытии дата автоматически обновляется.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.