Основы офисного программирования и документы Word


Копирование текста и шрифта


Я рассмотрю сейчас, как можно копировать в буфер не только текст, но и его шрифт. Макросы, которые будут построены, вряд ли стоит использовать на практике, но с учебной точки зрения их рассмотрение представляется полезным. Если необходимо сохранить в буфере не только текст, но и характеристики шрифта, которым этот текст записан, то буфер уже не может быть представлен простой строковой переменной. В подобных случаях, когда необходимо запоминать разнообразные характеристики выделенной области текстового документа, зачастую полезно определить пользовательский тип, задающий требуемые характеристики. Эти общим приемом я и воспользуюсь в данной достаточно простой ситуации. Вот как выглядит теперь определение буфера:

'Буфер, сохраняющий текст и шрифт Public Type TextAndFont BufText As String BufFont As Font End Type

Public TaFBuffer As TextAndFont

Листинг 2.2.

(html, txt)

Как видите, вначале дано определение пользовательского типа, содержащего два поля для хранения текста и объекта класса Font. Сам буфер описывается переменной введенного типа TextAndFont.

Чуть усложняются и тексты макросов, решающие задачу копирования и вставки:

Public Sub CopyTextAndFont() 'Этот макрос копирует выделенный текст и шрифт в буфер Set TaFBuffer.BufFont = Selection.Font TaFBuffer.BufText = Selection.Text End Sub

Public Sub PasteTextAndFont() 'Этот макрос выполняет операцию, обратную копированию

'К сожалению, такое присваивание свойства Font 'для объекта Selection не проходит?! 'Selection.Font = TaFBuffer.BufFont 'Но можно присвоить свойства объекту Font Selection.Font.Name = TaFBuffer.BufFont.Name Selection.Font.Bold = TaFBuffer.BufFont.Bold Selection.Font.Italic = TaFBuffer.BufFont.Italic Selection.Font.Size = TaFBuffer.BufFont.Size 'Текст из буфера с указанными параметрами шрифта 'вставляется в точку, заданную курсором. Selection.Text = TaFBuffer.BufText End Sub

Листинг 2.3.

(html, txt)

Первый из этих макросов не нуждается в особых комментариях. Объект Selection имеет наряду со свойством Text и свойство Font, возвращающее объект данного класса. Эти свойства и передаются в поля переменной, определяющей наш буфер. Казалось бы, что второй макрос должен быть симметричным, поскольку необходимо выполнить такое же присваивание, но в другую сторону. Однако объекты Range и Selection обладают одной особенностью, - их свойству Font нельзя присвоить объект класса Font. Можно, однако, задать характеристики этого объекта, чем я и воспользовался.

Повторяю, этот пример интересен скорее, как программистский прием. Практического значения он не имеет, так как стандартная реализация Copy - Paste решает эту же задачу, обладая при этом дополнительными преимуществами. Заметьте, что эта пара макросов неявно предполагает, что выделенный текст записан одним шрифтом, параметры которого постоянны для всего текста. Если же это не так, то будут использованы параметры конечного участка текста. В то же время стандартная реализация при вставке текста будет сохранять все изменения шрифта выделенного участка текста, что, конечно, представляется более разумным.



Содержание раздела