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

Главная категория => Calc => Тема начата: Kadet от 16 февраля 2022, 18:48

Название: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 16 февраля 2022, 18:48
Добрый день!
Прошу проконсультировать по следующему вопросы.

Снова написал пару корявых макросов.
Рисую разноцветные прямоугольнички на странице calc.
Пока масштаб сетки в стандарте всё рисуется хорошо, по-запрограммированному (img1).
Как только меняю масштаб сетки листа calc то всё плывёт (img2).

Абсолютные и фиксированными координаты являются только первичные (X,Y), в примере: X=1000; Y=2000.
Все остальные координаты деталей выстраиваются и вычисляются относительно этих первичных (X,Y).

В демке данный косяк лучше всего видно при задании: "форма фермы" - 2 или 4. "Тип решётки" - любой, хотя самый наглядный - 44.
При смены "формы" - стирается весь рисунок. При смене типа решётки меняется только внутренняя решётка.

Чтобы увидеть эффект нужно вначале прорисовать какую-нибудь ферму в стандартной сетке. Затем изменить масштаб сетки (соответствующей кнопкой - 500х500) и перерисовать тоже самое уже в новом масштабе.

Так вот вопрос:
Почему так происходит и как с этим бороться.

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

Заранее спасибо!
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 16 февраля 2022, 21:14
Не могу воспроизвести на Version: 7.3.1.1 (x64) / LibreOffice Community
Build ID: 349cd3ad57dce98d6b54b76f8e9f456ac7d7edb7
CPU threads: 12; OS: Windows 10.0 Build 19044; UI render: Skia/Raster; VCL: win
Locale: en-US (ru_RU); UI: en-US
Calc: CL

Хотя артефактов типа дрожащих кнопок и отсутствия содержимого диалогов и меню хватает :)
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 16 февраля 2022, 21:46
М-да. Я так и думал.

Я ловлю этот косяк на:
Version: 7.3.0.3 (x86) / LibreOffice Community
Build ID: 0f246aa12d0eee4a0f7adcefbf7c878fc2238db3
CPU threads: 2; OS: Windows 6.1 Service Pack 1 Build 7601; UI render: Skia/Raster; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: threaded

Завтра попробую на W10(64), на другой машине. Вероятнее всего там она тоже не проявится, как и у вас.

Давно уже периодически, на машинах с разными характеристиками абсолютные координаты бывает плывут. Чаще всего это связано именно с масштабированием ячеек. Даже если не всё масштабировать, а лишь некоторые столбцы или строки. Рисунок может уплыть.
У одного моего заказчика есть ноут с усиленными графическими характеристиками (точно не могу сказать какими). Так вот у него много чего плывёт. И никак поправить это я не могу. Потому что на других компах, на которых я могу тестировать этой ошибки нет.
Думал, что это результат каких-нибудь графических наворотов.

А тут попался на масштабировании. К тому же только на 32-битной разрядности.
В общем, завтра проверю и сообщу.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 16 февраля 2022, 22:01
А исследовать ошибку всё равно придётся на домашнем.
Интересно, как поймать где и как идёт смещение абсолютных координат при масштабировании?

Причём смещению подвергаются не все элементы. Скажем "стойки" (синие вертикали), судя по всему имеют правильное положение. И в самом треугольнике (красные) длинная нижняя горизонтальная и левая косая - имеют ошибку, а правая косая - имеет правильное положение. Это видно когда меняя масштаб перерисовываешь одну и ту же красную фигуру.

Т.е. проблема проявляется не во всех объектах и не со всеми координатами.
В общем завтра покручу и поверчу это. Авось накопаю чего-нибудь.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: rami от 17 февраля 2022, 11:01
Цитата: mikekaganski от 16 февраля 2022, 21:14
Не могу воспроизвести на Version: 7.3.1.1 (x64) / LibreOffice Community
У меня воспроизводится и на 7.2.4.1 и на 7.3.1.1

Воспроизводить нужно на минимально воспроизводимом примере, а не на "этом вот этом вот всем" ;D

Для отрисовки фигуры расчёты не нужны, хватит одной фигуры с фиксированными размерами:

1. в приложенном документе рисуем фигуру (кнопка Draw)
2. меняем размер ячеек (кнопка 500x500)
3. рисуем вторую фигуру (кнопка Draw)
4. фигуры не совпадают, хотя все размеры одинаковы

5a. если выделить "Rectangle_1" (двойным щелчком Навигаторе), затем нажать Shift+стрелка вниз и Shift+стрелка вверх, то фигуры совмещаются.
5b. если выделить "Rectangle_2" (после создания новых фигур), затем нажать Shift+стрелка вниз и Shift+стрелка вверх, то фигуры не совмещаются.

Кнопки: Standard — стандартный размер ячеек, RemoveAll — удалить фигуры.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 11:11
Цитата: rami от 17 февраля 2022, 11:01
Воспроизводить нужно на минимально воспроизводимом примере, а не на "этом вот этом вот всем" ;D

+100500!
Repro. Нужен баг! (ц)

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

Короче, прекрасный демонстратор бага.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 11:53
О горе, это регрессия от Армина (https://bugs.documentfoundation.org/show_bug.cgi?id=147487) :(
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 14:30
Спасибо за содействие!

Проверил на своей рабочей машине, где W10(х64). Косяк проявляется.
Т.е. от разрядности это не зависит.

Version: 7.3.0.3 (x64) / LibreOffice Community
Build ID: 0f246aa12d0eee4a0f7adcefbf7c878fc2238db3
CPU threads: 2; OS: Windows 10.0 Build 19042; UI render: Skia/Raster; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: threaded
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: rami от 17 февраля 2022, 15:43
Цитата: Kadet от 16 февраля 2022, 18:48мне нужно изменить масштаб, хочется, красивая тетрадная клетка получается и работать в ней в некоторых моментах удобней, чем в стандарте.
Можно "обойти" этот баг:

1. можно сделать шаблон "тетради в клеточку для 5 класса" с макросами и использовать его для новых документов.
2. в вашем исходном документе после отрисовки всех деталей сгруппировать их в группу, это предотвратит "расползание".
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 15:44
Ох, а косяки с меню, диалогами и дрожанием кнопок на Windows - это другая регрессия от того же Армина (https://bugs.documentfoundation.org/show_bug.cgi?id=147490) :(
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 16:09
Цитата: rami от 17 февраля 2022, 15:43Можно "обойти" этот баг:

1. можно сделать шаблон "тетради в клеточку для 5 класса" с макросами и использовать его для новых документов.
2. в вашем исходном документе после отрисовки всех деталей сгруппировать их в группу, это предотвратит "расползание".
Я всё изначально рисовал в стандарте. А потом попробовал клетку. И поплыло. Т.е. - думаю таки в стандарте правильно, а в клетке - косяки, на которрые нужно выставлять сразу какие-то корректирующие коэффициенты. Найти бы их.

По 2-му пункту. Было бы хорошо, но клетку я делаю изначально, перед началом рисования... Как фон. Прикольнентко так получается. Дизайн такой родной и ностальгический для всех... приятный.
А после масштабирования - уже идёт "плаванье". А рисовать, а потом масштабировать не получается. Ведь люди могут рисовать сначала одно, потом пробовать другое, третье. Пока не найдут что-нибудь для себя удобоваримое.
Т.е. - однозначно, сначала масштабирование, затем рисование.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 16:19
Цитата: rami от 17 февраля 2022, 15:431. можно сделать шаблон "тетради в клеточку для 5 класса" с макросами и использовать его для новых документов.
Поразмышлял. Нет не получится. У меня же, как всегда, калк в виде вложения в форму БД и всегда создаётся сызнова при каждом новом запуске сей формы. И шаблоном пользоваться не получается... Либо таскать этот шаблон вместе с установочными архивами самой базы. Не хотелось бы.

Я надеюсь, что в те времена, как моя БД созреет к работе, творцы таки решат эту проблему. Я не тороплюсь. Ещё много работы с БД. Обычно Михаил быстро решает подобные вопросы, за что ему большое человеческое спасибо! А у меня ещё время есть, думаю с месяц.
В общем, подождём.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 16:27
Цитата: Kadet от 17 февраля 2022, 16:19Обычно Михаил быстро решает подобные вопросы

Э, нет, тут я ничего не сделаю. Если автор бага не исправит - его грандиозные изменения не поддаются расшифровке.

Цитата: Kadet от 17 февраля 2022, 16:09Т.е. - думаю таки в стандарте правильно, а в клетке - косяки, на которрые нужно выставлять сразу какие-то корректирующие коэффициенты. Найти бы их.

Никаких коэффициентов искать не надо. Это косяк исключительно отрисовки - при обновлении он исправляется сам. Будете применять коэффициенты - начнёте действительно делать другую геометрию.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: rami от 17 февраля 2022, 16:34
Цитата: mikekaganski от 17 февраля 2022, 15:44Ох, а косяки с меню, диалогами и дрожанием кнопок на Windows
На Маке этого нет, но есть другое:
1. после нажатия на кнопки, их цвет становится более тёмным. Исходный цвет возвращается после перехода в другое окно или прокрутки листа (после перерисовки кнопок)
2. цвет рамки активной ячейки (на обоих снимках E3) сделали как цвет подсветки столбцов и строк (изменяется в "Системных настройках"), а должен быть чёрный. Я могу сделать его чёрным, тогда подсветка во всех других программах станет страшная :o.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 16:39
Цитата: rami от 17 февраля 2022, 16:34цвет рамки активной ячейки (на обоих снимках E3) сделали как цвет подсветки столбцов и строк (изменяется в "Системных настройках"), а должен быть чёрный.
Это совсем другое (https://wiki.documentfoundation.org/ReleaseNotes/7.3#General_improvements_2) - реализовано Натальей Гавриловой в tdf#142121 (https://bugs.documentfoundation.org/show_bug.cgi?id=142121) :)
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 16:56
Цитата: mikekaganski от 17 февраля 2022, 16:27Э, нет, тут я ничего не сделаю. Если автор бага не исправит - его грандиозные изменения не поддаются расшифровке.
Ура, значит я не одинок в зашифровке кодов. :))))
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 17:06
Ну, раз пошла движуха по драву в калке, хочу поделиться ещё одним интересным наблюдением.

Вот, допустим, мой макрос по рисованию прямоугольника.
Вот, сокращённая версия:
'***************************************************************************************************************
Sub DrawKvadro(xDoc, index%, Xpoz&, Ypoz&, Xsm&, Ysm&, width, color&, Fillcolor&, sName$, fShad, Optional iLayer%, Optional iLineDash&, Optional iFill&, Optional oName$, Optional iRotate%)
...
xPage = xDoc.DrawPages(index)
' Первая линия ********************************
xShape = xDoc.createInstance("com.sun.star.drawing.RectangleShape") ' Прямоугольник
xShape.LayerID = iLayer '(1)-Задвинуть за текст; (0)-Перед текстом
xShape.Shadow = fShad

If Not IsMissing(iRotate) Then xShape.RotateAngle = iRotate

...
xShape.LineColor = color
xPage.add(xShape)
...
End Sub

Вот в таком виде поворот по RotateAngle, заполненный ещё до создания объекта в странице, то поворот будет осуществляться относительно координат верхнего левого угла прямоугольника. Даже если использовать минусовые смещения по X и Y, всё равно будет браться верхний левый угол прямоугольника, образованного уже после пересчёта минусовых координат.

А вот если сделать вот так:
'***************************************************************************************************************
Sub DrawKvadro(xDoc, index%, Xpoz&, Ypoz&, Xsm&, Ysm&, width, color&, Fillcolor&, sName$, fShad, Optional iLayer%, Optional iLineDash&, Optional iFill&, Optional oName$, Optional iRotate%)
...
xPage = xDoc.DrawPages(index)
' Первая линия ********************************
xShape = xDoc.createInstance("com.sun.star.drawing.RectangleShape") ' Прямоугольник
xShape.LayerID = iLayer '(1)-Задвинуть за текст; (0)-Перед текстом
xShape.Shadow = fShad

...
xShape.LineColor = color
xPage.add(xShape)

If Not IsMissing(iRotate) Then xShape.RotateAngle = iRotate

...
End Sub

Т.е. - поворот по RotateAngle поставить уже после создания самого объекта, то вращение будет производиться относительно центра самой фигуры.

Вот такие вот чудеса, которые желательно учитывать на практике.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: rami от 17 февраля 2022, 17:35
Цитата: Kadet от 17 февраля 2022, 16:09По 2-му пункту. Было бы хорошо, но клетку я делаю изначально, перед началом рисования... Как фон. Прикольнентко так получается. Дизайн такой родной и ностальгический для всех... приятный.
А после масштабирования - уже идёт "плаванье". А рисовать, а потом масштабировать не получается. Ведь люди могут рисовать сначала одно, потом пробовать другое, третье. Пока не найдут что-нибудь для себя удобоваримое.
Т.е. - однозначно, сначала масштабирование, затем рисование.
Мне кажется, что вы меня не поняли, я предлагал нарисовать и сразу же сгруппировать  все фигуры, после группировки они не будут расползаться друг относительно друга при изменении ячеек, но наверно, будут смещаться как единое целое относительно листа, но это должно быть не заметно.

Или я не понимаю некоторые нюансы?
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 18:33
Наверное я не могу правильно объяснить.
Дело в том, что ошибка координат появляется уже после масштабирования страницы (изменения размера сетки). И уже потом - рисуй, не рисуй, а координаты уже будут искажены.
Этот эффект можно посмотреть в моей полной демке, где рисуются сразу несколько прямоугольников. И сразу видно, что они друг в друга не попадают, т.е. тот же треугольник (кн.2) или трапеция (кн.4) уже рисуются со смещениями и друг в друга не попадают. И последующие элементы (раскосы и стойки) тоже плывут, стартуют не там, и выходят за границы.

Т.е., я о чём если бы при "клетке" возможна была правильная прорисовка, то я бы использовал вашу идею. Да... и не нужна бы она была при этом. Потому что смена масштаба должна делаться один раз при загрузке и затем уже не меняться.

А так.... Не получается. В вашей демке с одним прямоугольником это понять трудно. Попробуйте ещё раз протестить мою демку, расширенную. Там это должно проявляться.

Или в моих картинках из первого поста. Тут смена масштаба происходит при загрузке самого документа, а уж потом всё рисуется в том масштабе, который установлен при загрузке. И если в стандартном масштабе (img1) треугольник он и есть треугольник. То в масштабе "клетка" (img2) - уже не треугольник, а... картина Пикассо. Кубизм какой-то. "Художник так видит"...
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 18:54
Оффтопик.

Цитата: rami от 17 февраля 2022, 16:342. цвет рамки активной ячейки (на обоих снимках E3) сделали как цвет подсветки столбцов и строк (изменяется в "Системных настройках"), а должен быть чёрный. Я могу сделать его чёрным, тогда подсветка во всех других программах станет страшная :o.

Кстати, а не могли бы Вы показать скрин другой программы, в которой нормальная подсветка? И заодно настройку в системе. Я надеюсь увидеть какую-то обработку системного цвета типа "использовать этот цвет, но сделать его на 30% темнее". Вероятно, нам просто надо сделать так же, и проблема будет исправлена.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: rami от 17 февраля 2022, 19:40
Цитата: Kadet от 17 февраля 2022, 18:33И уже потом - рисуй, не рисуй, а координаты уже будут искажены.
Этот эффект можно посмотреть в моей полной демке, где рисуются сразу несколько прямоугольников. И сразу видно, что они друг в друга не попадают, т.е. тот же треугольник (кн.2) или трапеция (кн.4) уже рисуются со смещениями и друг в друга не попадают. И последующие элементы (раскосы и стойки) тоже плывут, стартуют не там, и выходят за границы.
mikekaganski правильно написал, что это исключительно косяк отрисовки:
Цитата: mikekaganski от 17 февраля 2022, 16:27Никаких коэффициентов искать не надо. Это косяк исключительно отрисовки...
Попробуйте ещё нарисовать "какой-то кубизм" (в вашем документе), а затем в меню "Вид" переключить на "Разметка страниц" и обратно "Обычный", "кубизм" должен превратиться в "соцреализм" ;D

Сделайте:
1. откройте документ и нажмите кнопку "500x500"
2. в меню "Вид" переключите на "Разметка страниц" и обратно "Обычный"
3. нажмите кнопку "4" и "44" — должно получиться правильно
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 20:32
Цитата: rami от 17 февраля 2022, 19:40Сделайте:
1. откройте документ и нажмите кнопку "500x500"
2. в меню "Вид" переключите на "Разметка страниц" и обратно "Обычный"
3. нажмите кнопку "4" и "44" — должно получиться правильно
Да. Попробовал.
НО, при всём "кажущемся" переходе в соцреализм, всё равно - тонко завуалированный "кубизм"... Он проглядывается в выделенным корявым жёлтым овале.Присмотритесь. В "правильном" варианте, при стандартном масштабе (img11) все зелёненькие и синенькие линии "ловко" прячутся под красненькие. И не выперают из под них. Я долго этого добивался.

А вот в кубизме, сделанном по вашим рекомендациям, они всё равно выперают. И никакими манипуляциями представлением страницы они не исправляются. А это значит, что не смотря ни на камке манипуляции ошибка всё таки остаётся. На самом деле она не исправляется.
Я ранее писал, а теперь думаю так - изначально из трёх сторон треугольника - две корявые, а третья не корявая. А после манипуляций - просто корявят все три. Но не исправляются.

К тому же, обратите внимание на (img13). Это вид продукта, который я предполагаю представить пользователям моего продукта. Т.е. - они должны работать лишь с теми инструментами, которые даю им я, а не штатными ЛО. Все стандартные меню убраны. В понимании пользователей это - не какой-то продукт офиса ЛО, а отдельная самостоятельная программа.

Да и представьте как посмотрит на меня заказчик, если я ему начну объяснять, что "для того, чтобы увидеть правильную картинку нужно выполнить следующие пункты"... Клиент только покрутит пальцем у виска...
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 20:42
Но, раз уж этот баг оказался настолько серьёзным и требует привлечения весьма серьёзных, замудрённых и занятых авторитетов,..
Попробую таки отказаться от задуманных фендиперсов и реализовать требуемое в стандартном масштабировании, без выпендрёжей.
Как известно: "Нормальные герои всегда идут в обход" (к/ф "Айболит-66")

А потом... поживём - увидим. Авось всё изменится.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: rami от 17 февраля 2022, 22:14
Цитата: mikekaganski от 17 февраля 2022, 18:54Кстати, а не могли бы Вы показать скрин другой программы, в которой нормальная подсветка? И заодно настройку в системе. Я надеюсь увидеть какую-то обработку системного цвета типа "использовать этот цвет, но сделать его на 30% темнее". Вероятно, нам просто надо сделать так же, и проблема будет исправлена.
На первом снимке три программы (названия подписаны красным) с подсветкой выделенного (текста, картинки в Сафари, строк, столбцов и активной ячейки в LibreOffice).
Я пользуюсь "другим цветом", его можно настроить любым. Видел в обсуждениях намерение сделать рамку активной ячейки в соответствии с цветовым акцентом (у меня синий, на снимке подписан как "Многоцветный"), а не как цвет выделения (бледно-сиреневый). Это было бы хорошо.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 22:31
Кстати, вот с оказией хочу сообщить, что после последнего обновления ещё одна кракозябра вылезла.
Я не сильно обращал на это внимание. К тому же не бил в колокола. Просто подстроил макросы под новые реалии и пошёл дальше.

Однако.

Вот у меня, к примеру, есть такой макрос:
'Скрытие строк *********************************************************
Sub HideRows(oDoc, oSheet, StartRow%, EndRow%, Optional bFlag As Boolean)
Dim document As Object, dispatcher As Object, oController As Object, oRange As Object

document = oDoc.CurrentController.Frame
oController = oDoc.CurrentController
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Deselect", "", 0, Array())

oRange = oSheet.getCellRangeByPosition(0, StartRow, 60, EndRow)
If NOT bFlag Then oRange.clearContents(1023)
oController.select(oRange)
dispatcher.executeDispatch(document, ".uno:HideRow", "", 0, Array())
End Sub

Он скрывает строки в документе калк.
Так вот, у меня есть подозрение, что Optional  в 7.3 вообще перестал работать. И его смысл полностью обесценился.
Потому что ранее, при вызове этого макроса следующим образом:
HideRows(oDoc, oSheet, oStartRow, oEndRow)
Этот макрос прекрасно работал.
А сейчас на строке:
If NOT bFlag Then oRange.clearContents(1023)
Выдаёт ошибку. Т.е. - требует явного прописания переменной bFlag, которая является ориенталом. И такая беда случилась со всеми моими ориенталами, а у меня их не мало.
Возможно, я что-то неправильно понял смысл ориенталов, неправильно написал код, но теперь мне приходится явно прописывать значения всех ориенталов в моих базах. И они, получаются, просто бессмысленными. Потому что эти переменные всё равно приходится явно задавать при вызове мароса.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 22:49
Цитата: Kadet от 17 февраля 2022, 22:31

Sub HideRows(oDoc, oSheet, StartRow%, EndRow%, Optional bFlag As Boolean)
...
If NOT bFlag Then oRange.clearContents(1023)
...
End Sub


Вы совершенно неверно пользуетесь Optional. Ну, и Ваш код зависит от бага (https://bugs.documentfoundation.org/show_bug.cgi?id=144353), который исправлен в 7.3. А именно - нельзя обращаться к значению незаданной опциональной переменной, у которой нет значения по умолчанию (доступно при Option Compatible), кроме как с помощью IsMissing (https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03104000.html?DbPAR=BASIC). Такой код, как у Вас, должен выглядеть примерно так:


Sub HideRows(oDoc, oSheet, StartRow%, EndRow%, Optional bFlag As Boolean)
...
If IsMissing(bFlag) Then bFlag = False ' Установка значения по умолчанию
If NOT bFlag Then oRange.clearContents(1023)
...
End Sub


Или так:


Option Compatible

Sub HideRows(oDoc, oSheet, StartRow%, EndRow%, Optional bFlag As Boolean = False)
...
If NOT bFlag Then oRange.clearContents(1023)
...
End Sub


А так Вы ожидаете, что опциональный незаданный аргумент типа Boolean вдруг всё-таки имеет какое-то значение. Это, кстати, так в VBA, но не в StarBasic, где допускается незаданный опциональный аргумент фиксированного типа.

См. также эту ветку (https://forumooo.ru/index.php/topic,8763.0.html), в которой я сначала тоже ожидал значения по умолчанию у незаданных аргументов :)
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 22:58
Ну, я об этом как раз и подозревал, что неправильно пользуюсь ориенталом. Причём с самого начала подозревал.
Но меня успокаивало, что раз мотор ЛО пропускает такую "наглость", то значит тут это допустимо.
А теперь - нет.

Этот вариант мне нравится больше. Он короче.
Цитата: mikekaganski от 17 февраля 2022, 22:49Sub HideRows(oDoc, oSheet, StartRow%, EndRow%, Optional bFlag As Boolean = False)
Спасибо за пояснения.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 23:16
Хотя, с другой стороны. Вот вы считаете это "исправлением бага", а я считаю это возвратом к архаичности, к домамонтовским временам, когда ядро языка было настолько тупым и требовало всё явно прописывать и обозначать. Вплоть до разрядностей и размеров переменных.
"Как далеки они были от народа" (В.И.Ленин)

Ведь, при описании макроса, его входных параметров-переменных, я явно задаю, что эта переменная, хоть она получает значение от вызова или нет - она всё рано имеет тип Boolean и по-умолчанию должна приобретать значение false. Почему же она, вопреки здравму смыслу, при явном её описании внутри макроса, приобретает значение неопределённости? Она же явно описана как Boolean.
Я считаю это неправильным. Возвратом к старине дремучей.

Такое же мнение у меня и по-поводу предыдущего нашего спора о формировании строковых переменных из цифровых.
Помните: ("Строка" & Vr/100), которое потом пришлось прописывать явно: ("Строка" & Str(Vr/100)).
Это тоже возврат ко временам доисторического материализма.

Мне кажется ядро языка должно быть как можно ближе к человеческим, а не вовращаться к машинным методам мышления.
Всё таки машина должна подстраиваться под человека, а не человек под машину. Даже к такому корявомыслящему как я.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 23:25
Я посмеялся.

Вы описали просто одно из возможных архитектурных решений. И это решение принято в VBA, где действительно опциональный фиксированного типа аргумент принимает значение по умолчанию. И более того, ЛО поддерживает такую работу - в режиме Option VBASupport 1. А ещё ЛО поддерживает два других режима: нативный и с Option Compatible, и оба дают свои возможности, отсутствующие в VBA (то есть опциональный аргумент в не-VBA режиме богаче).

И Ваш "возврат к архаичности" - это дополнительные возможности, которые любители "прогресса" считают ненужными, потому что не понимают.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 17 февраля 2022, 23:30
Не понимаю в чём тут "дополнительные возможности".
Конечно, я далёк от глубинного понимания и познания StarBasic. Возможно, он действительно уже приближается к совершенству с широчайшими возможностями.
Но мне, как обывателю и дилетанту, подобные изменения кажутся не более чем дополнительными палками в колёса, от которых, в моём понимании, лучше избавляться, чем приобретать и усугублять.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 17 февраля 2022, 23:36
Дополнительные возможности - это возможность отличить состояние "не задано" от "False" и от "True". В нативном режиме у опционального Boolean три состояния; у опционального Integer - 65537 значений. Вы не обязаны хотеть для отсутствующего значения делать что-то совпадающее с заданным значением: например, у функции флаг может быть "стереть/не стирать", а при незадании функция может выдать диалог. И Вы передаёте True или False, когда знаете, какое действие нужно; а когда нужно спросить пользователя - не передаёте.

Или, скажем, параметр - цвет. И можно передать конкретный цвет, а незаданное значение - прочитать из файла конфигурации. И т.п. Насколько фантазии хватит.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: eeigor от 18 февраля 2022, 06:56
Цитата: mikekaganski от 17 февраля 2022, 22:49А так Вы ожидаете, что опциональный незаданный аргумент типа Boolean вдруг всё-таки имеет какое-то значение. Это, кстати, так в VBA, но не в StarBasic, где допускается незаданный опциональный аргумент фиксированного типа.
Именно так. Обратите внимание на слово "фиксированного". Теперь я всегда задаю тип опциональных агрументов. (https://forumooo.ru/index.php/topic,8763.msg60886.html#msg60886) Понимание приходило медленно из-за имеющегося многообразия. Читайте вот эту (https://git.libreoffice.org/core/+/8e323fcacebad1afe9d867b846722a6b9bf20f78) важную ссылку от Михаила о трёх режимах работы. Это как памятка - надо перевести и усвоить.


Edit: Перевод Памятки

Инициализируйте значения по умолчанию необязательных (optional) парметров в заголовках функций <правильно>.

1. В LO Basic разрешены необязательные параметры, но без каких-л. значений по умолчанию. Отсутствующие параметры также не будут инициализированы соответствующими значениями по умолчанию для своего (зд. выбранного пользователем) типа данных.

<Добавление от меня. Но выбранный тип данных фиксируется. То есть Вы не сможете присвоить значение 2 (integer) логическому типу данных (boolean), если тип данных необязательного параметра был задан (As Boolean). Это хорошо, так как уменьшает объём проверок (валидации) входных данных. В использованном примере аргумент получит значение 1 (True), а не 2.>

2. С опцией Compatible разрешены необязательные параметры со значениями по умолчанию. Отсутствующие необязательные параметры, которые не имеют явных значений по умолчанию, не будут инициализированы значениями по умолчанию для своего типа данных.

3. С опцией VBASupport разрешены необязательные параметры со значениями по умолчанию. Отсутствующие необязательные параметры, которые не имеют явных значений по умолчанию, будут инициализированы значениями по умолчанию для своего типа данных.

Примечание. В VBA мы должны использовать тип Variant, чтобы выполнить с использованием функции IsMissing() проверку на отсутствие параметра. В LO Basic тип данных может быть любым.


P.S. Будем надеяться, что теперь этот сложный вопрос разъяснён. Для тех, кто читает и сможет найти ответ здесь (вот нет у нас "копилки").
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 14:48
Спасибо за пояснения.
Ну, в объяснениях вы всё упираете в тройственное значение логического типа. Это ясно. Хотя и само по-себе тройственное значение, в моём понимании, полезно лишь при графическом восприятии этого типа, вроде ChekBox. А вот с точки зрения обычного программирования тройственность типа Boolean кажется всё же избыточной.
Но, род один тип должен быть одинаковым сквозняком на весь язык, то ладно.

Но если рассмотреть данный вопрос с другого ракурса.
Допустим есть у меня такой, весьма пользуемый, нужный и важный макрос:
Sub WriteTable(oSheet AS Object, oRow%, oCol%,_
Optional Var0 As Variant, Optional Var1 As Variant, Optional Var2 As Variant, Optional Var3 As Variant,_
...
Optional Var28 As Variant, Optional Var29 As Variant, Optional Var30 As Variant, Optional Var31 As Variant)

If IsNumeric(Var0) Then
If Var0 <> 0 Then oSheet.getCellByPosition(oCol+0, oRow).setValue(Var0)
Else
If Var0 <> "" Then oSheet.getCellByPosition(oCol+0, oRow).setString(Var0)
End If

...

If IsNumeric(Var31) Then
If Var31 <> 0 Then oSheet.getCellByPosition(oCol+31, oRow).setValue(Var31)
Else
If Var31 <> "" Then oSheet.getCellByPosition(oCol+31, oRow).setString(Var31)
End If

End Sub

Он нужен для правильного занесения данных в ячейки. В частности цифры нужно заводить в ячейку по Value потому как строчные потом не суммируются и не работает математика с ними, а если строку завести в Value, то в ячейке получаем - 0. Поэтому и нужны эти проверки и разделение.И этот макрос у меня использует масса других макросов и разными данными. Т.е. - любая из этих переменных var1...var31 может принимать тип и цифровой и строковый в разных ситуациях.
Раньше представленный выше вариант прекрасно работал, т.е. проверял неопределённую переменную на нумерик или нет и делал своё дело.

А теперь нужно делать дополнительный наворот.
Sub WriteTable(oSheet AS Object, oRow%, oCol%,_
Optional Var0 As Variant, Optional Var1 As Variant, Optional Var2 As Variant, Optional Var3 As Variant,_
...
Optional Var28 As Variant, Optional Var29 As Variant, Optional Var30 As Variant, Optional Var31 As Variant)

If NOT IsMissing(Var0) Then
If IsNumeric(Var0) Then
If Var0 <> 0 Then oSheet.getCellByPosition(oCol+0, oRow).setValue(Var0)
Else
If Var0 <> "" Then oSheet.getCellByPosition(oCol+0, oRow).setString(Var0)
End If
End If

...

If NOT IsMissing(Var31) Then
If IsNumeric(Var31) Then
If Var31 <> 0 Then oSheet.getCellByPosition(oCol+31, oRow).setValue(Var31)
Else
If Var31 <> "" Then oSheet.getCellByPosition(oCol+31, oRow).setString(Var31)
End If
End If

Не сильно понимаю для чего надобны подобные дополнительные многоэтажности.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 18 февраля 2022, 15:01
"Ок, вы мне всё объяснили. Но я возьму и повторю свою точку зрения, как будто ничего не слышал, используя классический приём ad nauseum. Пусть выглядит, как будто это новый аргумент, а отвечающие всё равно не будут повторять то же самое, и будет выглядеть, что за мной последнее слово :) "
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: kompilainenn от 18 февраля 2022, 15:10
Насчет проблемы цвета выделения ячеек в macOS - была вроде тема, что это как-то связано с версией Xcode и macOS где собирается Либре Оффисе, не? И вот недавно вроде наши сборочные машины обновили
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 18 февраля 2022, 15:27
Не :)
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: kompilainenn от 18 февраля 2022, 15:28
Цитата: mikekaganski от 18 февраля 2022, 15:27
Не :)
Heko: The issue is relevant for macOS only. It's caused by the fact that we read some old environment variable for highlight. The solution requires macOS baseline at 10.14 or so, which is planned for 7.4. Meanwhile you can adjust the colors via tools > options > app color.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 18 февраля 2022, 16:07
Да, цитата правильная. Но совершенно не связана с версией xcode и сборочной машиной. Речь о поддерживаемых версиях оси. В минимальной поддерживаемой версии нет параметра, который нам нужен. Правда, мне неясно почему нельзя это определить в рантайме и прочитать в зависимости от текущей операционки - но я некомпетентен в macOS.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 16:19
Цитата: mikekaganski от 18 февраля 2022, 15:01Ок, вы мне всё объяснили.
Давайте поставим правильные акценты - "Вы ПЫТАЛИСЬ мне всё объяснить", но не факт, что я всё правильно понял из ваших объяснений.
Вы снова меряете мир своим мерилом и не допускаете возможности, что некоторые мыслят несколько другими понятиями, категориями и рамками.
Допустим используемое вами в объяснениях словечко "нативный" - мне абсолютно не понятно. Даже после пояснений от яндекса...

Ах, да ладно. Оставим. Не суть важно всё это... ни мне ни вам.
Сказали - надо делать так, и идти в то стойло... будем делать и идти.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: eeigor от 18 февраля 2022, 16:43
Цитата: Kadet от 18 февраля 2022, 16:19используемое вами в объяснениях словечко "нативный" - мне абсолютно не понятно
"Native" означает "родной", короче "свой", то есть не требующий доп. преобразований, используемый "как есть", если речь о каких-то параметрах. Но нативной может быть и среда: LO Basic без параметров Compatible & VBASupport, как я это понимаю.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 19:18
Спасибо за пояснения.
Вот в этом применении этого понятия - понимаю.
Цитата: eeigor от 18 февраля 2022, 16:43Но нативной может быть и среда: LO Basic без параметров Compatible & VBASupport, как я это понимаю.

А вот если наложить это понятие на переменные, в свете с нашими рассуждениями, о переставании понимания даже типизированного ориентала - не понимаю. Что тогда можно считать "своими", как я понял - "по-умолчанию", значениями.
Или к переменным это понятие не применялось в контексте обсуждения?

Ну, да Бог и ним. Не во всём разобрался, но почему-то кажется, мне пока не слишком важно всё это.

Всё же, публично извиняюсь если кого обидел своими манерами. Не хотел.
А отреагировал на эти изменения вот почему.
В последнее время всё чаще и чаще стал сталкиваться с неопределёнными переменными, которые при их проверках начинают вылетать по ошибке. При пошаговой прогонке транслятор сообщает, что эта переменная имеет тип String, и имеет значение "---*** messing ... ***---" (чего-то там, что-то в этом роде). А на самом деле эта переменная никакая не Стринг, и при проверках на стринг вылетает по ошибке.
Особенно очень сильно мучился с такими переменными при разработке 3D-drow. В этих объектах целая куча разных массивных переменных, в основном связанных с 3D-матрицами, причём в одних фигурах они имеют тип многомерных массивов, а в других - приобретают неопределённый тип. Так вот при попытках опереться на проверки подобных массивных переменных - в одних случаях получаешь желаемое, а в других случаях - вылетают по ошибке.
А подобных проверок мне нужно было не мало...
В общем, намучился я с ними,.. нагородил избыточных "огородов", кучу "лишнего" кода, кучу многоярусных проверочных If-ов...

И тут,.. на тебе... Ещё и ориенталы начали требовать подобных нагромождений, и что хуже всего, переделки кучи кода.

В общем... расстроило меня это. Сильно расстроило.

Так, что, извините, если что.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: eeigor от 18 февраля 2022, 20:46
Цитата: Kadet от 18 февраля 2022, 14:48Допустим есть у меня такой, весьма пользуемый, нужный и важный макрос
Если Вы правильно читали Памятку, то Вы неверно определяете тип Optional param, поэтому у Вас уйма ненужных проверок: и Value может пойти как String. А не надо численные параметры определять как Variant. Это не VBA! Используйте фиксированный тип данных. Для чисел: n%, n&.

Цитата: Kadet от 18 февраля 2022, 14:48Ну, в объяснениях вы всё упираете в тройственное значение логического типа.
Нет. Здесь только 2: 1 (True) и 0 (False). Поэтому число 2 (в примере) и не может быть присвоено типу Boolean.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 18 февраля 2022, 21:14
Цитата: eeigor от 18 февраля 2022, 20:46
Цитата: Kadet от 18 февраля 2022, 14:48Ну, в объяснениях вы всё упираете в тройственное значение логического типа.
Нет. Здесь только 2: 1 (True) и 0 (False). Поэтому число 2 (в примере) и не может быть присвоено типу Boolean.

Я представил в ответе #30 незаданное состояние аргумента как своего рода третье состояние :) Можно его и так рассматривать.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 21:29
Цитата: eeigor от 18 февраля 2022, 20:46Используйте фиксированный тип данных. Для чисел: n%, n&.
Ну, думаю вы не совсем верно поняли смысл этого макроса.
Покажу "на пальцах" (Tabl1, Tabl2, Tabl3). (снова, извините, если для кого-то обидно выразился,... ну манера у меня такая).

Обратите внимание страницы calc (а это и есть таблицы calc), представленные в этих примерах, заполнены именно этим макросом. Он заполняет полностью одну строку.
НО, замете разницу - даже в одной таблице в одни и те же ячейки иной раз заносится цифровые данные, и тут же, в следующей строке - строковые. Акцентирую - в одну и ту же ячейку, но в разных строках.
Именно из-за этой изначальной неопределённости, какие и в какую ячейку будут заноситься данные в тех или иных случаях, я и делаю переменные типа Variant.
Смотрите - в одной строке в нулевую ячейку заносится строка - "Сл.кость", а в следующей строке в эту же ячейку уже заносится цифра (ID рулона, под кнопками спрятались).
А если сравнивать две разные таблички, то в примере Tabl2 первые три столбца заполнятся строковыми, а в Tabl1 - начиная со второй идут сплошные цифры, которые используются в итоговых суммах и т.п.
А в примере Tabl3 - вообще таблица заполняется в виде двух колонок.
И подобных таблиц у меня не мало, все они разные и по-разному в них заносятся данные.

А творит все эти "чудеса", заполняет эти таблицы, именно этот, представленный выше макрос. Он один единственный для всего подобного.
Именно для этой "универсальности" я и использую Oriental var1 as Variant... Потому что заранее нельзя определить какого типа данные будут заноситься в те или иные ячейки, и будут ли вообще заноситься.

Ну, а теперь... вынужден буду городить огороды. А что делать?!
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 21:35
Цитата: mikekaganski от 18 февраля 2022, 21:14Я представил в ответе #30 незаданное состояние аргумента как своего рода третье состояние Улыбка Можно его и так рассматривать.
Да, это я понял. Третим состоянием я называю - состояние неопределённости (тот самый - "---***messing***---"), с которым по сути никак не возможно работать, кроме как IsMassing. (Извините, могу ошибаться в правильных написаниях в англословах). Во всех прочих попытках даже обратиться к такой переменной даёт ошибку.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: eeigor от 18 февраля 2022, 21:41
Цитата: mikekaganski от 18 февраля 2022, 21:14Я представил в ответе #30 незаданное состояние аргумента как своего рода третье состояние
Да, я перечитал. Можно и так. Информации набирается много...
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: eeigor от 18 февраля 2022, 21:43
Обращение через IsMissing сбрасывает состояние ошибки. Надо проверять код ошибки до этого.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 21:56
Цитата: mikekaganski от 18 февраля 2022, 21:14Нет. Здесь только 2: 1 (True) и 0 (False). Поэтому число 2 (в примере) и не может быть присвоено типу Boolean.
Кстати, а как же результат ChekBox? Разве он не Boolean? А ведь он имеет три состояния.

Кстати, как-то проводил эксперименты с этим типом (Boolean). Присваивал ему разные значения. Точно не помню (а специально перепроверять не охота), но... все значения, кроме 0, переменная типа Boolean воспринимает как True. Конечно, могу ошибаться.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 21:58
Цитата: eeigor от 18 февраля 2022, 21:43Обращение через IsMissing сбрасывает состояние ошибки. Надо проверять код ошибки до этого.
Согласен. Но это же дополнительный наворот. Нельзя ли вообще обойти без впадения в состояние ошибки, как было ранее.
Вот я о чём.

Допустим, как в примере выше - нужно проверить тип переменной, допустим - цифра или строка. Для этого по логике нужен всего один If ... ElseIf...
А в случае с IsMissing - бедьте любезны - многоярусная проверка, сначала проверка на IsMissing, а уж потом на строка/число. И даже в один If IsMissing(Var1) AND IsNumber(Var1) Then ... их не засунуть. Ошибку бьёт. Только - многоярусная проверка. Иначе никак.

Это печально.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 18 февраля 2022, 22:19
И вообще, сама по-себе эта странная ошибка вгоняет меня в ступор. Зачем она? Для каких целей?
Почему на мой простой вопрос: не цифра ли это (If IsNumber(Var1) Then..), нельзя просто ответить - нет, не цифра, даже если эта переменная находится в состоянии неопределённости, как в случае с ориенталами. (Не объект ли, не строка ли). Зачем же вгонять при этом в ошибку?
Наверное, конечно, это не спроста, где-нибудь в высших сферах. Но мне, как обывателю, это не понятно и кажется избыточными сложностями.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: eeigor от 18 февраля 2022, 23:55
Цитата: Kadet от 18 февраля 2022, 21:56Кстати, а как же результат ChekBox? Разве он не Boolean? А ведь он имеет три состояния.
1) Нет. Делайте так в коде, если надо присвоить результат состояния чекбокса чему-либо:
= CBool(chkSomething.State)

2) А вот так я присваиваю чекбоксу на листе его же значение по событию (щелчок пользователя):
chkSomething.State = Abs(oEvent.Source.chkSomething)  'Source = ThisComponent
Это для чекбокса, не связанного с ячейкой (там всё просто).
Если я не забыл чего. У чекбокса, вроде, 3 состояния, но это не -1, 0, 1, как следовало бы ожидать, а 0, 1, 2.

В первом случае надо преобразовать ту же двойку в 1 (True). Во втором: преобразовывает -1 в 1.
Я понимаю, о чём Вы говорите: сам помучился.

В Excel тройственное состояния (triple state) - это: -1, 0, Null

Цитата: Kadet от 18 февраля 2022, 21:56...переменная типа Boolean воспринимает как True.
Так и есть.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 19 февраля 2022, 09:58
Цитата: Kadet от 18 февраля 2022, 22:19
И вообще, сама по-себе эта странная ошибка вгоняет меня в ступор. Зачем она? Для каких целей?
Почему на мой простой вопрос: не цифра ли это (If IsNumber(Var1) Then..), нельзя просто ответить - нет, не цифра, даже если эта переменная находится в состоянии неопределённости, как в случае с ориенталами. (Не объект ли, не строка ли). Зачем же вгонять при этом в ошибку?

А вот это совсем другой вопрос. Is*-функции совсем не обязаны ошибаться на missing optional. Но кто Вам сказал, что IsNumeric ошибается на этом? Он прекрасно возвращает False при передаче в него missing optional, включая фиксированные типы. Так что пафос вопроса не вполне ясен. В какой версии ошибка? Или всё это даже без проверки работоспособности?

Или речь о какой-то своей IsNumber, которая совсем не IsNumeric (https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03102700.html?DbPAR=BASIC#bm_id3145136)?

Цитата: Kadet от 18 февраля 2022, 14:48
Sub WriteTable(oSheet AS Object, oRow%, oCol%,_
Optional Var0 As Variant, Optional Var1 As Variant, Optional Var2 As Variant, Optional Var3 As Variant,_
...
Optional Var28 As Variant, Optional Var29 As Variant, Optional Var30 As Variant, Optional Var31 As Variant)

If IsNumeric(Var0) Then
If Var0 <> 0 Then oSheet.getCellByPosition(oCol+0, oRow).setValue(Var0)
Else
If Var0 <> "" Then oSheet.getCellByPosition(oCol+0, oRow).setString(Var0)
End If

...
End Sub

...
Раньше представленный выше вариант прекрасно работал, т.е. проверял неопределённую переменную на нумерик или нет и делал своё дело.

Ещё раз посмотрим сюда.

If IsNumeric(Var0) Then
If Var0 <> 0 Then oSheet.getCellByPosition(oCol+0, oRow).setValue(Var0)
Else
If Var0 <> "" Then oSheet.getCellByPosition(oCol+0, oRow).setString(Var0)
End If


Проблема не в IsNumeric, который честно отрабатывает на незаданном аргументе, а в ветви Else, которая обращается к значению незаданной переменной в операторе сравнения <>.

Причём в данном конкретном случае код неверен в любом диалекте Basic, в т.ч. в VBA. Вы всё пытаетесь доказать, что код осмысленный с человеческой точки зрения, но это не так. Определение Optional ("опциональный", которое Вы настойчиво обзываете "ориенталом" - при чём тут восток?) концептуально не позволяет так работать.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 19 февраля 2022, 12:23
Цитата: mikekaganski от 19 февраля 2022, 09:58Но кто Вам сказал, что IsNumeric ошибается на этом?
Мне никто не говорил. Я проверял это на "собственной шкуре". Не однократно тестировал и искал выход из подобной фигни. Проверял подобные переменные на все Is*.
Проверю ещё раз, но ранее эта ситуация безвыходности меня сильно бесила.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 19 февраля 2022, 12:30
Цитата: mikekaganski от 19 февраля 2022, 09:58Проблема не в IsNumeric, который честно отрабатывает на незаданном аргументе, а в ветви Else, которая обращается к значению незаданной переменной в операторе сравнения <>.
С этим согласен. Else написано не корректно.
Но выбивало ошибку именно на строке If IsNumeric(Var0) Then, а не на Else. С объяснением - "переменная должна быть задана".
Проверю ещё раз, но... если память не изменяет было именно так. Поэтому везде пришлось ставить IsMissing
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: eeigor от 19 февраля 2022, 12:38
Памятка по ссылке от Михаила (в моём переводе) решила мои проблемы с опциональными переменными. Всё понятно, хотя и многообразно. Если надо использовать значения по умолчанию, то для этого есть функция CompatibilityMode() для включения режима Compatible на время выполнения кода процедуры. Есть особенности вызова UDF из ячеек листа (пропущенный аргумент не будет считаться отсутствующим, если дальше через точку с запятой есть что-то ещё (другой параметр).
A1: =UDF(arg1;;arg3)
В Basic при таком вызове arg2 (по порядку) is missing, а на листе Calc – нет. Если Вы ещё окончательно не запутались  :)

Edit: Для режима VBASupport лучше использовать отдельный модуль из иной "парадигмы" использования опциональных аргументов. Иногда использую, когда надо работать с диапазонами Excel на листе Calc.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 19 февраля 2022, 15:09
Проверил. Действительно. Все Is* с неопределившимися переменными после Optional отпрабатывают без ошибок.
Sub Main
Test()
End Sub

'*******************************
Sub Test(Optional Var1)
Dim sStr$
ON LOCAL ERROR GOTO Error1:
sStr = "IsMissing"
If IsMissing(Var1) Then GoTo Jamp::
sStr = "IsArray"
If NOT IsArray(Var1) Then GoTo Jamp::
sStr = "IsDate"
If NOT IsDate(Var1) Then GoTo Jamp::
sStr = "IsEmpty"
If NOT IsEmpty(Var1) Then GoTo Jamp::
sStr = "IsNull"
If NOT IsNull(Var1) Then GoTo Jamp::
sStr = "IsNumeric"
If NOT IsNumeric(Var1) Then GoTo Jamp::
sStr = "IsObject"
If NOT IsObject(Var1) Then GoTo Jamp::
sStr = "IsUnoStruct"
If NOT IsUnoStruct(Var1) Then GoTo Jamp::
sStr = "TypeLen"
' If TypeLen(Var1) Then GoTo Jamp::
sStr = "TypeName"
' If TypeName(Var1) Then GoTo Jamp::
sStr = "VarType"
' If VarType(Var1) Then GoTo Jamp::

GoTo Jamp:
Error1:
ON LOCAL ERROR GOTO 0
MsgBox "Ошика на проверка - " & sStr
GoTo Jamp1:
Jamp:
MsgBox "Без ошибок на - " & sStr
Jamp1:
End Sub

Приношу свои извинения за дезинформацию.

Но почему же тогда я везде, где есть опционалы вставлял IsMissing-и?! Напрягался, вставлял, трудился... Не спроста же. Не помню уже.
Но, с чем-то в этом плане были немыслимые мучения, когда я пытался проверять тип каких-то переменных... Выдумывал методы обхода подобных ситуаций.
Может с чем-то путаю. Или тот баг уже исправили. Не знаю. Теперь все Is* работают нормально.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 19 февраля 2022, 15:27
Цитата: eeigor от 19 февраля 2022, 12:38Если Вы ещё окончательно не запутались
Уже... уже... и безвозвратно.

Понял так, что при использовании оптионалов в Basic обязательно в процедуре нужно использовать:
- либо CompatibilityMode();
- либо IsMissing(var);
- либо ***(Optional VAR as Boolean = False).
По другому никак.

Вот так я всё это понял.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: Kadet от 19 февраля 2022, 15:36
Кстати, а как же там дела с нашим масштабированием (основная тема темы)?
Смотрю в багзиле не проявляется интерес в этому вопросу. Арман Ле Гранд (автор сего непорядка)  :'(сидит в своём Турине, и не обращает на это никакого внимания.
Жаль. Значит придётся обходиться без выпендрёжей.
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: sokol92 от 19 февраля 2022, 16:37
На неподготовленного читателя темы эти "ужасы"  могут произвести сильное воздействие.

Если Вы создаете программный комплекс, то нужно для себя определить дисциплину программирования и ее придерживаться.
Никому не навязывая свою точку зрения (что для меня нетипично  :)), сформулирую некие предложения.

1. Об использовании или неиспользовании Option Compatible и Option VBASupport 1.

Всегда используем один из этих двух режимов, если только у нас нет ностальгии по cтарым версиям OO.

Используем Option VBASupport 1, если:
a. У нас есть унаследованный код из VBA (который приемлемо для нас работает в Basic) или мы создаем код, который предназначен как для Basic, так и для VBA.
b. Мы используем конструкции, который работают c  Option VBASupport 1 и не работают c Option Compatible. К ним относится ряд полезных функций (InStrRev (https://help.libreoffice.org/7.4/en-US/text/sbasic/shared/03120411.html?DbPAR=BASIC) и др.), которые дискриминированы по непонятным причинам, объект VBA Err (https://help.libreoffice.org/7.4/en-US/text/sbasic/shared/ErrVBA.html?DbPAR=BASIC), позволяющий более комфортно работать с обработкой ошибок, ...

В остальных случаях используем Option Compatible.

2. Использование конструкции Byval.

Всегда используем эту конструкцию для неизменяемых (входных) параметров.
Лучше вообще отказаться от изменяемых в ходе макроса параметров  для функций, которые могут вызываться "извне" (аналогичную рекомендацию дают разработчики Python). Функция может возвращать не одно, а массив значений, и это будет работать при вызове этой функции из других языков программирования.
Можно использовать ByRef для "локальных" ("Private") функций.

3. Обработка Optional параметров (Optional Compatible).
Можно в самом начале макроса для каждого такого параметра применить функцию IsMissing и, возможно, присвоить опущенному параметру некоторое значение.

4. Определение подтипа параметра типа Variant.
Ни в коем случае не используем IsNumeric и IsDate. Эти функции возвращают результат, зависящий от локали. К вашим услугам проверенные бойцы VarType и TypeName, а также IsObject, IsArray. Проанализируйте пример:

Option Compatible
Sub Mysub(Optional ByVal arg)
  Msgbox IsNumeric(arg) & Chr(10) & VarType(arg) & " " & TypeName(arg)
End Sub

Sub Test
  Mysub "1.2"
  Mysub "1,2"
  Mysub
End Sub


Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 19 февраля 2022, 17:10
Цитата: eeigor от 19 февраля 2022, 12:38Есть особенности вызова UDF из ячеек листа (пропущенный аргумент не будет считаться отсутствующим, если дальше через точку с запятой есть что-то ещё (другой параметр).
A1: =UDF(arg1;;arg3)
В Basic при таком вызове arg2 (по порядку) is missing, а на листе Calc – нет. Если Вы ещё окончательно не запутались

Вот как раз упоминание синтаксиса формул Calc здесь совершенно неуместно и ведёт только к путанице. Когда Вы используете UDF в формуле, Вы работаете с Calc, и ЯП, на котором реализована UDF, не имеет никакого значения. Точно с тем же успехом можно начать сравнивать синтаксис формул Calc и C++, на котором написаны все встроенные функции. А в кальке единственный синтаксис незадания опционального аргумента - это в конце, без соответствующего разделителя. Как только разделитель появился - это не пропущенный, а заданный аргумент (если значение в таком случае не задано явно, оно равно нулю).

Такие сравнения подобны недавнему "багу" 147366 (https://bugs.documentfoundation.org/show_bug.cgi?id=147366), где пользователь перепутал функцию Log из Basic и LOG из Calc. Они не имеют друг к другу никакого отношения.

Как пример опущенного опционального аргумента:

=INDIRECT("A1")

А здесь он задан (и поэтому будет ошибка, поскольку значение по умолчанию 1, а здесь задан ноль, и значит, требуется ссылка R1C1):

=INDIRECT("A1";)
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: sokol92 от 19 февраля 2022, 17:16
Цитата: mikekaganski от 19 февраля 2022, 17:10если значение в таком случае не задано явно, оно равно нулю
Зависит от функции(?)
=SUBSTITUTE("12";"1";0) возращает "02"
=SUBSTITUTE("12";"1"; )   возвращает "2"
Название: Re: Проблема с абсолютными координатами станицы.
Отправлено: mikekaganski от 19 февраля 2022, 17:30
Да, пустой параметр зависит от функции, спасибо за уточнение. Важно, что пустой параметр в кальке - это заданный параметр.

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