Заблокировать поле

Автор geopos, 7 мая 2015, 12:31

0 Пользователи и 1 гость просматривают эту тему.

geopos

Подскажите как в ОО можно заблокировать поле, чтобы оно не обновлялось или преобразовать значение в текст по аналогии в Ворде?
Пишу программу на Делфи.
Для примера код для МС Ворд
 
Doc.Range.Fields.UPDATE;
Doc.Range.Fields.UNLINK;


Вообщем ход работы такой:
- открывается "главный документ", в котором заносятся значение полей;
- далее по циклу открываю n-ый документ, заношу уже иные значения полей;
- копирую n-ый документ, затем его вставляю в главный. Вот тут весь трабл - обновляются значения ранее вставленных полей. Отсюда вопрос как можно заблокировать или преобразовать поле в текст?

Спасибо!

JohnSUN

Добро пожаловать на форум!
Еще раз - заполненные поля тебе не нужны, нужен текст из них в тех же местах где были поля?
К сожалению, Writer не дает никакого простого способа преобразования содержимого полей в текст. Чтобы сделать это, нужно скопировать содержимое поля и вставить их обратно, как неформатированный текст. Это не очень хорошее решение, если у вас есть сотни полей, которые вы хотите изменить, но вы можете использовать макрос, чтобы автоматизировать процесс.
Сам макрос вгоняет в шок:
Sub FieldsToText 'Writer
Dim oDoc,oFields,oEnum,ThisField
   oDoc = ThisComponent
   oFields = oDoc.getTextFields
   oEnum = oFields.createEnumeration
   While oEnum.HasMoreElements
       ThisField = oEnum.nextElement
       ThisField.Anchor.String = ThisField.Anchor.String
   Wend
End Sub
Ключевой фразой здесь является
ThisField.Anchor.String = ThisField.Anchor.StringНе смотря на её кажущуюся безумность - она работает

А тему лучше было бы создавать в разделе Basic
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

geopos

Спасибо! Только здесь ответили. Сейчас будем пробовать.
А насчет создание темы не в том месте, виноват... 

geopos

#3
Ура-а, работает!  :D 
Вопросы в догонку:
- есть что-то вроде ключей у полей, как в Ворде {DocVariable myVar \* FirstCap} ?
- как разрешить/заблокировать отрисовку содержимого Writer (Word: Doc.Application.ScreenUpdating := false;), чтобы увеличить производительность ?

JohnSUN

Цитата: geopos от  8 мая 2015, 12:05
Ура-а, работает!  :D 
От души поздравляю. Может все-таки расскажешь о задаче чуть подробнее? Например откуда берутся сами поля и данные для них? По описанию "по циклу открываю n-ый документ, заношу уже иные значения полей" трудно понять...
Цитата: geopos от  8 мая 2015, 12:05
- есть что-то вроде ключей у полей, как в Ворде {DocVariable myVar \* FirstCap} ?
Нет такой буквы в этом слове... С числовыми данными еще можно как-то играться с помощью форматирования, а текст он и есть текст - отображается без искажения, "как есть". Но тебе это в общем-то и не важно. Раз уж все равно потом с этими строками работаешь из кода, то там же и преобразовывай
var sTemp: string;
...
sTemp := ThisField.Anchor.String;
sTemp[1] := uppercase(sTemp[1]);
ThisField.Anchor.String := sTemp;
...
Цитата: geopos от  8 мая 2015, 12:05
- как разрешить/заблокировать отрисовку содержимого Writer (Word: Doc.Application.ScreenUpdating := false;), чтобы увеличить производительность ?
Ну, есть два способа. Собственно, "рисуй/не рисуй" выглядит так
ThisComponent.LockControllers
' и если повезет и не вылетит какой-нибудь эксэпшен, то в конце сможешь сказать
ThisComponent.UnlockControllers
'Не скажешь - получишь "мёртвое" окно

Мне кажется более эффективным управление свойством всего окна документа ThisComponent.getCurrentController().getFrame().getContainerWindow().Visible Присваивай ему FALSE/TRUE и получай результат (опять-таки, если программа не вылетит где-то посередине). Можно попробовать скомбинировать оба метода... Если еще и на время выполнения программы запретишь записывать информацию для UnDo - вообще летать будет
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне