-
Здравствуйте! Есть программа на Delphi7, составляющая отчет в Word. Все работает, документ получается достаточно большой, возникла задача расставить номера и названия под таблицами и сделать на них перекрестные ссылки. Я посмотрел документацию и, можно сказать, почти реализовал. Пример, когда вставляется перекрестная ссылка на таблицу, название которой является стандартом в документе Word (Таблица <номер>) проходит нормально. Мне же надо вставить названия вида “Таблица Г<номер>”, вот с этим-то и проблемы. Привожу основные решения с объяснениями:
После создания документа выполняется код WordApp.CaptionLabels.Add(Name:='Таблица Г'); - регистрирует в Word новую подпись под объектом, т.е. название. Действительно, после выполнения данной команды в Word появляется новое название, которое можно использовать для вставки и возможность сделать на него перекрестную ссылку. То есть новое название регистрируется везде и становится доступным как в перекрестных ссылках, так и в пункте главного меню Вставка – Перекрестная ссылка – Название. То есть с т.з. Word’а на текущий сеанс работы с моим отчетом названием “Таблица Г<номер>” можно пользоваться, однако, Дельфи так не считает…
На разных этапах заполнения отчета вставляются номера и подписи под таблицами WordApp.Selection.InsertCaption(Label := 'Таблица Г', Title := <название таблицы>, Position := 0, ExcludeLabel := 0); - все работает нормально, вставляются названия с последовательно увеличивающимися номерами вида “Таблица Г.<номер>”
Доходим до расстановки перекрестных ссылок. Весь процесс не рассматриваю, т.к. он стопорится на первой же строке. Ссылки должны вставляться с помощью WordApp.Selection.InsertCrossReference… , но до этого следует “забрать в массив” все названия объектов, на которые можно сделать ссылки, в том числе, чтобы узнать их внутренний номер в документе. Для этого использую var RefList:OleVariant; а потом в коде RefList:=WordApp.ActiveDocument.GetCrossReferenceItems(ReferenceType:='Таблица Г'); Приведенный код должен выбрать в массив все объекты указанного типа, я последовательно переберу их и выделю нужный по названию, узнаю его номер и вставлю перекрестную ссылку с использованием InsertCaption и данного номера в качестве одного из параметров. Но до этого даже не дохожит. Все завершается на: RefList:=WordApp.ActiveDocument.GetCrossReferenceItems(ReferenceType:='Таблица Г'); Возвращается пустой массив. Как будто в моем документе нет десятка успешно вставленных в процессе этого сеанса работы и успешно именованных “Таблиц Г”. При этом в Word, как я говорил, успешно можно и пользоваться этими таблицами, и ставить на них ссылки (вручную). Если оставляю весь код, но меняю наименование получаемых объектов на стандартное “Таблица”, то на объекты данного типа (в Word добавил пару для проверки) ссылки ставятся отлично, длина возвращаемого массива не нулевая, сам он не пуст: RefList:=WordApp.ActiveDocument.GetCrossReferenceItems(ReferenceType:='Таблица') ; MSDN смотрел, GetCrossReferenceItems может в качестве ReferenceType иметь фиксированныфе типы (заголовок, родной формат названия таблицы, подпись рисунка). Когда же нужно обратиться к своему “внедренному” типу, то рекомендуют использовать ReferenceType:=<Ваше название>.
Подскажите, что делаю не так? Есть еще одна специфика – по условию работы перекрестные ссылки на таблицы устанавливаются не сразу после присвоения имени таблицы, а чуть позже, после заполнения определенной части отчета. Так что выбираю все в массив GetCrossReferenceItems и потом нахожу соответствия названия и внутреннего номера. Но в случае с именем “Таблица Г” это не проходит. Со стандартным “Таблица” работает нормально. Спасибо. С уважением, Николай
-
...я разобрался в ошибке, только не могу пока исправить - приведенный мною алгоритм убивает символ "пробел" между "Таблица" и "Г", если заменить на подчеркивание, то все становится ОК. Однако, не по Госту:)
Надо подумать, как этот пробел подсунуть Word'у кодом и каким... Самые простейшие варианты типа chr(32) и т.д. не проходят. Будем искать...
-
Прбовал делать (Таблица)+'пробел(место подчеркивания :) )'+(Г) незнаю поможет ли но если понял суть проблемы мож и поможет
-
Плагины Firefox
|