LO-7.2

Автор Kadet, 26 августа 2021, 23:20

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

Kadet

Цитата: rami от 30 августа 2021, 10:211. если открыть новый текстовый документ .odt, записать в нём что-нибудь, а затем открыть Cyanopica4.odb, выдаёт окошко "Ошибка входа" и зависает намертво.

2. если открыть новый табличный документ .ods, записать в нём что-нибудь, а затем открыть Cyanopica4.odb, грузит в форму чистую таблицу вместо данных, но не виснет.
Нужно вам доложить, что для LO это нормально и было всегда (кроме зависона). Если перед открытием ЛЮБОЙ моей БД открыт хоть какой другой документ LO, то БД начинает сыпать ошибки. Видимо это потому, что у меня много всяких нужностей висит на загрузку БД... Вешал на БД, а получилось, что на всё LO. Вот и ошибки - ThisDatabaseDocumet не определён, аутентификация не происходит... Отсюда и ошибки.

Kadet

Цитата: mikekaganski от 30 августа 2021, 12:07Да не приходится, а просто Вы решили так сделать. Потому что никто не мешает использовать своё имя для глобальной переменной, и использовать его.

Или теперь речь уже не о переопределении предопределённых имён?
Нет. Речь уже идёт о том, что переменные, определённые во внутренних библиотеках как глобальные, таковыми на самом деле не являются и в глобале уже не видны.

mikekaganski

Цитата: Kadet от 28 августа 2021, 09:31
Любой шаг в сторону, любое выпадение в ошибку - тормоза на 15 мин.

Цитата: rami от 28 августа 2021, 21:31
Я вот что заметил: если из Calc запустить макрос, а в другом модуле этой же библиотеки (пользовательской) будет ошибка, то в LibreOffice 7.2.0.3 виснет офис, а в LibreOffice 5.0.6 сообщает об ошибке без зависаний.

Похоже, я нашёл причину тормозов при отладке (обратите внимание, что это не те проблемы в FB, которые упомянуты в ответе 94 - так что тут целый ворох багов намешан). Написал tdf#144183.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 30 августа 2021, 13:011. Определяйте глобальные переменные в общих библиотеках.
Цитата: mikekaganski от 30 августа 2021, 13:012. Из документа используйте квалифицированное имя переменной (с именем общего модуля).
А так можно было? Спасибо, не знал.
Скажите, а под "общими" библиотеками вы подразумеваете "глобальные" библиотеки? Внутреннике (которые внутри документа) к ним не относятся?

Kadet

Цитата: mikekaganski от 30 августа 2021, 15:26Написал tdf#144183.
Ой-ё... Вот я кашу замутил...

mikekaganski

Цитата: Kadet от 30 августа 2021, 15:30
Скажите, а под "общими" библиотеками вы подразумеваете "глобальные" библиотеки? Внутреннике (которые внутри документа) к ним не относятся?

Да. И вообще было бы странно, если с помощью макросов в документе Вы могли бы внезапно изменить поведение внешних макросов (скажем, переопределив какую-то локальную переменную как глобальную). Поэтому Вы и не можете определить в документе переменную, которая будет видна вне документа.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 30 августа 2021, 15:34Да. И вообще было бы странно, если с помощью макросов в документе Вы могли бы внезапно изменить поведение внешних макросов (скажем, переопределив какую-то локальную переменную как глобальную). Поэтому Вы и не можете определить в документе переменную, которая будет видна вне документа.
О чём я и говорю rami - внутренние переменные, даже определённые как глобальные, на самом деле глобальными не являются. А посему мне приходится определять их дважды - внутри и во вне.

mikekaganski

Цитата: Kadet от 30 августа 2021, 15:32Ой-ё... Вот я кашу замутил...

Такая замута очень полезна - спасибо! (в отличие от неконструктивного ворчания  :P)
С уважением,
Михаил Каганский

mikekaganski

Цитата: Kadet от 30 августа 2021, 15:47внутренние переменные, даже определённые как глобальные, на самом деле глобальными не являются.

Это неверно. "Глобальные" переменные - то есть определённые с использованием ключевого слова Global - отличаются не видимостью, а "поведением" (временем жизни).

Сравните код:


Option Explicit

Global global1
Dim non_global1

Sub sub1
 Dim function_local1

 global1 = 1
 non_global1 = 2
 function_local1 = 3
 sub2
End Sub

Sub sub2
 MsgBox global1
 MsgBox non_global1
 MsgBox function_local1
End Sub


И подумайте, какие будут отличия у трёх разных выводов sub2, если Вы запустите sub2 до первого запуска sub1, или сначала sub1, а потом sub2.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 30 августа 2021, 15:57И подумайте, какие будут отличия у трёх разных выводов sub2, если Вы запустите sub2 до первого запуска sub1, или сначала sub1, а потом sub2.
Ну, что же Вы меня за школяра...

Вопрос ведь в том - переносятся ли переменные, определённые как глобальные во внутренних библиотеках, в макросах глобальных библиотек. Нет. Не переносятся. Приходятся заново их переопределять и заново присваивать им значения.

Kadet

В общем, итогом нашего общения для меня стола - проблема существует, и существует она только в ОС Windows.
А посему - пока стоит вернуться к 7.1.5.2 - и ожидать, когда выйдет следующая версия, в которой, будем надеяться, эти проблемы будут устранены... и поспособствует нам в этом уважаемый mikekaganski, который уже выявил корни проблем и разместил соответствующие сообщения в багзиле. (Хотя я в этих сообщениях вообще ничего не понял).

Kadet

Цитата: mikekaganski от 30 августа 2021, 15:57Сравните код:
Таки, отвечу.
Dim внутри макроса - внутри макроса.
Dim вне макроса - внутри модуля, хотя я предпочитаю определение Public, для наглядности и лучшего понимания.
А вот с Global  - оказался абздац. Я-то предполагал (хотя кажется не только я), что раз уж глобал, то он глобал. А он, оказывается, ограничен областью где определён. Если внутри документа - то только внутри документа, хотя и во всех его макросах, модулях и библиотеках. А вот если в общей области (глобальной) - то тогда везде везде везде и во всех документах.

Kadet

#117
Цитата: mikekaganski от 30 августа 2021, 13:04Но вообще желательно стараться не использовать такие переменные, и всегда передавать текущий документ в общие методы явно, как аргумент.
Основная причина, почему я стал широко использовать глобальные переменные, заключается в том, что в ЛО нет прямой связи между встроенным документом и формой, в которую он встроен. Большинство моих глобальных переменных как раз и носят ссылки на эти документы.
При загрузке мне приходится фиксировать в одной переменной ссылку на открывающуюся форму, а в другой - ссылку на встроенный calc-документ. Мало того, встроенный документ даже приходится выискивать специальным макросом, и то он не всегда находится. Поэтому на форму вешается специальный листенер, который по нажатии мыши на calc таки фиксирует его в этой переменной. Кстати, таких листенеров куча, под каждую форму, и к ним тоже полагаются ещё по 2-3 глобальных переменных... Это уже классика жанра, не моё "изобретение".

В противном случае, если, допустим, нажать на кнопочку, которая создана во встроенном документа, но макрос по этой кнопочке должен взять данные из внешней формы... А прямого пути, типа - Parent/Parent/Parent/... нет. Вот и приходится прибегать к глобальной ссылке. Обратился к этой переменной, взял данные и дальше работай.

В этих случаях прямой передачей в виде аргумента никак не получается.

mikekaganski

#118
Цитата: Kadet от 30 августа 2021, 18:26
Цитата: mikekaganski от 30 августа 2021, 15:57Сравните код:
Таки, отвечу.
Dim внутри макроса - внутри макроса.
Dim вне макроса - внутри модуля, хотя я предпочитаю определение Public, для наглядности и лучшего понимания.
А вот с Global  - оказался абздац. Я-то предполагал (хотя кажется не только я), что раз уж глобал, то он глобал. А он, оказывается, ограничен областью где определён. Если внутри документа - то только внутри документа, хотя и во всех его макросах, модулях и библиотеках. А вот если в общей области (глобальной) - то тогда везде везде везде и во всех документах.

Вот видите, Вы так и не ответили.

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

sokol92

#119
Цитата: Kadet от 30 августа 2021, 19:01А прямого пути, типа - Parent/Parent/Parent/... нет.
А можно совсем небольшой тестовый пример? Документ с кнопочкой и форма, в которую он встроен? Попробуем поискать окольный путь...
Владимир.