Calc: ArrayFormulaLocal ?

Автор eeigor, 21 марта 2020, 13:51

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

mikekaganski

Цитата: eeigor от 11 апреля 2020, 15:26
Не сразу нашел окошко с разделителями в параметрах.

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

eeigor

mike, в приведенном мной примере почему-то файл открывается с установленном режимом разработки. Кнопка с макросом не работает.
Я написал:
"Кстати, в прилагаемом примере почему-то при загрузке включается режим разработки (и кнопка не работает), а в других случаях сохраняется ранее выбранный режим. Что я делаю не так? Как зафиксировать режим выполнения (а не разработки) при старте программы?
См. Сервис - Формы - Режим разработки".

Другие файлы открываются, и режим разработки выключен. Как этим управлять?

Конечно же я эту проблему "поборол" вызовом метода SwitchControlDesignMode при загрузке файла (см. ниже), однако это требуется не всегда: при загрузке других файлов режим разработки отключен. Что бы это значило? Не могу уловить различия.

'  Used by: Событие "Активизация документа".
Sub Main
    Call SwitchControlDesignMode(False)
End Sub

'  Purpose: Переключает или устанавливает режим разработки (Сервис/Формы/Режим разработки).
'  Used by: Main
Sub SwitchControlDesignMode(Optional vState)
    Dim document   as object
    Dim dispatcher as object

    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

    Dim args1(0) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "SwitchControlDesignMode"
    args1(0).Value = IIf(IsMissing(vState), Not args1(0).Value, CBool(vState))

    dispatcher.executeDispatch(document, ".uno:SwitchControlDesignMode", "", 0, args1())
End Sub
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Вообще режим просто записывается в файл. Поэтому если Вы активировали режим разработки и сохранили файл, он откроется в этом режиме.

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

eeigor

Так именно с файлом моего примера и есть такая проблема: не могу отключить режим разработки. Как он открывается у Вас?
Другие файлы такой проблемы не создают.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Он открывается в режиме разработки, да. Это записано в content.xml (см. <office:forms form:automatic-focus="false" form:apply-design-mode="true">).

Если отключить "Tools">"Forms">"Open in Design Mode" и сохранить, оно естественно начинает открываться в другом режиме.
С уважением,
Михаил Каганский

eeigor

К сожалению, у меня на Linux Ubuntu 18.04 Calc 6.4 не получается достичь желаемого эффекта. И только с этим файлом. Файл всегда открывается в режиме разработки, поэтому я и поставил заплатку с переключением режима программно при активации документа. Можно ли добраться до этого свойства иначе (это похоже на баг) или вышлите мне мой собственный файл примера с отключенным режимом разработки.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Всё, спасибо. Разобрался.
Помимо флага "Режим разработки", который я сбрасывал, есть ещё один: "Открыть в режиме проектирования". Его сбросил, и всё заработало, как надо.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

rami

Цитата: mikekaganski от 11 апреля 2020, 15:08
Нет, окошки будут заполнены. А настройка будет пустой - по крайней мере у меня в русской Win 10 и версии 6.4.3.1
Поставил новую версию 6.4.3.2 и до открытия сбросил профиль, окошки заполнены, а макрос возвращает пустую строку.


По видимому, если пользователь не изменил настройки, провайдер выдаёт пустую строку, а используются разделители по умолчанию. Тогда в макросе, проверяем, если получили пустую строку — значит пользователь не менял настройки, — назначаем по умолчанию.

mikekaganski

Цитата: rami от 11 апреля 2020, 17:10
По видимому, если пользователь не изменил настройки, провайдер выдаёт пустую строку, а используются разделители по умолчанию.

Именно так.

Цитата: rami от 11 апреля 2020, 17:10Тогда в макросе, проверяем, если получили пустую строку — значит пользователь не менял настройки, — назначаем по умолчанию.
Но вот тут как раз то самое головоломное поведение начинается, когда "умолчания" разные для разных локалей. А локали могут быть настроены пользователем или браться из системы. И для правильного воспроизведения поведения калька мало знать текущую локаль, так ещё надо и иметь доступ к данным разделителей локалей, зашитым в ЛО.
С уважением,
Михаил Каганский

eeigor

И каким будет окончательное и универсальное (кроссплатформенное) решение, кроме использования константы, как у меня в примере?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Например, такой костыль. В листе создать служебный столбец (скажем, A; можно скрытый), в нём в A1 записать формулу "=SUM(1;1)", а в A2 - "=LEFT(RIGHT(FORMULA(A1);3);1)". И в коде брать значение из A2.

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

rami

Кстати, если изменить другую настройку, например, "Использовать английские имена функций", то провайдер выдаёт разделители, а не пустую строку и они записываются в файл registrymodifications.xcu (и вместе с ними ещё почти 140 КБ настроек).

Я не заметил, чтобы разделители изначально зависели от локали, скорей всего они зашиты в LibreOffice.

mikekaganski

@rami: см. ответ #18 - там я привёл ссылку на исходный код, который даёт дефолт для этой настройки.
С уважением,
Михаил Каганский

eeigor

Ну, в моем конкретном примере можно прогнать строку дважды со вставкой пробела после разделителя: сначала точки с запятой, а потом просто запятой. Что-то одно да сработает.

Но если среди сторонников Calc'а есть перфекционисты, то их такое положение дел вряд ли устроит, и тогда, возможно, надо писать, куда следует...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

economist

Цитата: eeigor от 11 апреля 2020, 17:43сначала точки с запятой, а потом просто запятой.
- так и делаем. Настоящих перфекционистов в Calc нет.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...