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

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

30 Октябрь 2020, 22:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 3 4 »   Вниз
  Печать  
Автор Тема: Отключить сообщения LO  (Прочитано 1986 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Стартовое сообщение: 3 Октябрь 2020, 18:30 »

Народ, может кто подскажет, как можно отключить внутренние сообщения LO.
Что-то вроде "Помогите сделать LibreOffice лучше".
Желательно программно, макросом.

Эти вредоносы выскакивают периодически и вгоняют в краш мою базу. А отключить их я могу только войдя в Basic, в макросы. Простым пользователям трудно запомнить как их отключать, да и лезть в макросы им не зачем.
Буду очень признателен за подсказку.


* 222.jpg (9.22 Кб, 661x40 - просмотрено 15 раз.)
« Последнее редактирование: 3 Октябрь 2020, 21:01 от Kadet » Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #1: 9 Октябрь 2020, 12:09 »

Значит никто не подскажет. Теоретически всё это отключается в "Параметры" -> "LibreOffice/Общие", выключая все галочки. Но, всё равно, почему-то через какой-то время они снова всплывают. Толи сбой, какой-то происходит и настройки слетают, толи я не пойму что.

Копая в этом направлении, кажется, накопал тропинку по другому своему вопросы, который задавал ранее и не нашёл ответа.
В общем, нужно в LO, на уровне всего офиса, запретить запрашивать восстановление после сбоя. Насколько я понимаю, где это регулируется я нашёл. Вот пример макроса.
Код:
'*** Первичные настройки офиса *******************************************
Sub setOffice()
Dim oGlobalSetting
Dim aProps(2) As New com.sun.star.beans.PropertyValue
Dim oGlobalEventBroadcaster

oGlobalSetting = GetDefaultContext().getByName("/singletons/com.sun.star.frame.theAutoRecovery")
oGlobalSetting.Crashed=false
oGlobalSetting.ExistsRecoveryData=false
oGlobalSetting.ExistsSessionData=false

aProps(0).Name  = "Crashed"
aProps(0).Value = false
aProps(1).Name  = "ExistsRecoveryData"
aProps(1).Value = false
aProps(2).Name  = "ExistsSessionData"
aProps(2).Value = false
oGlobalSetting.setPropertyValue(aProps())

oGlobalSetting.setPropertyValue("Crashed", false)
oGlobalSetting.setPropertyValue("ExistsRecoveryData", false)
oGlobalSetting.setPropertyValue("ExistsSessionData", false)
End Sub
Это лишь "черновик" макроса. И он не работает. Дело в том, что методы "Crashed", "ExistsRecoveryData" и "ExistsSessionData" открыты только для чтения, а ведь именно их нужно установить в false. Этот макрос, при всех моих вариантах и пробах даёт ошибку.

Подскажите пожалуйста, как их таки можно выставить в false?
« Последнее редактирование: 9 Октябрь 2020, 12:12 от Kadet » Записан
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 196


WWW
« Ответ #2: 9 Октябрь 2020, 12:28 »

Поищите в экспертных настройках по тексту "Recovery".
Записан

Владимир.
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #3: 9 Октябрь 2020, 13:48 »

Поищите в экспертных настройках по тексту "Recovery".
Спасибо за наводку, но думаю это немного не то. В этих настройках вроде бы устанавливаются стационарные установки, а мне нужно постоянно менять их динамически.
Поясню. Когда я открываю свою базу, то макросом перевожу в фон главную форму базы ("мозги", так сказать прячу), а народ пользует уже вторичные, созданные мною формы. И, соответственно, закрытие всей базы я настроил по закрытии "Основной" рабочей формы. Но, так как закрытие происходит из вторичной формы, и во время общего закрытия ещё не закончена работа макроса, который осуществляет это закрытие. И вот такое закрытие LO воспринимает как сбой и при следующей загрузке начинает сыпать ненужными вопросами "восстановить" и т.п.
Т.е. система сама меняет эти параметры динамически.
К тому же - хочется сделать это посредством макросов, чтобы человек на другом конце провода в другой части планеты просто запустил мою программу и у него бы всё это автоматически выставилось.
Так же я планирую отключать "Skia" и прочие предварительные настройки самого офиса.
« Последнее редактирование: 9 Октябрь 2020, 13:51 от Kadet » Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #4: 14 Октябрь 2020, 13:52 »

Итак. Снова нет ответов на те вопросы, которые меня мучают.
Сейчас докопался каким образом на свойства и методы объектов ставятся запреты на изменения.
Это делается с помощью специальных listener-ов - ChangeListenerEvent.
Напомню макрос, которым я кручу-верчу, запутать хочу.
Код:
Sub setOffices()
Dim oGlobalSetting

oGlobalSetting = GetDefaultContext().getByName("/singletons/com.sun.star.frame.theAutoRecovery")

oGlobalSetting.Crashed=false
oGlobalSetting.ExistsRecoveryData=false
oGlobalSetting.ExistsSessionData=false
' или так
oGlobalSetting.setPropertyValue("Crashed", false)
oGlobalSetting.setPropertyValue("ExistsRecoveryData", false)
oGlobalSetting.setPropertyValue("ExistsSessionData", false)

End Sub
В таком виде, при попытке любых изменений любого параметра выдаёт сообщение о том, что "Параметр только для чтения".
При этом, объект oGlobalSetting имеет некоторые, интересные методы.
Код:
' SbxVOID removeStatusListener ( SbxOBJECT, SbxOBJECT )
' SbxVOID removeEventListener ( SbxOBJECT )
' SbxVOID removePropertyChangeListener ( SbxSTRING, SbxOBJECT )
' SbxVOID removeVetoableChangeListener ( SbxSTRING, SbxOBJECT )
' SbxVOID removePropertiesChangeListener ( SbxOBJECT )
' SbxVOID firePropertiesChangeEvent ( SbxARRAY, SbxOBJECT )
С помощью этих методов, теоретически, можно снять контролёров изменений, в частности метод removeVetoableChangeListener должен снимать вето на изменения параметров. НО... как всегда это пресловутое "НО"... Этот метод ждёт два параметра: SbxSTRING и SbxOBJECT. SbxSTRING - это имя параметра, с которого нужно снять вето. А вот с SbxOBJECT засада. Он ждёт объект, класса XVetoableChangeListener, т.е. - ждёт самого листенера, который и ограничивает возможность изменений.
И в этом проблема. Не могу поймать этот объект, потому что не я его создавал и запускал. Если мы сами создаём эти объекты, что-то типа
Код:
lVetoableChange = createUnoListener("MyList_", "com.sun.star.beans.XVetoableChangeListener")
То тогда можно оперировать объектом lVetoableChange по своему усмотрению. А вот если его создавал "некто", т.е. сама LO его создала, то как можно его отловить?
Вот сколько не искал и не пытался не могу найти информацию как получать "чужие" листенеры, привязанные к какому-нибудь объекту. В инете такой информации не нашёл.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #5: 18 Октябрь 2020, 11:09 »

Продолжаю исследования в этом направлении.
Выяснил, что всему "виной" появления запроса на восстановление является параметр ExistsRecoveryData, который в случае "необходимости" такого запроса переводится в значение "true" и это провоцирует вызов диалогового окна. Если этот параметр имеет значение "false", то запроса нет.

В инете в этих случаях рекомендуют почистить или вовсе удалить файл registrymodifications.xcu, в связи с чем набросал макрос:
Код:
Sub NoRestore()
dim fso, UserProfilePatch, t_FileName, FileNameCopy, oUrl, oUrlCopy

fso = CreateObject("Scripting.FileSystemObject")

UserProfilePatch = wshShell.ExpandEnvironmentStrings("%USERPROFILE%") ' C:\Users\_USERNAME_
t_FileName = UserProfilePatch & "\AppData\Roaming\LibreOffice\4\user\registrymodifications.xcu"
oUrl = ConvertToURL("file:\\\" & t_FileName)
FileNameCopy = UserProfilePatch & "\AppData\Roaming\LibreOffice\4\registrymodifications.xcu"
oUrlCopy = ConvertToURL("file:\\\" & FileNameCopy)

if fso.FileExists(t_FileName) then
' FileCopy(oUrl, oUrlCopy)
Kill(oUrl)
end if
End Sub
Не. Не помогает. Макрос, повешенный на общее событие "открытие приложения" действительно удаляет этот файл, но он тут же снова появляется, а вслед за ним появляется и запрос на восстановление.
Попробую почистить этот файл от ненужного, как тоже рекомендуют, но, думаю, результат будет прежним.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #6: 18 Октябрь 2020, 15:46 »

Что я делаю не так?
Набросал макрос, строго по Питоньяку, который должен читать из файла данные и удалять лишние строки (удаление ещё не сделал). А он вроде бы и файл открывает (n становится равной 1), но при этом длину файла определяет как 0, хотя на самомо деле в нём 1,07Мб.
Код:
Sub NoRestore()
Dim WshShell, FileName$, FileNameCopy$, LineInFile$, TestStr$, LineInText$, vbCr
Dim TestStrLen, vbamp, n, oUrl
Dim sArg(0) As New com.sun.star.beans.PropertyValue

vbamp = chr(34)
WshShell = CreateObject("WScript.Shell")
FileName = WshShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\AppData\Roaming\LibreOffice\4\user\registrymodifications.xcu"
oUrl = ConvertToURL("file:\\\" & FileName)
NewFileContent = ""

TestStr = "<item oor:path=" & vbamp & "/org.openoffice.Office.Recovery/"
TestStrLen = Len(TestStr)

n = FreeFile
Open oUrl For Output Access Read Write As #n
if FileExists(FileName) then
MsgBox "Длина файла - " & LOF(n) & Chr(10) & "Положение курсора - "  & Loc(n) & Chr(10) & "Конец файла - "  & EOF(n)
Do While NOT EOF(n)
Line Input #n, LineInFile
MsgBox "Абзац считан - " & LineInFile
LineInText = Left(LineInFile, TestStrLen)
If LineInText=TestStr Then
MsgBox "Нужно удалить всю линию - " & LineInFile
end if
Loop
Close #n
end if

End Sub
Когда открывал таким образом уже открытый файл (oDoc = oDesk.loadComponentFromURL(oUrl, "_blank", 8, sArg()), то всё определялось правильно, и длин и данные читались. Писать не хотел, на "Open oUrl For Output Access Read Write As #n" ругался. Ошибка ввода/вывода говорил.
А отключил предварительное открытие файла, так и файл пустым определяется.
« Последнее редактирование: 18 Октябрь 2020, 15:47 от Kadet » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 024


iMac, LibreOffice и Apache OpenOffice


« Ответ #7: 18 Октябрь 2020, 16:50 »

Если вы выполняете Open oUrl For Output Access Read Write As #n , то содержимое файла удаляется, он будет пустой.
Чтобы содержимое файла не удалялось, нужно открывать его Open oUrl For Input Access Read Write As #n (для чтения и записи)
Записан

Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 997


« Ответ #8: 18 Октябрь 2020, 17:00 »

Режим  Access Read Write так же удаляет содержимое, даже при Input

Как вариант читать один, а писать во второй
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #9: 18 Октябрь 2020, 17:18 »

М-да. Действительно оба варианта удаляют содержимое.
Значит, и эти мои потуги ни к чему. Ибо вне зависимости от попыток, удаляются ли данные из документа или сам документ, запрос на восстановление всё равно выскакивает.

Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #10: 18 Октябрь 2020, 17:24 »

Проверил просто Open oUrl For Input As #n. Ничего не удаляет.
Однако, мне же нужно найти заменить строчку, вернее удалить её.
Теоретически можно запомнить номер этой строки (Line), закрыть документ, открыть его заново для записи и удалить эти строчки. Но как их запомнить?
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 997


« Ответ #11: 18 Октябрь 2020, 18:13 »

Но как их запомнить?
но вы же сами пример привели, где выводится позиция указателя, установить его можно через seek #n, позиция.
Хотя мне кажется использовать два файла для чтения и записи проще. Читаем первый, если нет интересующей строки пишем ее во второй, если есть не пишем. Закрываем переименовываем
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #12: 18 Октябрь 2020, 18:29 »

Хотя мне кажется использовать два файла для чтения и записи проще. Читаем первый, если нет интересующей строки пишем ее во второй, если есть не пишем. Закрываем переименовываем
Т.е. перекатать все данные, исключая ненужное?!. Круто. Я как-то в таких масшабах не мыслил.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 385


« Ответ #13: 18 Октябрь 2020, 20:24 »

Для пробы, чтобы зря не морочиться, сделал проще. В соседнюю папку положил уже почищенный registrymodifications.xcu и на событие запуск офиса (приложения) повесил макрос, который копирует из соседней папки "чистый" файл в папку user, т.е. подменяет на чистый.

Результата никакого. Запрос на восстановление всё равно выскакивает.
Вот если файл registrymodifications.xcu заранее почистить, сохранить, а уж потом запустить LO, тогда да. Тогда запроса нет. А во время запуска этот способ не работает.

М-да. Нужно, таки, найти способ снять вето с параметра ExistsRecoveryData и попробовать зафелсить его. Может это поможет.

А вот в этих строчках в registrymodifications.xcu, при описании параметров и их значений есть такой параметр op="fuse".
Код:
<item oor:path="/org.openoffice.Office.Recovery/RecoveryInfo"><prop oor:name="Crashed" oor:op="fuse"><value>false</value></prop></item>
"fuse", насколько мне известно, переводится как "предохранитель". Что бы это значило?
Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 298


« Ответ #14: 19 Октябрь 2020, 10:17 »

Т.е. перекатать все данные, исключая ненужное?!

Если будете читать строки из файла - читайте всё в строковый массив через LINE INPUT, тогда и писать обратно будет легче обычным PRINT в цикле по UBound массива. Не используйте всякие GET PUT - они либо не работают, либо пишут лишний мусор в начале строки. Да и SEEK - лишнее усложнение, следить за указателем - то еще удовольствие.

То есть читаем файл и его полностью пересоздаем, на месте.
« Последнее редактирование: 19 Октябрь 2020, 10:20 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1 2 3 4 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!