Отслеживание даты в 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, vba, corel draw, макросы




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




Пример парсинга сайта с помощью Java
Атаки с помощью SQL-инъекции: теория, примеры, способы защиты
Программа для тестов: подключаем Firebird