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

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

22 Октябрь 2021, 22:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 4 5 6 7 »   Вниз
  Печать  
Автор Тема: Возможно ли создать многостраничную форму в LO Base  (Прочитано 18796 раз)
0 Пользователей и 1 Гость смотрят эту тему.
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 115


iMac, LibreOffice и Apache OpenOffice


« Ответ #45: 6 Декабрь 2019, 09:34 »

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

mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 341


« Ответ #46: 6 Декабрь 2019, 10:22 »

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

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

* DEMO1.ods (22.22 Кб - загружено 4 раз.)
* DEMO1-clean.ods (23.2 Кб - загружено 5 раз.)
« Последнее редактирование: 6 Декабрь 2019, 10:47 от mikekaganski » Записан

С уважением,
Михаил Каганский
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 115


iMac, LibreOffice и Apache OpenOffice


« Ответ #47: 6 Декабрь 2019, 11:25 »

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

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

mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 341


« Ответ #48: 6 Декабрь 2019, 11:46 »

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

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

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

(и тут я совсем ничего не понял, хотя ускорение видно и тут)
« Последнее редактирование: 6 Декабрь 2019, 11:56 от mikekaganski » Записан

С уважением,
Михаил Каганский
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #49: 6 Декабрь 2019, 12:54 »

Несколько предварительных замечаний
Спасибо!
Я перед работой на скорую руку набросал файл и макросы, но не проверил. А на работе закрутилось, завертелось. Вот только сейчас решил проверить, а там половина не работает.
Извините, за некачественную демку. Спасибо за советы.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #50: 6 Декабрь 2019, 13:14 »

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

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

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 341


« Ответ #51: 6 Декабрь 2019, 13:28 »

Заодно Вы помогли найти и исправить регрессию - многократное замедление: tdf#129227
Записан

С уважением,
Михаил Каганский
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 341


« Ответ #52: 6 Декабрь 2019, 15:15 »

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

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

Вот доработанный вариант с заменой пузырька на быструю сортировку.

* DEMO1-fast.ods (22.7 Кб - загружено 8 раз.)
Записан

С уважением,
Михаил Каганский
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #53: 6 Декабрь 2019, 16:03 »

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

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 341


« Ответ #54: 8 Декабрь 2019, 15:07 »

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

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

Т.о., для ReDim Preserve с увеличением размерности массива с 1000 до 1001 вновь создавался 1001 объект, а затем тут же 1000 из них уничтожались. С вытекающими накладными расходами.
« Последнее редактирование: 8 Декабрь 2019, 15:13 от mikekaganski » Записан

С уважением,
Михаил Каганский
kompilainenn
Мастер
*****
Offline Offline

Сообщений: 3 358



« Ответ #55: 8 Декабрь 2019, 15:15 »

Ну, вы же знаете. В этом (попадать на всякие глюки и баги) я большой специалист
добро пожаловать в клуб =)
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #56: 10 Декабрь 2019, 10:19 »

Забавная там использовалась логика:
Ну,.. это похоже на мои методы... Улыбка Иной раз, когда не знаешь как сделать, делаешь через... "нормальные герои всегда идут в обход".

Т.е., Вы предлагаете не удалять те заремленные 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()
Не подскажете метод?
« Последнее редактирование: 10 Декабрь 2019, 10:21 от Kadet » Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 341


« Ответ #57: 10 Декабрь 2019, 10:25 »

Т.е., Вы предлагаете не удалять те заремленные 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()
Не подскажете метод?

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

* DEMO1-fast2.ods (21.23 Кб - загружено 7 раз.)
« Последнее редактирование: 10 Декабрь 2019, 10:32 от mikekaganski » Записан

С уважением,
Михаил Каганский
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #58: 10 Декабрь 2019, 10:53 »

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

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

А тут, появилась необходимость через кнопку, главной задачей которой является манипуляция с заказом, номер которого и зашит в Name, ещё и провести манипуляции с листом calc, в котором и висит эта кнопка. Как бы получается, кнопка двойного назначения. Вот и ищу способ.
« Последнее редактирование: 10 Декабрь 2019, 10:59 от Kadet » Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 341


« Ответ #59: 10 Декабрь 2019, 11:22 »

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

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

Код:
oSheet = thisComponent.CurrentController.ActiveSheet
Записан

С уважением,
Михаил Каганский
Страниц: « 1 2 3 4 5 6 7 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!