LO-7

Автор Kadet, 11 августа 2020, 15:37

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

Kadet

Цитата: kompilainenn от 14 августа 2020, 19:25ох зря Вы спешите, подождите до 7.0.3 хотя бы
Я поспешил за ускорением, которое показывает 7-ка.
На наших некоторых не очень быстрых компах это будет не лишним.

К тому же - прекрасная "разведка боем". Под вечер уже несколько машин работали под 7-й и криков "база поламалась" не было слышно.

Kadet

#46
Народ, помогите понять и решить косяк.
После установки LO7, а может я чего-то накосячил, в одной (и только одной) форме на кнопках появляется картинка фона. И что бы я не делал: создавал новые кнопки, копировал из других форм, копировал саму форму из своей же архивной базы, где они ещё нормальные, переводил кнопки в другой элемент, а затем обратно, но всё равно - после перезагрузки формы они снова получают картинку фона страницы, а надписи на них затираются.
В методе ImageURL кнопки пусто.
Кто-нибудь подскажет что делать? Я играл с фонами и после этого всё это случилось. Где искать причину?

Форма называется "РАСКРОЙ" в приложенной БД.

Kadet

#47
Во время работы в базе многие менеджеры открывают кучу разных документов, выходящих из базы и забывают их закрывать (в общем вешают их в свёрнутые). Так вот, дабы при закрытии базы закрывался и весь "мусор" порождённый ею на закрытие документа Base я поставил следующий макрос:
Sub DBClose()
Dim oDesktop As Object, oDocs As Object, oDoc As Object, oComponents As Object, i%, N
ON LOCAL ERROR GOTO ErrDBClose:
oComponents = StarDesktop.getComponents()  
oDocs = oComponents.createEnumeration()  
Do While oDocs.hasMoreElements()    
ON LOCAL ERROR GOTO ErrNinle111:
oDoc = oDocs.nextElement()
oDoc.Close(true)
ErrNinle111:
ON LOCAL ERROR GOTO 0
Loop
ErrDBClose:
ON LOCAL ERROR GOTO 0
End Sub

Не изобретал его. "Слямзил" где-то в инете.

Так вот, документы типа Write или Calc в принципе закрывает, и то не всегда. А вот когда доходит до первой попавшейся формы Base завершается крахом и перегрузкой. Крах происходит на функции oDoc.Close(true). Хотя, прогоняя пошагово, когда загонял эту функцию (oDoc.Close(true)) в If-ы, заметил, что в принципе эта функция на всех документах заканчивается ошибкой (на ней сразу перескок по error), хотя документы в итоге закрываются. А на первой попавшейся на пути - вообще крах всего LO.

Выложенная выше база открытая, без пароля.

Это глюк LO или в макросе какой-нить косяк?

Kadet

#48
Решил вопрос жёстко (тоже слямзил в инете).
Sub DBClose()
Dim oEnum As Object, oDoc As Object, oSvc as object
ON LOCAL ERROR GOTO ErrDBClose:
oEnum = StarDesktop.getComponents().createEnumeration()
Do While oEnum.hasMoreElements()    
oDoc = oEnum.nextElement()
If HasUnoInterfaces(oDoc, "com.sun.star.util.XCloseable") Then
oDoc.setModified(False)
oDoc.Close(true)
Else
oDoc.dispose()
End If
Loop
StarDesktop.Terminate()
ErrDBClose:
ON LOCAL ERROR GOTO 0
oSvc = createUnoService("com.sun.star.system.SystemShellExecute")
ThisDatabaseDocument.close(true)
wait 2000
oSvc.execute("c:\windows\system32\taskkill.exe", " /F /IM soffice.bin /T" , 0)
End Sub

Крах таки происходит, но тут же жёстко убивается.

sokol92

 Пользователи будут счастливы: этот макрос закроет без сохранения отредактированные ими документы Calc, Writer, ... :)
Владимир.

Kadet

#50
Закроет, конечно.

Именно поэтому этот жёсткий вариант не очень подходит. (Самый крайний случай).

А посему долго крутил и вертел и таки написал тот самый макрос, который чисто закрывает базу и все её порождения, и только её и никакие больше.
Sub DBClose()
Dim oEnum As Object, oDoc As Object, oSvc as object, iLen%, sTit$, sTitle$, sName$
ON LOCAL ERROR GOTO ErrDBClose:
oEnum = StarDesktop.getComponents().createEnumeration()
Do While oEnum.hasMoreElements()    
oDoc = oEnum.nextElement()
sTit = ""
If HasUnoInterfaces(oDoc, "com.sun.star.frame.XTitle") Then
sTitle  = oDoc.Title
sTit = Mid(sTitle, 1, 4)
End If
If sTit=Mid(ThisDatabaseDocument.title, 1, 4) OR sTit="Заяв" OR sTit="Счёт" OR sTit="Това" Then
If sTit=Mid(ThisDatabaseDocument.title, 1, 4) Then
sName = Replace(sTitle, ThisDatabaseDocument.Title & " : ", "")
oDoc = ThisDatabaseDocument.FormDocuments.getByName(sName)
End If
If HasUnoInterfaces(oDoc, "com.sun.star.util.XCloseable") Then
oDoc.setModified(False)
oDoc.Close(true)
Else
oDoc.dispose()
End If
End If
Loop
StarDesktop.Terminate()
ErrDBClose:
ON LOCAL ERROR GOTO 0
End Sub

Однако и у него есть небольшая проблема. Закрывает он всё чисто, но, почему-то, при следующей загрузке спрашивает восстановление. Видимо в всё-таки не очень чисто. Что-то он таки закрывает жёстко. Ну хоть без краха и последующей автоперезагрузки и то уже хорошо.

Kadet

#51
Теперь всё хорошо, только теперь при каждой загрузке выкидывает запрос на восстановление.
Восстанавливать ничего не нужно. Полагаю, что некорректность возникает из-за того, что макрос на закрытие всей базы, вернее первичного главного документа, запускается из второстепенной формы. И получается, что макрос ещё работает, а головная форма закрывается и закрывает всё всё всё, включая и все макросы и этот мактос не успевает корректно завершиться.

Как можно отключить этот запрос? Перерыл инет и ничего не нашёл. Может кто подскажет?

Kadet

#52
Продолжаю монолог. Выключить запрос так и не получилось, но пока оставил это.

Оптимизируя некоторые макросы заметил некоторую мелочь. Есть макрос, который висит на кнопке "Сохранить" в формах заказов.
Sub pCloseForm(oEvent)
Dim oName$
oName = oEvent.Source.getModel().getParent().Name
ModifiedSet(oName, False)
ThisDatabaseDocument.FormDocuments.getByName(oName).Close(true)
End Sub

После этого макроса выполняется другой макрос, который выполняет обновление таблицы заказов в основной форме. Так вот, заметил, что этот макрос (предъявленный выше) всегда заканчивается ошибкой. Однако, при этом, форму он закрывал и следующий макрос нормально запускался (раньше), т.е. функцию свою таки выполнял.
Решил таки переписать его, чтобы он завершался нормально. Сделал так:
Sub pCloseForm(oEvent)
Dim oName$, oDoc
ON LOCAL ERROR GOTO ErrpCloseForm:
oName = oEvent.Source.getModel().getParent().Name
ModifiedSet(oName, False)
oDoc = ThisDatabaseDocument.FormDocuments.getByName(oName)
If HasUnoInterfaces(oDoc, "com.sun.star.util.XCloseable") Then
oDoc.Close(true)
Else
oDoc.dispose()
End If
ErrpCloseForm:
ON LOCAL ERROR GOTO 0
End Sub

Оказалось, что у формы исчез метод Close, зато появился метод dispose (а может и раньше так было, но работало всё немного по-другому), что по сути почти одно и то же. Теперь макрос стал работать правильно и завершается без ошибок. Однако, появилась другая "коза". Пока следующий макрос (обновление таблицы заказов) не отработает, а он весьма долгий, следующую заявку открыть не получается. Вернее она формально открывается, но макросы, которые должны запускаться при её открытии не работают. И пока формирование таблицы заказов не закончится (последующий макрос не закончит свою работу) новую заявку открыть нельзя. Полагаю, что это связано с тем, что хоть предыдущая форма убирается с экрана, в фоне он продолжает работать. Т.е. предыдущая форма полностью закрывается только тогда, когда отработает этот последующий длинный макрос.
Вышел из положения следующим образом:
Sub pCloseForm(oEvent)
Dim oName$
ON LOCAL ERROR GOTO ErrpCloseForm:
oName = oEvent.Source.getModel().getParent().Name
ModifiedSet(oName, False)
ThisDatabaseDocument.FormDocuments.getByName(oName).Close(true)
ErrpCloseForm:
ON LOCAL ERROR GOTO 0
End Sub

Теперь всё работает так, как я задумал. Форма закрывается. Список заявок обновляется. И следующая форма заказа открывается без проблем.
Однако, меня всё же мучает вопрос - ведь это же неправильно. Макрос же должен работать без ошибок, а не просто жёстко вырубая форму.
Возможно эти изменения LO7, а может было и раньше, но только я этого не замечал.

Kadet

В LO7 пропала возможность скопировать значение переменных при шаговой отладке программы.
У меня Win7 b Win10.

rami

#54
Есть такое и на Маке LibreOffice 7.0.1.2. И даже кое-что ещё...

Макрос для примера:
Sub Main
Dim str1 As String
str1 = "это строка"
msgbox(str1)
End Sub


Шаг1: значение переменной str1 = это строка

Шаг2: выделяем (щелчком, без копирования) имя переменной в окне инспектора (значение или тип выделить не получается)

Шаг3: щёлкаем в окошке "Контрольное значение" — в нём появляется имя переменной, а заодно значение переменной меняется на её имя (и в инспекторе и реально в макросе)

Шаг4: смотрим на "новое" значение переменной :o :o :o в msgbox

Если тип переменной числовой, то присваивается 0 (числовое значение строки), другие типы переменных вроде не меняет.

Kadet

#55
Цитата: rami от 29 августа 2020, 20:18Шаг3: щёлкаем в окошке "Контрольное значение" — в нём появляется имя переменной, а заодно значение переменной меняется на её имя (и в инспекторе и реально в макросе)
Во-во. И это тоже заметил. "Лёгким движением руки"... значение превращается в имя.
Переменная и тип никогда не выделялись отдельно, выделялось только значение (что и логично). Функции значения перекочевали на имя.

kompilainenn

бага это, пишите не стесняйтесь
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Kadet

Цитата: kompilainenn от 30 августа 2020, 11:55бага это, пишите не стесняйтесь
Для меня аглицкий это "крамола" и каторга. Rimi, вам мой скрин в подарок на благое дело.

kompilainenn

Цитата: Kadet от 30 августа 2020, 12:45Для меня аглицкий это "крамола" и каторга.
это не мешает Вам использовать на работе ЛибреОфис. Я тоже не силён в английском, гунлтранслятор мне помогает. Пишите самыми короткими фразами и всё будет ок
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Kadet

#59
Цитата: kompilainenn от 30 августа 2020, 13:29гунлтранслятор
И получается как описание на алиэкспресс - с китайского через транслит на аглицкий, а потом с аглицкого через транислит на русский. В итоге - абракадабра.
Хорошо. Сильно мудрствовать не буду. Как получится, так и будет.