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

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

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

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

Сообщений: 635


« Ответ #75: 11 Декабрь 2019, 21:28 »

Если msgbox не вызывается, то макроось не назначался или что-то не срослось. К двум указанным макросам добавьте макрос DemoCalc из документа DEMO4 что я выложил раньше.
Проанализировал этот момент и понял следующее. Дело в том, что в той Демке у вас назначение макросов происходит следующим образом:
Код:
AddButton(7, oRow, "RED", "/", 400, RGB(0,0,0), "DemoCalc")
AddButton(7, oRow+1, "COPY", "//", 400, RGB(0,0,0), "ButtonPushEvent")
AddButton(8, oRow, "DEL", "X", 400, RGB(255,0,0), "ButtonPushEvent")
AddButton(8, oRow+1, "GOT", "готов", 1300, RGB(0,0,255), "ButtonPushEvent")
Т.е. вы тут подменяете исполнительный макрос по нажатию именно той самой процедурой "ButtonPushEvent"
Код:
Sub ButtonPushEvent(ev as com.sun.star.awt.ActionEvent)
msgbox ev.Source.Model.Name
msgbox ev.ActionCommand 'получаем значение ActionCommand
End Sub
Т.е., получается, что макросы вообще не нужно передавать, а везде прошить эту "ButtonPushEvent", а уже в ней, методом исследования ev.ActionCommand определять какая кнопка нажата, в каком листе, в каком документе и всё пр. По кнопке "RED", "/" событие ActionCommand всё равно не происходит.
Ведь теперь я этот макрос, которые Вы помогли мне отредактировать, использую во всех формах, листах и документах базы... один для всего.
Мне кажется это путь к усложнению и повышению длительности работы программы... излишней замороченности.
Проще ли это? Или я чего-то не пойму.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #76: 11 Декабрь 2019, 21:39 »

Поразмыслив немного понял Вашу логику. Вы предлагаете подменить все передаваемые на кнопки макросы одним промежуточным и уже в нём, по уникальным Name, Tag или ActionCommand определять какой макрос выполнять и с какими входными параметрами.
В принципе... а в чём упрощение, если при передаче макросов напрямую, без промежуточной процедуры, по сути получается тоже самое - расшифровка входных параметров и исполнение нужного макросы?
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


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

Вы предлагаете подменить все передаваемые на кнопки макросы одним промежуточным и уже в нём, по уникальным Name, Tag или ActionCommand определять какой макрос выполнять и с какими входными параметрами.
У вас есть четыре типа кнопок для каждого блока данных, для каждого типа можно сделать свой макрос, а можно всем назначить один промежуточный — это как вам удобно, я на этот счёт ничего не предлагал, а только "сэкономил макросы", вместо четырёх назначил один.
Записан

Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #78: 12 Декабрь 2019, 09:53 »

Да, я в итоге въехал во всю систему. Однако типов кнопок у меня гораздо больше. Это только в одном списке заявок их 4, а ещё в самих заявках их по 5-10 типов. И в других документах по несколько собственных типов. И везде я теперь использую один макрос создания кнопки. Так что унифицировать, к сожалению это дело не получается.

Однако, всё же что-то пошло не так. Не могу вытащить значение, занесённое в ActionCommand.
Заношу так:
Код:
oDoc.CurrentController.getControl(oButtonModel).setActionCommand(oRow)
Достаю так:
Код:
oRow = oEvent.ActionCommand
Результат oRow=0.

« Последнее редактирование: 12 Декабрь 2019, 10:09 от Kadet » Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #79: 12 Декабрь 2019, 10:14 »

Мой пример у вас работает? Покажите ваш код создания кнопок (чтобы можно было запустить).
Записан

Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #80: 12 Декабрь 2019, 10:20 »

Мой пример у вас работает?
Ваш пример у меня работает. Макрос создания кнопки - тот самый, который отредакрировали Вы, только доработанный и расширенный.
Код:
Sub AddButton(oDoc, oSheet, oCol%, oRow%, nam$, label$, sTag$, iWidth%, iHeight%, oKegl%, color&, macro$)
Dim vCell, oDrawPage, oControlShape, oButtonModel, sScriptURL$, oForm
Dim aSize As new com.sun.star.awt.Size
Dim aEvent As new com.sun.star.script.ScriptEventDescriptor

oDrawPage = oSheet.DrawPage

oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
vCell = oSheet.getCellByPosition(oCol, oRow)
oControlShape.setPosition(vCell.Position)
aSize.Width = iWidth
aSize.Height = iHeight
oControlShape.setSize(aSize)

oButtonModel = CreateUnoService("com.sun.star.form.component.CommandButton")
oButtonModel.Label = label
oButtonModel.FontStyleName = "Полужирный"
oButtonModel.FontWeight = 150
oButtonModel.FontHeight = oKegl
oButtonModel.TextColor = color
oButtonModel.VerticalAlign = com.sun.star.style.VerticalAlignment.MIDDLE
oButtonModel.Name = nam
oButtonModel.Printable = False
oButtonModel.Tag = sTag

oControlShape.setControl(oButtonModel)
    oDrawPage.add(oControlShape)

oDoc.CurrentController.getControl(oButtonModel).setActionCommand(oRow)
' oDoc.CurrentController.getControl(oButtonModel).setActionCommand("ActionCommand: " & oRow)

sScriptURL = "vnd.sun.star.script:DBLibrary." & macro & "?language=Basic&location=application"
oForm = oDrawPage.getForms().getByIndex(0)
With aEvent
.AddListenerParam = ""
.EventMethod = "actionPerformed"
.ListenerType = "XActionListener"
.ScriptCode = sScriptURL
.ScriptType = "Script"
End With
oForm.registerScriptEvent(oForm.Count-1, aEvent)

oControlShape.Anchor = vCell
oControlShape.MoveProtect = True
oDoc.CurrentController.setFormDesignMode(false)
End Sub
Свойство ActionCommand у переменной oEvent появляется, но оно всегда пустое.
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #81: 12 Декабрь 2019, 10:40 »

Поясните эту строку:
sScriptURL = "vnd.sun.star.script:DBLibrary." & macro & "?language=Basic&location=application"
DBLibrary — библиотека, macro — макрос, а где модуль в котором содержится этот макрос?
Записан

Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


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

Поясните эту строку:
Поясняю:
Код:
AddButton(oDoc, oSheet, 8, i, oRowSetZK.getInt(1), "/", i, 400, 400, 8, RGB(0,0,0), "OpenForm.ZAKMETOpenForm")
Так как макрос создания кнопки универсальный, а нужные макросы находят в разных модулях, то я завожу в переменную macro "Модуль.Макрос"
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #83: 12 Декабрь 2019, 16:24 »

Однако, строка:
Код:
oDoc.CurrentController.getControl(oButtonModel).setActionCommand(oRow)
Оказалась крайне нестабильной. Я этот макрос не окружал обходчиком ошибок. И он начал мне выкидывать ошибки в самых непонятных моментах. Закрываешь форму - выбрасывает ошибку на этой строке. Прерываю недоформированную таблицу тоже выкидывает ошибку. Пришлось эту строку зарэмить.
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #84: 12 Декабрь 2019, 16:56 »

Что за ошибка?
Записан

Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #85: 14 Декабрь 2019, 20:54 »

Наконец-то попал на неё:
Код:
Ошибка времени выполнения Basic.
Вызвано исключение
Type: com.sun.star.container.NoSuchElementException
Message: .
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #86: 16 Декабрь 2019, 14:38 »

Однако, проявляется беда с этой заморозкой и разморозкой документа calc.
Использую везде вот такой набор команд:
Код:
'Заморозка экрана
oDoc.lockControllers()
oDoc.addActionLock()
'Сброс заморозки
oDoc.removeActionLock()
oDoc.unlockControllers()
Но не редко вылезают косяки. Заморозка просто не отключается. Не пойму почему.
Я уже принудительное отключение заморозки поставил в самом начале любой процедуры, которая формирует данные в таблице. И всё равно - очень часто не отключается. Прогоняю пошагово вроде бы всё работает. Как только в реалтайм - сбои.
Стоит прокрутить экран или перещёлкуть со страницы на страницу показания экрана нормализуются.

Чаще всего это происходит тогда, когда одна процедура формирования страницы ещё не завершилась, а запускается уже другая процедура формирования другой страницы. Такие случаи происходят постоянно. Я, вроде бы по возможности постарался обойти эти переключения, но запретить их вовсе нельзя, ибо для работы это будет ещё хуже, а вот обойти всё это грамотно не получается.

Воспроизвести это в демо-доке не получается. В демке всё работает нормально. А вот в базе, во встроенном calc какая-то беда.

Причём, иной раз производит чистку страницы и тогда заполняемая таблица просто остаётся пустой. При этом кнопки всё равно формируются, вне зависимости от заморозки. Происходит такая картинка как во вложении.
А иной раз экран просто не очищается. А "пустота" с кнопками начинает заполняться прямо поверх ранее заполненной таблицы и в этом случает кнопки не соответствуют заказам, поверх которых они выставлены.

В общем заморочки, какой-то с этими заморозками.


* 123.jpg (62.31 Кб, 829x641 - просмотрено 31 раз.)
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #87: 16 Декабрь 2019, 15:45 »

Сам разобрался. Изучил матчасть. В описании методов значится следующее:
Код:
void addActionLock() - увеличивает количество блокировок объекта на единицу.
void removeActionLock() - уменьшает количество блокировок объекта на единицу.
логический isActionLocked() - Возвращает TRUE если хотя бы один замок существует.
Я то полагал, что removeActionLock вообще сбрасывает все блокировки, а он только уменьшает уровень на единицу. Значит у меня получаются ситуации, когда блокировок больше единицы.
Сделал следующую процедурку:
Код:
Do
oDoc.removeActionLock()
Loop While oDoc.isActionLocked()
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #88: 16 Декабрь 2019, 16:43 »

Сделал. Стало лучше. Однако иногда всё же проскакивает неразмороженное заполнение.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 635


« Ответ #89: 16 Декабрь 2019, 20:40 »

Вот так:
Код:
'Сброс заморозки страницы
Do While oDoc.isActionLocked()
oDoc.removeActionLock()
oDoc.unlockControllers()
Loop
Вроде бы получилось. Пока не выбрасывало.
Записан
Страниц: « 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!