Возможно ли создать многостраничную форму в LO Base

Автор Kadet, 25 ноября 2019, 21:58

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

rami

Цитата: Kadet от  6 декабря 2019, 08:02Вот на скорую руку сделал полную демку с выводом результатов.
Слишком на скорую... Вы хоть запускаете макросы перед отправкой на форум? Есть досадные "ляпы" (вместо требуемого "объект" у вас имеется "объект1", параметры в функции не передаются, вызов отсутствующих макросов). Я поправил и запустил вторую кнопку, отработало вроде нормально, индикатор и счётчик итераций изменялись равномерно, на 4 шаге остановилось, думал заклинило, стал писать ответ, потом заметил, что "нарисовалась" таблица с результатом расчёта. "Пилите, Шура, она золотая"

mikekaganski

#46
Я тут постарался измерить производительность реаллокации, и для этого сделал выделенную процедуру с измерением средних за секунду размеров массивов и времён на реаллокацию. Все ReDim preserve я заменил вызовом этой процедуры, и для того, чтобы это всё работало, мне потребовалось передавать туда "пустое значение". И вот это вот всё привело к тому, что внезапно всё стало летать. Причём результат (второй кнопки) получился идентичный работе неизменённого документа.

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

rami

mikekaganski, у меня нет библиотеки "kernel3", я её закомментировал. Ваш код мне показался визуально медленней, сделал замеры у вас до "шаг4" — 2 мин. 23 сек., а у Kadet —2 мин. 15 сек., до "шаг7" у вас — 3 мин. 27 сек., а у Kadet —3 мин. 20 сек.

Это на старом компе LibreOffice5.0.6.3, а на новом с LibreOffice6.3.3.2 вообще чертовщина — прыгают кнопки, диалог не редактируется, в общем "а, ну его".

mikekaganski

#48
Цитата: rami от  6 декабря 2019, 11:25у меня нет библиотеки "kernel3"
Да, это Win-специфичная библиотека; я её использовал для получения точности замеров времени не до секунд, как даёт now(), а до того, что даёт GetTickCount. Да, выложил сырое, как оно было в момент, когда меня результат поразил. Потом добавил почищенное.

Насчёт результатов: на 6.3.4.1 x64 под Win - у меня оригинал до шага 4 (медленная сортировка; её я не трогал) отрабатывает примерно за 225 с; почищенный вариант без допрасходов на заполнение статистики - за 5 с.

Проверил на 5.0.4.1 x64 - также под Win, на той же системе:
оригинал до шага 4 - 6 с; мой почищенный - 1 с.

(и тут я совсем ничего не понял, хотя ускорение видно и тут)
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от  6 декабря 2019, 09:10Несколько предварительных замечаний
Спасибо!
Я перед работой на скорую руку набросал файл и макросы, но не проверил. А на работе закрутилось, завертелось. Вот только сейчас решил проверить, а там половина не работает.
Извините, за некачественную демку. Спасибо за советы.

Kadet

mikekaganski, да, спасибо огромное за доработку моих макросов.
Никогда бы не подумал, что REDIM-ы так могут тормозить. Действительно у вас всё летает.

"Шаг 4" - это сортировка всего массива по возрастанию отходов. Займусь этим. Возможно найду/придумаю способ сократить или ускорить эту операцию.

Ещё раз приношу извинения за недоработки первичных макросов.

mikekaganski

Заодно Вы помогли найти и исправить регрессию - многократное замедление: tdf#129227
С уважением,
Михаил Каганский

mikekaganski

Цитата: Kadet от  6 декабря 2019, 13:14"Шаг 4" - это сортировка всего массива по возрастанию отходов. Займусь этим. Возможно найду/придумаю способ сократить или ускорить эту операцию.

Не надо ничего придумывать. Всё уже придумано.

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

Kadet

Цитата: mikekaganski от  6 декабря 2019, 15:15Не надо ничего придумывать. Всё уже придумано.
Да ладно!!! Огромное Вам спасибо! Здорово помогли. Теперь просто летает... Вообще не предполагал такой прыти от моей/нашей программы.

Цитата: mikekaganski от  6 декабря 2019, 13:28Заодно Вы помогли найти и исправить регрессию - многократное замедление: tdf#129227
Ну, вы же знаете. В этом (попадать на всякие глюки и баги) я большой специалист. :)))

mikekaganski

#54
tdf#129256 исправил, теперь (с 6.5 - я не знаю, портить на 6.4 или нет, но уж точно не на 6.3) ReDim Preserve для пользовательских объектов должна работать быстрее (как и должна), чем мой хак с вынесенной функцией, в которой тип объекта в массиве неизвестен.

Забавная там использовалась логика: сначала новый массив заполнялся целиком новыми объектами (т.е. 100% объектов создавалось с нуля); затем производилось восстановление тех объектов, что были в старом массиве: при этом в позициях, где происходило восстановление, новые чистенькие ни разу не использованные объекты удалялись, и туда переносились старые объекты.

Т.о., для ReDim Preserve с увеличением размерности массива с 1000 до 1001 вновь создавался 1001 объект, а затем тут же 1000 из них уничтожались. С вытекающими накладными расходами.
С уважением,
Михаил Каганский

kompilainenn

Цитата: Kadet от  6 декабря 2019, 16:03Ну, вы же знаете. В этом (попадать на всякие глюки и баги) я большой специалист
добро пожаловать в клуб =)
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Kadet

#56
Цитата: mikekaganski от  8 декабря 2019, 15:07Забавная там использовалась логика:
Ну,.. это похоже на мои методы... :) Иной раз, когда не знаешь как сделать, делаешь через... "нормальные герои всегда идут в обход".

Т.е., Вы предлагаете не удалять те заремленные REDIM-ы в моей программе?! Они ещё могут пригодиться?

Однако, возвращаясь к нашим "баранам". Когда я делаю кнопки в документе Calc, то привязываю их к ячейкам следующим образом.
oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
vCell = oSheet.getCellByPosition(oCol, oRow)
oControlShape.Anchor = vCell
oControlShape.MoveProtect = True

Теперь никак не найду способа отловить адрес этой ячейки по нажатию привязанной к нему кнопки. "В обход" я уже нашёл способ, но он сродни вышеописанному REDIM-у. А хочется проще и напрямую, типа через:
oEvent.Source.getModel()
Не подскажете метод?

mikekaganski

#57
Цитата: Kadet от 10 декабря 2019, 10:19
Т.е., Вы предлагаете не удалять те заремленные REDIM-ы в моей программе?! Они ещё могут пригодиться?
Да, в последующих версиях это будет работать быстро, как и положено.

Цитата: Kadet от 10 декабря 2019, 10:19
Однако, возвращаясь к нашим "баранам". Когда я делаю кнопки в документе Calc, то привязываю их к ячейкам следующим образом.
oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
vCell = oSheet.getCellByPosition(oCol, oRow)
oControlShape.Anchor = vCell
oControlShape.MoveProtect = True

Теперь никак не найду способа отловить адрес этой ячейки по нажатию привязанной к нему кнопки. "В обход" я уже нашёл способ, но он сродни вышеописанному REDIM-у. А хочется проще и напрямую, типа через:
oEvent.Source.getModel()
Не подскажете метод?

Хмм... но так oEvent.Source.getModel() у Вас и работает, еяпп. Прикладываю Ваш файлик, который я ещё причёсывал на выходных - посмотрите, может, найдёте что полезное.
С уважением,
Михаил Каганский

Kadet

#58
Цитата: mikekaganski от 10 декабря 2019, 10:25Прикладываю Ваш файлик, который я ещё причёсывал на выходных - посмотрите, может, найдёте что полезное.
Спасибо, за помощь и содействие.

Цитата: mikekaganski от 10 декабря 2019, 10:25но так oEvent.Source.getModel() у Вас и работает
Да, прекрасно работает, но по нему я отлавливаю Name кнопки, в которой зашифрован номер заявки ("нормальные герои всегда идут в обход"), и уже через этот нормер выхожу на заявку.
В других случаях, когда мне нужно по кнопке обращаться к родительскому листу, я шифрую в Name номер строки (oRow), к которой привязана кнопка и уже через него манипулирую с calc.

А тут, появилась необходимость через кнопку, главной задачей которой является манипуляция с заказом, номер которого и зашит в Name, ещё и провести манипуляции с листом calc, в котором и висит эта кнопка. Как бы получается, кнопка двойного назначения. Вот и ищу способ.

mikekaganski

Цитата: Kadet от 10 декабря 2019, 10:53А тут, появилась необходимость через кнопку, главной задачей которой является манипуляция с заказом, номер которого и зашит в Name, ещё и провести манипуляции с листом calc, в котором и висит эта кнопка

Лист, на котором висит эта кнопка, является текущим в момент нажатия на эту кнопку:

oSheet = thisComponent.CurrentController.ActiveSheet
С уважением,
Михаил Каганский