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

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

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

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как в реалтайме назначить функцию на кнопку?  (Прочитано 4883 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Стартовое сообщение: 20 Июнь 2016, 17:06 »

Диалог создаётся на лету. В том числе кнопки. Как к кнопке назначить функцию?
Например создаётся кнопка:
Код:
oDlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
oModel = oDlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
oModel.setPropertyValue("Name", "Button1")
oModel.setPropertyValue("TabIndex", 1)
...
Как для кнопки правильно написать, чтобы при нажатии вызывалась функция?
« Последнее редактирование: 20 Июнь 2016, 17:08 от Strannik61 » Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 291


« Ответ #1: 20 Июнь 2016, 19:16 »

Надо назначить Действия для кнопки, а это задача нетривиальная, возможно нерешаемая.
Можно загружать диалог из общего места с обработчиком нажатия кнопки, но этот путь тернист.

Даже в MS Excel приходилось идти в обход - назначать макрос не на контрол, а на картинку, либо генерить код модуля построчно.

Обязательно ли нужен диалог? Может хватит обычного msgbox с 3-мя кнопками и иконками?
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #2: 20 Июнь 2016, 21:10 »

Да задачка стоит непростая. Переделываю пакет работы с БД.
В частности вызываются из базы данные по действиям (создание пустого файла, файла на основе шаблона, на основе существующего файла и т.д.).
И в зависимости от выбора нужно вызвать разные функции. Сами функции есть.
Вот думаю как лучше сделать. Казалось, что проще привязать действие к кнопке.
Похоже придётся обрабатывать имя нажатой кнопки и уже по нему определять нужную функцию.
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #3: 20 Июнь 2016, 21:38 »

Надо назначить кнопке слушателя (это просто), а он уже знает что делать Афро. Одной строкой кода создаётся слушатель, а второй этот слушатель назначается кнопке (всех делов). Можете написать подробней какие кнопки в диалоге и как вы его создаёте.
Записан

Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #4: 20 Июнь 2016, 22:18 »

Как шаблон использую единый шаблон диалога Dialog1. Размер общий для всех диалогов (300 х 400).
На этом шаблоне 4 кнопки "На главную" - тип кнопки "Ок", "Закончить" - тип кнопки "Отмена", Две кнопки "Вперёд" и "Назад" - тип по умолчанию и на них  назначены скрипты в шаблоне.
Остальные кнопки генерируются в коде.
Кусочек кода:
Код:
Sub Main
    oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oRowSet=Statement.executeQuery("SELECT xxx")
If Not IsNull(oRowSet) Then
numStep = 1
iStep = 1
j=0
while oRowSet.Next
if (iStep = maxFirm) then
iStep = 1
numStep = numStep + 1
End if
createButton(oDlgModel, iTabIndex, "Firm" +j, Array("Step", numStep,"PositionX", 50, "PositionY", 20 +j, "Width", iDlgWidth -100,_
"Height", 20, "Label", oRowSet.getString(2), "PushButtonType", com.sun.star.awt.PushButtonType.STANDARD))
j=j+25
iStep = iStep + 1
wend
End If
y = oDlg.execute()

End sub

Sub createButton(oDlgModel, index%, sName$, props())
Dim oModel
oModel = oDlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
setProperties(oModel, props())
setProperties(oModel, Array("Name", sName$, "TabIndex", index%))
oDlgModel.insertByName(sName$, oModel)
index% = index% + 1
End Sub

Sub setProperties(oModel, props())
Dim i As Integer
For i=LBound(props()) To UBound(props()) Step 2
oModel.setPropertyValue(props(i), props(i+1))
Next
End sub
Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 291


« Ответ #5: 21 Июнь 2016, 08:33 »

Создать в Диалоге все Кнопки (с кодом) заранее и просто управлять их видимостью. Для всех визардов так и делается. Контекст выполнения - определяет ветвление алгоритма.

По своему опыту знаю, что Wizard-ы пользователи проходят "на автомате" со скоростью дятла и ничего не читают. Трата времени на "красоту" и кнопочки - себя не оправдывает.

Гораздо проще сделать просто ODT, в котором разместить гиперссылки на шаблоны, переходы, справку и т.п. Дешево и сердито.
« Последнее редактирование: 21 Июнь 2016, 08:51 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #6: 21 Июнь 2016, 09:12 »

Этот способ с созданием диалога не прокатит. Причина банальна.
Я показал только первый этап диалога.
В дальнейшем он используется ещё не раз и количество кнопок неизвестно. Точнее оно определяется количеством записей в БД.
Оптимальным является создание слушателя и последующее действие по обработке нажатой кнопки.
Осталось понять как создать слушателя. Улыбка
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #7: 21 Июнь 2016, 09:53 »

Этот способ с созданием диалога не прокатит. Причина банальна.
Я показал только первый этап диалога.
В дальнейшем он используется ещё не раз и количество кнопок неизвестно. Точнее оно определяется количеством записей в БД.
Оптимальным является создание слушателя и последующее действие по обработке нажатой кнопки.
Осталось понять как создать слушателя. Улыбка
Для меня сложно было понять как вам это объяснить, слишком много неопределённостей. Решил просто создать абстрактный образец на базе вашего кода. Вызывайте диалог и жмите на кнопки, учтите, что последние кнопки не уместились в диалоге, но их тоже можно "нажать" переключая фокус стрелкой вниз или клавишей "TAB"

* Кнопки в диалоге.ods (13.01 Кб - загружено 6 раз.)
Записан

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

Сообщений: 1 291


« Ответ #8: 21 Июнь 2016, 10:00 »

Strannik61 - а не проще ли использовать не Диалог, а Форму, раз идет зависимость от числа записей в БД?

Формой может быть не только объект BASE, но и отдельный ODT и даже ODS - файл. У меня пользователи отлично рисуют визарды на листах Calc, уменьшая число кода раза в два с помощью формул, функций, проверки данных, выпдающих списков итп - все средствами Calc. Макросы делают только >> и <<. 
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #9: 22 Июнь 2016, 18:28 »

Для меня сложно было понять как вам это объяснить, слишком много неопределённостей. Решил просто создать абстрактный образец на базе вашего кода. Вызывайте диалог и жмите на кнопки, учтите, что последние кнопки не уместились в диалоге, но их тоже можно "нажать" переключая фокус стрелкой вниз или клавишей "TAB"
Появились вопросы:
1. При первом нажатии на кнопку выскакивает ошибка в строке oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
При повторном нажатии все работает. До закрытия документа.
2. Как создана "Кнопка вызова диалога".
Что-то я сегодня конкретно туплю.)

Сейчас буду пробовать. Два дня времени не хватало.(
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #10: 22 Июнь 2016, 19:07 »

1. При первом нажатии на кнопку выскакивает ошибка в строке oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
При повторном нажатии все работает. До закрытия документа.
А мы так не договаривались Крутой я обещал две строчки кода: создание и назначение слушателя, но так как ваш код был "вырван" из другого большего кода, то пришлось закомментировать нерабочие "остатки", и добавить цикл. Для работы при первом открытии документа нужно добавить загрузку библиотеки (в самое начало макроса):
Код:
DialogLibraries.LoadLibrary("Standard")
2. Как создана "Кнопка вызова диалога".
На панели инструментов "Элементы управления" нажать "Режим разработки", выбрать "Кнопку" и нарисовать её в документе, открыть редактирование свойств, назначить кнопке макрос.
Записан

Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #11: 22 Июнь 2016, 19:15 »

Спасибо.)
Сейчас пишу макрос. Как будет готов - выложу на суд общественности. Может кому пригодится. Или кусочки из него  Всё хорошо
Записан
Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #12: 22 Июнь 2016, 21:12 »

Мдя. "Чем дальше влез, тем больше тараканов".
Очередная проблема.
После того как создал диалог и выполняю его показываются ВСЕ кнопки независимо от Step.
И как с этим бороться???
После перехода на следующую страницу всё начинает работать, но при старте нет.
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #13: 22 Июнь 2016, 21:38 »

После того как создал диалог и выполняю его показываются ВСЕ кнопки независимо от Step.
Свойство Step работает правильно, значит назначается не правильно.
Записан

Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #14: 23 Июнь 2016, 15:37 »

Начал было писать, что ничего не работает.
В пример подпрограмму вставил. И только потом заметил, что действительно сам дурак.)
Забыл для модели диалога Step задать.
Для кнопок задал, а диалогу нет.
Спасибо, что наталкиваете на умные мысли.)))
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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