Недавно потребовалось сделать смарт-шейп... Такой весь из-себя управляемый данными. И формулы получались довольно сложными. Вот например, есть список типов

принтер;МФУ;копир;сканер;терминал;инж.сист.;факс;дупликатор

и задание к нему - в зависимости от типа отображать одну из 5 картинок. В итоге требование вылилось вот в такую формулу с вложенными IF, OR и STRSAME.

IF(STRSAME(Prop._VisDM_Тип_устр,"Принтер",1),4,IF(STRSAME(Prop._VisDM_Тип_устр,"Инж.сист.",1),3,IF(OR(STRSAME(Prop._VisDM_Тип_устр,"Сканер",1),STRSAME(Prop._VisDM_Тип_устр,"Факс",1)),2,IF(OR(STRSAME(Prop._VisDM_Тип_устр,"МФУ",1),STRSAME(Prop._VisDM_Тип_устр,"Копир",1),STRSAME(Prop._VisDM_Тип_устр,"Дупликатор",1)),1,0))))

Написал, проверил - получил ошибку. Исправил - опять ошибка. Ну невозможно сходу и без ошибок создать такое.

 

В предыдущей статье Функция FILENAME() и все такое я рассказывал о конструкции из формул шейп-листа, в которой формулы выстраивались в своего рода логическую цепочку и должны были срабатывать одна за другой. Кстати, цепочка была замкнутой, что еще интереснее. Но так как наши представления о последовательности выполнения формул не всегда соответствуют действительности, возникло желание каким-то образом посмотреть реальную последовательность.

Итак, имеем исходный документ (VSDX), в котором прописаны несколько связанных формул в шейп-листе документа и ссылающаяся на него формула в единственном шейпе на странице. Повторю картинку-схему.

 

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

Да, значение можно обновить. Например, если открыть шейп-лист, найти ячейку, использующую функцию, в строке редактирования встать в конце формулы и нажать Enter. Или через SaveAs сохранить файл под новым именем. И в том, и в другом случае поле обновляется, но дя этого нужны ручные действия. А главное - нужно вовремя вспомнить о них, иначе в документе останется ошибка, а это неприятно.

В процессе исследований выяснилось, что попытка перезаписи формулы с FileName() с использованием функции SETF() не помогает. Когда в ячейку пишется та же самая формула, то в ячейке вроде как ничего и не меняется. Значит и обновляться она не собирается.


В предыдущей статье говорилось о том, как создать CHM справку для шейпов разработанного трафарета. Сейчас хочу показать несколько другой подход.

CHM справка все-таки требует наличия дополнительного файла. Его надо правильно разместить и настроить взаимодействие с шейпами. Но что если встроить справку непосредственно в сам шейп! То есть внедрить OLE объект, сжать его в точку для невидимости в обычном режиме и открывать при необходимости.

Windows позволяет встроить множество типов разных объектов: Wordpad, документ Word, даже документ Visio. Но есть еще более интересный вариант - встроить универсальный контейнер для объектов. Такой контейнер существует - это объект Package.