Проблема с абсолютными координатами станицы.

Автор Kadet, 16 февраля 2022, 18:48

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

Kadet

Цитата: mikekaganski от 17 февраля 2022, 16:27Э, нет, тут я ничего не сделаю. Если автор бага не исправит - его грандиозные изменения не поддаются расшифровке.
Ура, значит я не одинок в зашифровке кодов. :))))

Kadet

#16
Ну, раз пошла движуха по драву в калке, хочу поделиться ещё одним интересным наблюдением.

Вот, допустим, мой макрос по рисованию прямоугольника.
Вот, сокращённая версия:
'***************************************************************************************************************
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 поставить уже после создания самого объекта, то вращение будет производиться относительно центра самой фигуры.

Вот такие вот чудеса, которые желательно учитывать на практике.

rami

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

Или я не понимаю некоторые нюансы?

Kadet

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

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

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

Или в моих картинках из первого поста. Тут смена масштаба происходит при загрузке самого документа, а уж потом всё рисуется в том масштабе, который установлен при загрузке. И если в стандартном масштабе (img1) треугольник он и есть треугольник. То в масштабе "клетка" (img2) - уже не треугольник, а... картина Пикассо. Кубизм какой-то. "Художник так видит"...

mikekaganski

Оффтопик.

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

Кстати, а не могли бы Вы показать скрин другой программы, в которой нормальная подсветка? И заодно настройку в системе. Я надеюсь увидеть какую-то обработку системного цвета типа "использовать этот цвет, но сделать его на 30% темнее". Вероятно, нам просто надо сделать так же, и проблема будет исправлена.
С уважением,
Михаил Каганский

rami

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

Сделайте:
1. откройте документ и нажмите кнопку "500x500"
2. в меню "Вид" переключите на "Разметка страниц" и обратно "Обычный"
3. нажмите кнопку "4" и "44" — должно получиться правильно

Kadet

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

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

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

Да и представьте как посмотрит на меня заказчик, если я ему начну объяснять, что "для того, чтобы увидеть правильную картинку нужно выполнить следующие пункты"... Клиент только покрутит пальцем у виска...

Kadet

#22
Но, раз уж этот баг оказался настолько серьёзным и требует привлечения весьма серьёзных, замудрённых и занятых авторитетов,..
Попробую таки отказаться от задуманных фендиперсов и реализовать требуемое в стандартном масштабировании, без выпендрёжей.
Как известно: "Нормальные герои всегда идут в обход" (к/ф "Айболит-66")

А потом... поживём - увидим. Авось всё изменится.

rami

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

Kadet

#24
Кстати, вот с оказией хочу сообщить, что после последнего обновления ещё одна кракозябра вылезла.
Я не сильно обращал на это внимание. К тому же не бил в колокола. Просто подстроил макросы под новые реалии и пошёл дальше.

Однако.

Вот у меня, к примеру, есть такой макрос:
'Скрытие строк *********************************************************
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, которая является ориенталом. И такая беда случилась со всеми моими ориенталами, а у меня их не мало.
Возможно, я что-то неправильно понял смысл ориенталов, неправильно написал код, но теперь мне приходится явно прописывать значения всех ориенталов в моих базах. И они, получаются, просто бессмысленными. Потому что эти переменные всё равно приходится явно задавать при вызове мароса.

mikekaganski

#25
Цитата: 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. Ну, и Ваш код зависит от бага, который исправлен в 7.3. А именно - нельзя обращаться к значению незаданной опциональной переменной, у которой нет значения по умолчанию (доступно при Option Compatible), кроме как с помощью IsMissing. Такой код, как у Вас, должен выглядеть примерно так:


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, где допускается незаданный опциональный аргумент фиксированного типа.

См. также эту ветку, в которой я сначала тоже ожидал значения по умолчанию у незаданных аргументов :)
С уважением,
Михаил Каганский

Kadet

Ну, я об этом как раз и подозревал, что неправильно пользуюсь ориенталом. Причём с самого начала подозревал.
Но меня успокаивало, что раз мотор ЛО пропускает такую "наглость", то значит тут это допустимо.
А теперь - нет.

Этот вариант мне нравится больше. Он короче.
Цитата: mikekaganski от 17 февраля 2022, 22:49Sub HideRows(oDoc, oSheet, StartRow%, EndRow%, Optional bFlag As Boolean = False)
Спасибо за пояснения.

Kadet

#27
Хотя, с другой стороны. Вот вы считаете это "исправлением бага", а я считаю это возвратом к архаичности, к домамонтовским временам, когда ядро языка было настолько тупым и требовало всё явно прописывать и обозначать. Вплоть до разрядностей и размеров переменных.
"Как далеки они были от народа" (В.И.Ленин)

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

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

Мне кажется ядро языка должно быть как можно ближе к человеческим, а не вовращаться к машинным методам мышления.
Всё таки машина должна подстраиваться под человека, а не человек под машину. Даже к такому корявомыслящему как я.

mikekaganski

Я посмеялся.

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

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

Kadet

#29
Не понимаю в чём тут "дополнительные возможности".
Конечно, я далёк от глубинного понимания и познания StarBasic. Возможно, он действительно уже приближается к совершенству с широчайшими возможностями.
Но мне, как обывателю и дилетанту, подобные изменения кажутся не более чем дополнительными палками в колёса, от которых, в моём понимании, лучше избавляться, чем приобретать и усугублять.