Добрый день.
При открытии документа выполняется некий макрос, меняющий содержимое документа в отдельных местах (обычный поиск текста и замена). При этом пользователь видит жуткую картину - то откроется первая страница, то последняя и так много раз подряд, и очень быстро.
Как отключить обновление отображения на время внесения изменений?
Или может быть тут хотя бы есть какой-то аналог вордовского 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
Если не использовать диспетчер, а использовать объектную модель, то не будут открываться листы, бегать курсор и т.п. будут видны только реальные изменения в документе.
Спасибо. Где-нибудь мне это тоже пригодится.
Я же решил проблему по-другому - переписал ту фигню, которую нагородил мне рекордер макросов, на вот такое:
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
И сейчас уже документ не мелькает, а список текстов спокойно и быстро заменяется ну нужный мне.
Вот и Dr Faust смотрю того же мнения (ответили одновременно) :)
Можно закрыть тему.
Цитата: Alex от 6 ноября 2010, 09:32Можно закрыть тему.
В порядке разъяснения - темы не закрываются, в названии ставится [РЕШЕНО]. Не закрываются потому, что у кого-то может возникнуть ещё какая-нибудь идея или вопрос.
"вариант 1:" от Клио выдает ошибку.
Цитата: convas от 6 ноября 2010, 12:20
"вариант 1:" от Клио выдает ошибку.
На каком месте? Этот вариант должен скрывать контейнер с документом (у меня работает на Go-OO 3.2.1 и на 3.3.0RC3 - линукс) Выглядит вот так:
[вложение удалено Администратором]
Вот:
[вложение удалено Администратором]
У вас какой компонент открыт при этом? У меня Writer, ошибку не выдаёт.
Кстати, есть ещё способы, например:
ThisComponent.LockControllers
ThisComponent.unLockControllers
Цитата: Клио от 6 ноября 2010, 16:04У вас какой компонент открыт при этом? У меня Writer, ошибку не выдаёт.
Writer.
Ошибку не выдает, если:
ЦитироватьDoc.CurrentController.Frame.ComponentWindow.setFocus
Doc.CurrentController.Frame.ComponentWindow.Visible=False
Однако не всё гладко получилось.
Вот эта штука
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
> Может мешают атрибуты какие-нибудь?
Всё может быть.
А если убрать комментарии, и "x" в тексте покрасить красным - так будет работать?
У меня 3.2, но под Windows (XP SP3). Попробую под Linux тоже ради интереса - потом напишу, что получилось.
Нет, если покрасить x в цвет "Красный 4", то данный код меняет цвет x на черный и всё, x остаётся на месте, вы правы. Если закомментировать атрибуты поиска, то работает (т.к. уже не важно, красный там шрифт или нет). Это видимо баг метода ReplaceAll, который почему-то не работает именно когда у текста ищется атрибут, а заменять его надо а пустую строку.
Кстати, это реальный баг, даже диалог поиска и замены в этом случае не работает (выбрать формат цвет шрифта красный 4). Пишет "слово заменено столько-то раз" и ничего не заменяет.
[вложение удалено Администратором]
Issue 115458 (http://www.openoffice.org/issues/show_bug.cgi?id=115458)
Интересное кино получается. Написал аналог для MS Word, примерно так:
Sub ChgArrValues(ArrPair)
Dim i As Integer
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Font.Color = wdColorRed
.Replacement.Font.Color = wdColorBlack
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
For i = 0 To UBound(ArrPair)
Selection.Find.Text = ArrPair(i, 0)
Selection.Find.Replacement.Text = ArrPair(i, 1)
'Selection.Find.Replacement.Text = IIf(ArrPair(i, 1) = "", " ", ArrPair(i, 1)) 'А так работает!
Selection.Find.Execute Replace:=wdReplaceAll
Next
End Sub
Так вот то же самое - красный текст только перекрашивает в чёрный, но не заменяет. В Office 2003 по крайней мере.
Неужели у Билли тот же самый косяк? Может просто так задумано почему-то?