Форум поддержки пользователей LibreOffice, Apache OpenOffice

Главная категория => Макросы => Тема начата: Alex от 6 ноября 2010, 08:40

Название: Отключить обновление документа? [РЕШЕНО]
Отправлено: Alex от 6 ноября 2010, 08:40
Добрый день.

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

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

Как лучше сделать - какие мысли?
Название: Re: Отключить обновление документа?
Отправлено: Рыбка Рио от 6 ноября 2010, 10:52
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
Название: Re: Отключить обновление документа?
Отправлено: dr.Faust от 6 ноября 2010, 11:30
Если не использовать диспетчер, а использовать объектную модель, то не будут открываться листы, бегать курсор и т.п. будут видны только реальные изменения в документе.
Название: Re: Отключить обновление документа?
Отправлено: Alex от 6 ноября 2010, 11:30
Спасибо. Где-нибудь мне это тоже пригодится.
Я же решил проблему по-другому - переписал ту фигню, которую нагородил мне рекордер макросов, на вот такое:

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

И сейчас уже документ не мелькает, а список текстов спокойно и быстро заменяется ну нужный мне.
Название: Re: Отключить обновление документа?
Отправлено: Alex от 6 ноября 2010, 11:32
Вот и Dr Faust смотрю того же мнения (ответили одновременно)  :)
Можно закрыть тему.
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Syzygy от 6 ноября 2010, 11:55
Цитата: Alex от  6 ноября 2010, 09:32Можно закрыть тему.
В порядке разъяснения - темы не закрываются, в названии ставится [РЕШЕНО]. Не закрываются потому, что у кого-то может возникнуть ещё какая-нибудь идея или вопрос.
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: convas от 6 ноября 2010, 12:20
"вариант 1:" от Клио выдает ошибку.
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Рыбка Рио от 6 ноября 2010, 16:28
Цитата: convas от  6 ноября 2010, 12:20
"вариант 1:" от Клио выдает ошибку.
На каком месте? Этот вариант должен скрывать контейнер с документом (у меня работает на Go-OO 3.2.1 и на 3.3.0RC3 - линукс) Выглядит вот так:

[вложение удалено Администратором]
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: convas от 6 ноября 2010, 17:28
Вот:

[вложение удалено Администратором]
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Рыбка Рио от 6 ноября 2010, 18:04
У вас какой компонент открыт при этом? У меня Writer, ошибку не выдаёт.

Кстати, есть ещё способы, например:
ThisComponent.LockControllers
ThisComponent.unLockControllers
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: convas от 6 ноября 2010, 18:46
Цитата: Клио от  6 ноября 2010, 16:04У вас какой компонент открыт при этом? У меня Writer, ошибку не выдаёт.
Writer.
Ошибку не выдает, если:
ЦитироватьDoc.CurrentController.Frame.ComponentWindow.setFocus
Doc.CurrentController.Frame.ComponentWindow.Visible=False
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Alex от 7 ноября 2010, 08:18
Однако не всё гладко получилось.
Вот эта штука
ThisComponent.ReplaceAll(oDescriptor)
у меня почему-то не понимает, если oDescriptor.ReplaceString="" (т.е. пустая строка).
Я уж не знаю, косяк это OO, или так было задумано.
Причём, текст он находит (потому что перекрашивает его из красного в чёрный - как у меня по исходнику и задумано).
Но текст при этом не удаляет. Пришлось дописать - если ReplaceString пустая, то присваиваю ей пробел.
Для моего случая это подошло. Но вообще-то не красиво конечно.
Что-то недопилено в этом ReplaceDescriptor по-моему.
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Рыбка Рио от 7 ноября 2010, 10:45
Цитата: 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
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Alex от 7 ноября 2010, 21:44
> Может мешают атрибуты какие-нибудь?

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

У меня 3.2, но под Windows (XP SP3). Попробую под Linux тоже ради интереса - потом напишу, что получилось.
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Рыбка Рио от 7 ноября 2010, 22:22
Нет, если покрасить x в цвет "Красный 4", то данный код меняет цвет x на черный и всё, x остаётся на месте, вы правы. Если закомментировать атрибуты поиска, то работает (т.к. уже не важно, красный там шрифт или нет). Это видимо баг метода ReplaceAll, который почему-то не работает именно когда у текста ищется атрибут, а заменять его надо а пустую строку.
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Рыбка Рио от 7 ноября 2010, 22:26
Кстати, это реальный баг, даже диалог поиска и замены в этом случае не работает (выбрать формат цвет шрифта красный 4). Пишет "слово заменено столько-то раз" и ничего не заменяет.

[вложение удалено Администратором]
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Рыбка Рио от 7 ноября 2010, 22:38
Issue 115458 (http://www.openoffice.org/issues/show_bug.cgi?id=115458)
Название: Re: Отключить обновление документа? [РЕШЕНО]
Отправлено: Alex от 14 ноября 2010, 23:34
Интересное кино получается. Написал аналог для 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 по крайней мере.
Неужели у Билли тот же самый косяк? Может просто так задумано почему-то?