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

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

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

mikekaganski

#30
Дополнительные возможности - это возможность отличить состояние "не задано" от "False" и от "True". В нативном режиме у опционального Boolean три состояния; у опционального Integer - 65537 значений. Вы не обязаны хотеть для отсутствующего значения делать что-то совпадающее с заданным значением: например, у функции флаг может быть "стереть/не стирать", а при незадании функция может выдать диалог. И Вы передаёте True или False, когда знаете, какое действие нужно; а когда нужно спросить пользователя - не передаёте.

Или, скажем, параметр - цвет. И можно передать конкретный цвет, а незаданное значение - прочитать из файла конфигурации. И т.п. Насколько фантазии хватит.
С уважением,
Михаил Каганский

eeigor

#31
Цитата: mikekaganski от 17 февраля 2022, 22:49А так Вы ожидаете, что опциональный незаданный аргумент типа Boolean вдруг всё-таки имеет какое-то значение. Это, кстати, так в VBA, но не в StarBasic, где допускается незаданный опциональный аргумент фиксированного типа.
Именно так. Обратите внимание на слово "фиксированного". Теперь я всегда задаю тип опциональных агрументов. Понимание приходило медленно из-за имеющегося многообразия. Читайте вот эту важную ссылку от Михаила о трёх режимах работы. Это как памятка - надо перевести и усвоить.


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

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

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

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

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

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

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


P.S. Будем надеяться, что теперь этот сложный вопрос разъяснён. Для тех, кто читает и сможет найти ответ здесь (вот нет у нас "копилки").
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Kadet

Спасибо за пояснения.
Ну, в объяснениях вы всё упираете в тройственное значение логического типа. Это ясно. Хотя и само по-себе тройственное значение, в моём понимании, полезно лишь при графическом восприятии этого типа, вроде 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

Не сильно понимаю для чего надобны подобные дополнительные многоэтажности.

mikekaganski

"Ок, вы мне всё объяснили. Но я возьму и повторю свою точку зрения, как будто ничего не слышал, используя классический приём ad nauseum. Пусть выглядит, как будто это новый аргумент, а отвечающие всё равно не будут повторять то же самое, и будет выглядеть, что за мной последнее слово :) "
С уважением,
Михаил Каганский

kompilainenn

Насчет проблемы цвета выделения ячеек в macOS - была вроде тема, что это как-то связано с версией Xcode и macOS где собирается Либре Оффисе, не? И вот недавно вроде наши сборочные машины обновили
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

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

kompilainenn

Цитата: 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.
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Да, цитата правильная. Но совершенно не связана с версией xcode и сборочной машиной. Речь о поддерживаемых версиях оси. В минимальной поддерживаемой версии нет параметра, который нам нужен. Правда, мне неясно почему нельзя это определить в рантайме и прочитать в зависимости от текущей операционки - но я некомпетентен в macOS.
С уважением,
Михаил Каганский

Kadet

#38
Цитата: mikekaganski от 18 февраля 2022, 15:01Ок, вы мне всё объяснили.
Давайте поставим правильные акценты - "Вы ПЫТАЛИСЬ мне всё объяснить", но не факт, что я всё правильно понял из ваших объяснений.
Вы снова меряете мир своим мерилом и не допускаете возможности, что некоторые мыслят несколько другими понятиями, категориями и рамками.
Допустим используемое вами в объяснениях словечко "нативный" - мне абсолютно не понятно. Даже после пояснений от яндекса...

Ах, да ладно. Оставим. Не суть важно всё это... ни мне ни вам.
Сказали - надо делать так, и идти в то стойло... будем делать и идти.

eeigor

Цитата: Kadet от 18 февраля 2022, 16:19используемое вами в объяснениях словечко "нативный" - мне абсолютно не понятно
"Native" означает "родной", короче "свой", то есть не требующий доп. преобразований, используемый "как есть", если речь о каких-то параметрах. Но нативной может быть и среда: LO Basic без параметров Compatible & VBASupport, как я это понимаю.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Kadet

#40
Спасибо за пояснения.
Вот в этом применении этого понятия - понимаю.
Цитата: eeigor от 18 февраля 2022, 16:43Но нативной может быть и среда: LO Basic без параметров Compatible & VBASupport, как я это понимаю.

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

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

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

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

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

Так, что, извините, если что.

eeigor

#41
Цитата: 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.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

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

Я представил в ответе #30 незаданное состояние аргумента как своего рода третье состояние :) Можно его и так рассматривать.
С уважением,
Михаил Каганский

Kadet

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

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

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

Ну, а теперь... вынужден буду городить огороды. А что делать?!

Kadet

Цитата: mikekaganski от 18 февраля 2022, 21:14Я представил в ответе #30 незаданное состояние аргумента как своего рода третье состояние Улыбка Можно его и так рассматривать.
Да, это я понял. Третим состоянием я называю - состояние неопределённости (тот самый - "---***messing***---"), с которым по сути никак не возможно работать, кроме как IsMassing. (Извините, могу ошибаться в правильных написаниях в англословах). Во всех прочих попытках даже обратиться к такой переменной даёт ошибку.