LO-7.2

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

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

rami

Цитата: Kadet от 29 августа 2021, 22:49rami, жаль, что вы в своей картинке не развинули поле значения переменной URL. Там написано какая именно БД записана в этой переменной - если ваша, то ваша правда, а если Cyanopica4, то у Вас точно висит в фоне ещё моя БД Cyanopica4 и хранит эту глобальную переменную.
Я написал повыше картинки, что это новая база, да и на картинке видно, что в базе нет ни одной таблицы. Я никогда не использую переменные Global.

Цитата: Kadet от 29 августа 2021, 22:34Я точно изменил все упоминания о ThisDatabaseDocument во всех библиотеках автоматической заменой.
Ещё вопрос: как вы переименовывали — "Заменить все" ? Тогда может быть "Ой". Некоторые ThisDatabaseDocument не надо было менять.

Kadet

Цитата: rami от 29 августа 2021, 23:25Ещё вопрос: как вы переименовывали — "Заменить все" ?
Вот так (вложение). И так по всем библиотекам, и глобальным и внутренним.

Цитата: rami от 29 августа 2021, 23:25Тогда может быть "Ой". Некоторые ThisDatabaseDocument не надо было менять.
Почему? Все свои программы я выстраивал из логики, что ThisDatabaseDocument - это переменная созданная мною и поэтому вся работа с ней велась как с обычной переменной. Заменяя автозаменой я просто переименовал все ThisDatabaseDocument в DBDocument. К тому проверял, а небыло ли вариантов типа ".ThisDatabaseDocument" (т.е. - "Object.ThisDatabaseDocument"), в виде методов. Нет, не было. Какие ещё варианты могут быть и что не стоило бы менять?

Kadet

#92
По поводу "почему определяю глобальные переменные по несколько раз".
Сейчас попробовал в своей рабочей БД убрать все дополнительные переопределения, запуск тоже сделал из внутренней. Из глобал Standard, откуда раньше стартовала рабочая БД и где было определение всех глобал-переменных, вообще удалил стартовый модуль. Есть подозрения, что именно там происходило переопределение всех глобал-переменных и там же они сбрасывались в ноль.

В первый раз она нормально стартонула. При всех последующих запусках аутентификацию перестала спрашивать, доступ к БД закрылся, глобальное ID User (записывается в глобал-переменную IDmanager) - потеряло.
Возможно, это не связано с глобальными переменными, а может и связано, пока не понятно. Но, в общем почему-то база перестала работать, хотя стартовые макросы не изменял. "Что-то пошло не так".

В общем, потом поищу собаку, но сдаётся мне, что всё это снова вернёт меня к уже проверенной рабочей старой схеме с определением глабал-переменных в двух местах - во внутри и во вне.

rami

Что у вас в библиотеке ANLib, модуле DIALOGS, строка 1274? ThisDatabaseDocument или DBDocument, если ThisDatabaseDocument, то это ваша переменная или предопределённая? а если DBDocument, где она определяется?

mikekaganski

#94
Тестируя базу из ответа 45 в 7.2.1.1 и в мастере под Win10, я вижу, во-первых, зависание намертво - связанное, по-видимому, с багом в Firebird (жду ответа на комментарий здесь); и во-вторых (после прохождения зависающего места модификацией проблемного пустого файла) - краш, связанный, по-видимому, с багом в Firebird (я, видимо, напишу баг по этому поводу - но это бессмысленно до тех пор, пока не будет исправлен первый баг, где идёт мёртвое зависание).

Появление бага в 7.2 может быть связано с обновлением версии FB. Отсутствие его в Lin/macOS может быть связано с другой версией FB на этих платформах - по крайней мере в Lin наверняка используется системный FB? А на macOS - не знаю, используется встроенный (и тогда непонятно, в чём разница) или "системный" (установленный отдельно)...
С уважением,
Михаил Каганский

rami

Проверьте:

1. если открыть новый текстовый документ .odt, записать в нём что-нибудь, а затем открыть Cyanopica4.odb, выдаёт окошко "Ошибка входа" и зависает намертво.

2. если открыть новый табличный документ .ods, записать в нём что-нибудь, а затем открыть Cyanopica4.odb, грузит в форму чистую таблицу вместо данных, но не виснет.

3. "чистая" загрузка базы происходит быстро и как надо.

Где-то что-то цепляется.

mikekaganski

Цитата: mikekaganski от 30 августа 2021, 09:58Появление бага в 7.2 может быть связано с обновлением версии FB. Отсутствие его в Lin/macOS может быть связано с другой версией FB на этих платформах - по крайней мере в Lin наверняка используется системный FB? А на macOS - не знаю, используется встроенный (и тогда непонятно, в чём разница) или "системный" (установленный отдельно)...

Перечитал этот кусок, и удивился, какой бред я написал.

Код, который я дебажил в FB - специфичный для Windows (относится к file mapping); конечно, даже при использовании той же версии FB на других платформах там будет по-другому...

tdf#144172
С уважением,
Михаил Каганский

Kadet

#97
Пока не читал, сейчас почитаю ответы.
А пока, вот. Rami, по вашему предложению решил разделить определение глобальных переменных.
Малую часть оставил во внутренней библиотеке, а всё остальное, за минусом первых, определяю уже в глобалке в первом модуле, к которому идёт переход из внутренней библиотеки.
Вот определение и стартовый модуль внутренней библиотеки:
Option Explicit

Global DBDocument
Global sDBname$
Global sDBURL$
Global sDBname$

'*************************************************************************
Sub ThisDBDoc(oEvent)
'************************************
DBDocument = ThisComponent
DBDocument.DataSource.Settings.RespectDriverResultSetType = false
sDBname = DBDocument.DataSource.URL
sDBURL=DBDocument.URL
'************************************
If GlobalScope.BasicLibraries.hasByName("ANLib") Then
LoadLib("ANLib", GlobalScope.BasicLibraries)
LoadLib("ANLib", GlobalScope.DialogLibraries)
Else
AddOneLib("ANLib", "ANLib", DBDocument.BasicLibraries, GlobalScope.BasicLibraries, true)
AddOneLib("ANLib", "ANLib", DBDocument.DialogLibraries, GlobalScope.DialogLibraries, false)
LoadLib("ANLib", GlobalScope.BasicLibraries)
LoadLib("ANLib", GlobalScope.DialogLibraries)
DBSave()
End If
'************************************
FDBstart()
'************************************
End Sub

Этот макрос заканчивается переходом в макрос глобальной переменной - FDBstart().
После перехода в глобальную библиотеку я получаю следующее (вложение).

Как видите - глобальная переменная, определённая во внутренней библиотеке - DBDocument в глобале не только пуста, она даже не определена. Отсюда вывод - глобальные переменные в самом документе и в глобале - друг друга не видят. Нет, позозреваю, что если сию махинацию провернуть в обратном порядке (из глобала во внутрь), то переменные будут видны... Глобал, он на то и глобал. А вот из-вну, во-вне - нифига не передаются.
А посему и приходится прибегать к двойному переопределению переменных.

mikekaganski

#98
Цитата: Kadet от 30 августа 2021, 12:02А посему и приходится прибегать к двойному переопределению переменных.

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

Или теперь речь уже не о переопределении предопределённых имён?
С уважением,
Михаил Каганский

Kadet

Повторно определил внутренние переменные в глобале - и, О-ЧЮДО!!!, всё заработало.

mikekaganski

Для того, чтобы использовать глобальные переменные, доступные и в общих библиотеках, и в коде документа:

1. Определяйте глобальные переменные в общих библиотеках.

Пример: "My Macros & Dialogs">Library "Standard">Module "TestGlobalShared":

Option Explicit

Global MyGlobal

Sub TestGlobalSub
 If IsEmpty(MyGlobal) Then
   MsgBox "Empty!"
 Else
   MsgBox "Not Empty!"
 End If
End Sub


2. Из документа используйте квалифицированное имя переменной (с именем общего модуля).

TestGlobalDocument.ODT>Library "Standard">Module "Module1":


Option Explicit

Sub Main
 TestGlobalShared.MyGlobal = Nothing
 TestGlobalShared.TestGlobalSub
End Sub
С уважением,
Михаил Каганский

mikekaganski

Но вообще желательно стараться не использовать такие переменные, и всегда передавать текущий документ в общие методы явно, как аргумент.
С уважением,
Михаил Каганский

Kadet

Цитата: rami от 30 августа 2021, 08:24Что у вас в библиотеке ANLib, модуле DIALOGS, строка 1274? ThisDatabaseDocument или DBDocument, если ThisDatabaseDocument, то это ваша переменная или предопределённая? а если DBDocument, где она определяется?
Она определяется дважды. В первый раз в стартовом макросе внутренней библиотеки - St -> StMod -> DocStart()

Второй раз в первом модуле глобальной библиотеки, к которому обращается программа из внутренней библиотеки - ANLib-> DBStart -> FDBStart()

Kadet

Цитата: mikekaganski от 30 августа 2021, 09:58, видимо, напишу баг по этому поводу
Спасибо! Буду очень признателен.
Возможно действительно, сменили версию FB. Я в своей работе использую версию 3.0. Но к моменту её установки уже тестировалась версия 4.0. И они отличались. Пробовал. Некоторые моменты не проходили, поэтому от неё отказался, до полного выхода.

На выделенной базе версия 3.0, вполне вероятно из-за этого и проблем с ней нет.
Ещё раз - спасибо!

Однако, а почему же тогда в MAK и Linuks этих проблем не наблюдается. Странно.


Kadet

Цитата: rami от 30 августа 2021, 10:21Где-то что-то цепляется.
Ошибка доступа к БД (это моё сообщение) выскакивает тогда, когда не получилось выполнить DB_connect или, таки, не распознавалась эта самая переменная, о которой мы с Вами давно говорим.