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

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

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

dr.Faust

Цитата: smaharbA от 23 сентября 2010, 20:41
мможно узнать понятие активного документа точнее ?
:) А ThisComponent - ни разу не активный документ.
Цитата: smaharbA от 23 сентября 2010, 19:45всегда ругал и буду за использование Active... и Selection... в МСО
Я скажу так - это плохо не всегда, а особенно Selection (например ваш макрос должен обработать выделенный текст). Но в общем - таки да - тулят и к месту и не к месту, причём второе чаще.
Цитата: smaharbA от 23 сентября 2010, 19:45в ООо все гораздо хуже...
А вот и не соглашусь - всё гораздо так же.
Цитата: smaharbA от 23 сентября 2010, 22:25
Клио - дак ведь ThisComponent в запущеном макросе это и есть документ - или что то поменялось ?
Всё поменялось - ThisComponent - ссылка на ЭтотДокумент, что кстати, гораздо запутаннее чем АктивныйДокумент, но он тоже должен был изменится так же.
Цитата: convas от 23 сентября 2010, 22:18Есть два документа, каждый с двойными пробелами. Запускаю макрос из первого документа, меняет там. Переключаюсь на другой документ, НЕ МЕНЯЕТ пробелы в другом, а продолжает менять в первом - макрос НЕ ПЕРЕКЛЮЧАЕТСЯ с одного документа на другой!
Всё дело в том, что ваш макрос сохранён в документе, а макрос serhiy.k в сторонней библиотеке.

Цитата: Клио от 24 сентября 2010, 00:07
Цитата: smaharbA от 23 сентября 2010, 22:54Вы уходите от ответа ? А если нет ни единого окна то какой ?
А, т.е. если все документы скрыты? Тогда не знаю. Нужно внимательно изучать, что такое ThisComponent в коде, но для практики проще бывает провести эксперимент (но в этом случсе я не знаю как провести эксперимент) (Search).
Ещё раз - ThisComponent указывает на ЭтотДокумент - это не АктивныйДокумент, иначе так бы и было написано - ActiveComponent.
Поведение его с виду не логично - оно более очеловечено, что ли. Это документ в котором сохранён макрос, а если нет, то последний документ в котором была некоторая активность. Заметьте - это не обязательно тот, который сейчас в активном окне на экране!
Свобода информации - свобода личности!

smaharbA

Дак как быть с этим ?

function myfunction()
    doc=thisComponent
    ....
end function

Sub Main()
    бла-бла-бла
    myfunction()
    бла-бла-бла
End Sub



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

Рыбка Рио

Цитата: smaharbA от 24 сентября 2010, 07:06Дак как быть с этим ? + А в случае перекрестных вызовов ?
К примеру, когда макрос хранится в документе - тут всё ясно, ThisComponent указывает на родной документ, а вот случай, когда макрос хранится в сторонней библиотеке - проверьте что будет. Было бы интересно узнать.
ubuntu 12.04 + LibO3.6.0

dr.Faust

Свобода информации - свобода личности!

convas

#49
1. Автор темы serhiy.k нигде не писал, где он хранит свой макрос.

2. Я просил его приложить проблемный файл - он его не приложил.
   Если бы его макрос не хранился бы в файле - его в нем и не было бы.

3. Пока все эти разговоры - пустое теоретизирование на пустом месте.
   Работающих примеров так никто и не приводит.

convas

#50
Если вставить этот немного измененный макрос от serhiy.k не в документ, а в "Мои Макросы"

Sub test_My_Macro
 Dim vSearch, vFound, oCursor, oText
   
 oDoc = ThisComponent
   ' создаем дескрипторы поиска.
 vSearch = oDoc.createSearchDescriptor()
 vSearch.SearchString = "  " 'определяем, что искать, в данном случае двойной пробел
 ' создаем дескриптор найденного
 vFound = oDoc.findFirst(vSearch)
 Do While Not IsNull(vFound) 'циклические поиск и замена пока есть хоть один двойной пробел
   If IsNull(vFound) Then
     'если больше не найдено, выходим
     Exit Do
   Else
     
         strdoctitle=" =" & oDoc.Title & "= "
         vFound.setString(strdoctitle)       ' ВСТАВЛЯЕМ ЗАГОЛОВОК ДОКУМЕНТА связанного с oDoc
 
         oCursor = vFound.Text.createTextCursorByRange( vFound )
 Wait 500
     vFound = ThisComponent.findFirst(vSearch) 'ищем опять
End If
 Loop
  MsgBox ("Done!")
End Sub


то проблема serhiy.k воспроизводится - при переключении на другой документ МАКРОС ТОЖЕ ПЕРЕКЛЮЧАЕТСЯ на него,
но при этом oDoc продолжает ссылаться на первый документ - тот, из которого макрос был запущен.

Если в данном коде макроса заменить oDoc.Title на ThisComponent.Title, то ThisComponent будет ссылаться уже на новый документ - тот в котором этот макрос выполняется.


bormant

Цитата: convas от 24 сентября 2010, 15:05
МАКРОС ТОЖЕ ПЕРЕКЛЮЧАЕТСЯ на него,
но при этом oDoc продолжает ссылаться на первый документ - тот, из которого макрос был запущен.
vFound = ThisComponent.findFirst(vSearch)
не смущает?
Автору на яд. Поддержать форум.

convas

#52
Цитата: bormant от 24 сентября 2010, 23:10
vFound = ThisComponent.findFirst(vSearch)
не смущает?
Нет, не смущает.
Я же и написал, что в данном случае oDoc ссылается на один документ, а ThisComponent на другой.

Если вы про то,что надо было поэкспериментировать  с заменой ThisComponent на oDoc везде, то могли бы и сами это проделать и сообщить о своих результатах.

smaharbA

convas - никакого теризирования, Вы просто не имели реальной практики и Вам кажется все на пустом месте.

про
функция мояфункция()
  док=этоткомпонент

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

convas

#54
Когда я что-то пишу, я в первую очередь думаю о том, что написанное будут читать не "узколобые спецы", а те пользователи, которые с этой проблемой сталкиваются впервые, для которых даже мелкие подробности очень важны и которые, может быть, захотят самостоятельно это проверить.
Ваши же "огрызки" кода вряд ли кого-то интересуют, кроме таких же "просвещенных".
На таком уровне проблемы можно обсуждать в личной переписке, но не на общественном форуме

serhiy.k

Здравствуйте,
исправленный Клио вариант макроса работает как надо, поэтому уже не думал прилагать документ, а решил искать, почему этот способ не работает в Типографике.

Я не указал, где храню макрос, так как не думал, что это имеет значение. Но макрос храню в Моих макросах, а не в документах, так как я работаю с разными документами, и также с текстовыми файлами.

Сейчас прилагаю документы:

  • ro-BR - это книга, в которой я исправляю кавычки на типографские (в данном случае на английские)
  • quotmarks-macro.txt - это набор макросов для исправления кавычек
  • dummytext - это любой текст

Что я делаю: макрос сохранен в моих макросах, открываю оба документа, в документе ro-Br с помощью меню Сервис-Макросы-Управление макросами-OpenOffice Basic запускаю макрос ReplaceQuotMark и он начинает работу в этом документе. Затем переключаюсь на документ dummytext и макрос сразу останавливает работу.

Не хотел сразу давать этот макрос, думал дать проще, чтобы не забирать ваше время, а получилось наоборот.  :(

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