Отключить обновление документа? [РЕШЕНО]

Автор Alex, 6 ноября 2010, 08:40

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

Alex

Добрый день.

При открытии документа выполняется некий макрос, меняющий содержимое документа в отдельных местах (обычный поиск текста и замена). При этом пользователь видит жуткую картину - то откроется первая страница, то последняя и так много раз подряд, и очень быстро.

Как отключить обновление отображения на время внесения изменений?
Или может быть тут хотя бы есть какой-то аналог вордовского Application.Visible=False ? (хотя, это не совсем то, но подошло бы и оно. Скрыли документ, обновили, а потом открыли). Нашёл какое-то свойство IsHidden у документа, но оно ReadOnly.

Как лучше сделать - какие мысли?

Рыбка Рио

REM  *****  BASIC  *****

Sub Main
Doc=ThisComponent
msgbox "вариант 1:"
Doc.CurrentController.ComponentWindow.setFocus
Doc.CurrentController.ComponentWindow.Visible=False
Wait 5000
Doc.CurrentController.ComponentWindow.Visible=True
msgbox "вариант 2:"
Doc.CurrentController.Frame.ContainerWindow.Visible=False
Wait 5000
Doc.CurrentController.Frame.ContainerWindow.Visible=True
'отключить отмену действий на время в Calc
If Doc.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
Doc.isUndoEnabled=False
Doc.Sheets(0).getCellRangeByName("A1").String=" это действие без отмены "
Doc.isUndoEnabled=True
Endif
End Sub
ubuntu 12.04 + LibO3.6.0

dr.Faust

Если не использовать диспетчер, а использовать объектную модель, то не будут открываться листы, бегать курсор и т.п. будут видны только реальные изменения в документе.
Свобода информации - свобода личности!

Alex

Спасибо. Где-нибудь мне это тоже пригодится.
Я же решил проблему по-другому - переписал ту фигню, которую нагородил мне рекордер макросов, на вот такое:

sub ChgArrValues(ArrPair)
dim oDescriptor as object, i as integer
Dim SrchAttributes(0) as new com.sun.star.beans.PropertyValue
Dim ReplAttributes(0) as new com.sun.star.beans.PropertyValue
 set oDescriptor = ThisComponent.CreateReplaceDescriptor()
 SrchAttributes(0).Name = "CharColor"
 SrchAttributes(0).Value = 16724787 'Красный - 4
 ReplAttributes(0).Name = "CharColor"
 ReplAttributes(0).Value = 0
 oDescriptor.SetSearchAttributes(SrchAttributes())
 oDescriptor.SetReplaceAttributes(ReplAttributes())
 for i=0 to UBound(ArrPair)
   oDescriptor.SearchString = ArrPair(i,0)
   oDescriptor.ReplaceString =  ArrPair(i,1)
   ThisComponent.ReplaceAll(oDescriptor)
 next
end sub

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

Alex

Вот и Dr Faust смотрю того же мнения (ответили одновременно)  :)
Можно закрыть тему.

Syzygy

Цитата: Alex от  6 ноября 2010, 09:32Можно закрыть тему.
В порядке разъяснения - темы не закрываются, в названии ставится [РЕШЕНО]. Не закрываются потому, что у кого-то может возникнуть ещё какая-нибудь идея или вопрос.
A Matter of Life and Death

convas


Рыбка Рио

Цитата: convas от  6 ноября 2010, 12:20
"вариант 1:" от Клио выдает ошибку.
На каком месте? Этот вариант должен скрывать контейнер с документом (у меня работает на Go-OO 3.2.1 и на 3.3.0RC3 - линукс) Выглядит вот так:

[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

convas

Вот:

[вложение удалено Администратором]

Рыбка Рио

У вас какой компонент открыт при этом? У меня Writer, ошибку не выдаёт.

Кстати, есть ещё способы, например:
ThisComponent.LockControllers
ThisComponent.unLockControllers
ubuntu 12.04 + LibO3.6.0

convas

Цитата: Клио от  6 ноября 2010, 16:04У вас какой компонент открыт при этом? У меня Writer, ошибку не выдаёт.
Writer.
Ошибку не выдает, если:
ЦитироватьDoc.CurrentController.Frame.ComponentWindow.setFocus
Doc.CurrentController.Frame.ComponentWindow.Visible=False

Alex

Однако не всё гладко получилось.
Вот эта штука
ThisComponent.ReplaceAll(oDescriptor)
у меня почему-то не понимает, если oDescriptor.ReplaceString="" (т.е. пустая строка).
Я уж не знаю, косяк это OO, или так было задумано.
Причём, текст он находит (потому что перекрашивает его из красного в чёрный - как у меня по исходнику и задумано).
Но текст при этом не удаляет. Пришлось дописать - если ReplaceString пустая, то присваиваю ей пробел.
Для моего случая это подошло. Но вообще-то не красиво конечно.
Что-то недопилено в этом ReplaceDescriptor по-моему.

Рыбка Рио

Цитата: Alex от  7 ноября 2010, 06:18у меня почему-то не понимает, если oDescriptor.ReplaceString="" (т.е. пустая строка).
Может мешают атрибуты какие-нибудь? У меня понимает (версия 3.3.0rc3, Go-OO 3.2.1, линукс ). Вот такой код работает:
sub ChgArrValues
Doc=ThisComponent
dim ArrPair(0,1) As String
ArrPair(0,0)="x"
ArrPair(0,1)=""
dim oDescriptor as object, i as integer
Dim SrchAttributes(0) as new com.sun.star.beans.PropertyValue
Dim ReplAttributes(0) as new com.sun.star.beans.PropertyValue
 set oDescriptor = Doc.CreateReplaceDescriptor()
'  SrchAttributes(0).Name = "CharColor"
'  SrchAttributes(0).Value = 16724787 'Красный - 4
 ReplAttributes(0).Name = "CharColor"
 ReplAttributes(0).Value = 0
'  oDescriptor.SetSearchAttributes(SrchAttributes())
 oDescriptor.SetReplaceAttributes(ReplAttributes())
 for i=0 to UBound(ArrPair)
   oDescriptor.SearchString = ArrPair(i,0)
   oDescriptor.ReplaceString =  ArrPair(i,1)
   Doc.ReplaceAll(oDescriptor)
 next
end sub
ubuntu 12.04 + LibO3.6.0

Alex

> Может мешают атрибуты какие-нибудь?

Всё может быть.
А если убрать комментарии, и "x" в тексте покрасить красным - так будет работать?

У меня 3.2, но под Windows (XP SP3). Попробую под Linux тоже ради интереса - потом напишу, что получилось.

Рыбка Рио

Нет, если покрасить x в цвет "Красный 4", то данный код меняет цвет x на черный и всё, x остаётся на месте, вы правы. Если закомментировать атрибуты поиска, то работает (т.к. уже не важно, красный там шрифт или нет). Это видимо баг метода ReplaceAll, который почему-то не работает именно когда у текста ищется атрибут, а заменять его надо а пустую строку.
ubuntu 12.04 + LibO3.6.0