1

Тема: Как идентифицировать BuildingBlock'и, помещенные в документ?

Ситуация:
Допустим, я программно помещаю из коллекции шаблона блок с некоей таблицей в одно место документа.
Потом его же помещаю в другое место документа.

Теперь я 1 блок должен заменить на другой блок из коллекции шаблона.

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

Все, что я нашел по теме помещения блоков в документ в хэлпе VBA к Word'у, это событие Document.BuildingBlockInsert Event, во входных параметрах которого нужно указывать свойства помещаемого блока. Но оно мне ничего не дает, кроме самого факта помещения, который я же программно инициировал.

Как программно работать с помещенными в документ блоками?

Хорошо - никак. Тогда есть универсальный КонтентКонтрол RTF, о котором заявлено, что в него можно поместить комбинации рисунка/таблицы/текста и проч. У него есть Tag и ID. Может его использовать для блока?

Короче: интересует любая информация о работе с помещенными блоками.

Спасибо.

2

Re: Как идентифицировать BuildingBlock'и, помещенные в документ?

У каждого блока есть свойство ID — строка, содержащаю уникальный идентификационный номер этого блока. А также свойство Parent — возвращающее родительский объект этого блока.

rizalut пишет:

Все, что я нашел по теме помещения блоков в документ в хэлпе VBA к Word'у, это событие Document.BuildingBlockInsert Event, во входных параметрах которого нужно указывать свойства помещаемого блока.

Как-то маловато, а я ещё нашёл коллекцию BuildingBlocks и сами объекты BuildingBlock. Кроме того, в событии не нужно указывать параметры блока. Они туда подставляются сами. Это легко проверить таким макросом, помещённым в модуль ThisDocument шаблона

Private Sub Document_BuildingBlockInsert(ByVal Range As Range, ByVal Name As String, ByVal Category As String, ByVal BlockType As String, ByVal Template As String)
  MsgBox "Range: " & Range.Text & vbCr & _
          "Name: " & Name & vbCr & _
          "Category: " & Category & vbCr & _
          "BlockType: " & BlockType & vbCr & _
          "Template: " & Template
End Sub
Лучше день потерять — потом за пять минут долететь!

3

Re: Как идентифицировать BuildingBlock'и, помещенные в документ?

Спасибо за макрос.

Как-то маловато, а я ещё нашёл коллекцию BuildingBlocks и сами объекты BuildingBlock.

Странно, я ВВ встречал в хэлпе, только как свойство шаблона, а не документа.

Т.е. так (из хелпа):
BuildingBlocks A collection of building block entries in a template that are of the same type and category.
BuildingBlockEntries A collection of all the building blocks in a template.

То есть, у шаблона есть такое свойство Document.AttachedTemplate.BuildingBlock...
А такое свойство, как Document.BuildingBlock... у документа начисто отсутствует. Во всяком случае, не описано.

Вот как обратиться к BuildingBlock, помещенному в документ?
Так сработает?
Document.BuildingBlocks.ID("идентификатор")

Не сработает.

Вот эта строка вызывает ошибку
Debug.Print ActiveDocument.BuildingBlocks.Count

Run-time error '438'
Object doesn't support this property or method

Отредактировано rizalut (18.01.2010 20:23:35)

4

Re: Как идентифицировать BuildingBlock'и, помещенные в документ?

Совершенно верно, BB это свойство шаблона, а событие генерируется в шаблоне, на основе которого документ создан. Вот так вот.
После вставки BB в документ он перестаёт быть BB, а становится тем, из чего состоит: набор шейпов, текста, элементов управления содержимым. Думаю, что идентифицировать, что данный объект был вставлен из определённого BB, невозможно.

Лучше день потерять — потом за пять минут долететь!

5

Re: Как идентифицировать BuildingBlock'и, помещенные в документ?

viter.alex

Есть идея.
Запоминаем точку вставки.
Вставляем блок.
Ранг от точки вставки до текущего положения курсора (то есть выделяем контент блока).
Помещаем контент блока в ContentControl тип RTF. Дальше работаем со свойствами ContentControl.

Так ведь должно получиться?

6

Re: Как идентифицировать BuildingBlock'и, помещенные в документ?

А почему сразу не вставить BB в ContentControl?

Лучше день потерять — потом за пять минут долететь!

7

Re: Как идентифицировать BuildingBlock'и, помещенные в документ?

Да. А еще лучше - создавать ВВ, уже вставленным в СС. Блин, как же просто smile