Макрос работает в одном документе, я в другом. Возможно ли?

Автор serhiy.k, 12 августа 2010, 21:15

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

serhiy.k

Вот пробный макрос:

Sub testMacro
  Dim vSearch
  Dim vFound
  Dim oCursor
  Dim oText
 
 
  oDoc = ThisComponent
 
  ' создаем дескрипторы поиска.
  vSearch = oDoc.createSearchDescriptor()
  vSearch.SearchString = "  " 'определяем, что искать, в данном случае двойной пробел
  ' создаем дескриптор найденного
  vFound = oDoc.findFirst(vSearch)
  Do While Not IsNull(vFound) 'циклические поиск и замена пока есть хоть один двойной пробел
    If IsNull(vFound) Then
      'если больше не найдено, выходим
      Exit Do
    Else
     
  vFound.setString("test ") 'заменяем найденный двойной пробел одинарным
  oCursor = vFound.Text.createTextCursorByRange( vFound )
 
  Wait 500
 
      vFound = ThisComponent.findFirst(vSearch) 'ищем опять
   
End If
  Loop
 
   Beep
   MsgBox ("Done!")
 
End Sub


Он заменяет двойной пробел словом "test". Чтобы не было слишком быстро, добавил команду ожидания полсекунды.
Есть два документа, каждый с пробелами. Запускаю макрос из одного документа, меняет там. Переключаюсь на другой документ, меняет пробелы в другом  ???

Строка
oDoc = ThisComponent.Text
дает ошибку на следующей строке
vSearch = oDoc.createSearchDescriptor()
Готов пробовать, только не всегда сразу буду отвечать, собираю урожай на поле  :)

Рыбка Рио

А так?

Sub testMacro
  Dim vSearch
  Dim vFound
  Dim oCursor
  Dim oText
 
 
  oDoc = ThisComponent
 
  ' создаем дескрипторы поиска.
  vSearch = oDoc.createSearchDescriptor()
  vSearch.SearchString = "  " 'определяем, что искать, в данном случае двойной пробел
  ' создаем дескриптор найденного
  vFound = oDoc.findFirst(vSearch)
  Do While Not IsNull(vFound) 'циклические поиск и замена пока есть хоть один двойной пробел
    If IsNull(vFound) Then
      'если больше не найдено, выходим
      Exit Do
    Else
     
          vFound.setString("test ") 'заменяем найденный двойной пробел одинарным
          oCursor = vFound.Text.createTextCursorByRange( vFound )
         
          Wait 500
         
      vFound = oDoc.findFirst(vSearch) 'ищем опять
   
        End If
  Loop
 
   Beep
   MsgBox ("Done!")
 
End Sub
ubuntu 12.04 + LibO3.6.0

smaharbA

Клио - дак ведь ThisComponent в запущеном макросе это и есть документ - или что то поменялось ?
Я конечно далек от мысли... (с)

serhiy.k

Хм, так работает. Буду разбираться, почему и пробовать применять это к "Типографике"

smaharbA

#34
оно конечно будет, оно так и должно
но как же поступить с "ThisComponent указывает на активный документ. "
осталось выяснить что такое "активный документ"
как теперь поступать со следующим

function myfunc()
doc=thiscomponent
end function
Я конечно далек от мысли... (с)

convas

Цитата: serhiy.k от 23 сентября 2010, 21:38
Есть два документа, каждый с пробелами. Запускаю макрос из одного документа, меняет там. Переключаюсь на другой документ, меняет пробелы в другом  ???

В точности повторил Ваш эксперимент:
Есть два документа, каждый с двойными пробелами. Запускаю макрос из первого документа, меняет там. Переключаюсь на другой документ, НЕ МЕНЯЕТ пробелы в другом, а продолжает менять в первом - макрос НЕ ПЕРЕКЛЮЧАЕТСЯ с одного документа на другой!

smaharbA

convas вот и мантейнеры всегда отвечают - в нашей сборке все работает
Я конечно далек от мысли... (с)

convas

У меня OOo 3.2.1 pro (Инфра).
Windows XP SP3.

Завтра посмотрю на openSUSE 11.3 c OOo 3.2.1 (Novell).

smaharbA

Я конечно далек от мысли... (с)

convas

Это может зависеть от сборки.
В свое время из-за похожей причины (связанной с работой макросов в связанных документах) пришлось менять на старых компах MS Office 97 на MS Office XP.

smaharbA

Это не может зависить от сборки !
а менять скорее пришлось Вам из за любви к активещит
Я конечно далек от мысли... (с)

convas

Я не любитель геморроев с гонками за новомодностью, так как слегка ленив.
А ставить Office XP на компы с Windows 98 - не самое увлекательное занятие.
Зато ошибки в работе макросов сразу пропали.

Рыбка Рио

Цитата: smaharbA от 23 сентября 2010, 21:25Клио - дак ведь ThisComponent в запущеном макросе это и есть документ - или что то поменялось ?
Да, поменялось, т.к. oDoc указывает на документ, который был назначен ThisComponent в момент присвоения значения oDoc (в памяти хранится не слово "ThisComponent", а ссылка на документ), т.е. почти мгновенно после запуска макроса. К примеру, если макрос открывает новый документ, StarDesktop.loadComponentFromUrl ... , то после открытия ThisComponent укажет на этот новый документ, а не на старый, из которого макрос был запущен. Функция myfunc в случае если окно этого документа активно указывает на него, а вот если обновить значения функции при неактивном состоянии окна, то не знаю что будет. ThisComponent кстати, если макрос хранится в документе, всегда указавает на тот документ. Поэтому тут не "активный документ", а какой-то "родительский документ", который в частном случае даёт документ, окно которого в данный момент активно.
ubuntu 12.04 + LibO3.6.0

smaharbA

Вы уходите от ответа ? А если нет ни единого окна то какой ?
вопросов масса и подумайте над ответами не так как в предидущем посте.
Я конечно далек от мысли... (с)

Рыбка Рио

Цитата: smaharbA от 23 сентября 2010, 22:54Вы уходите от ответа ? А если нет ни единого окна то какой ?
А, т.е. если все документы скрыты? Тогда не знаю. Нужно внимательно изучать, что такое ThisComponent в коде, но для практики проще бывает провести эксперимент (но в этом случсе я не знаю как провести эксперимент) (Search).
ubuntu 12.04 + LibO3.6.0