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

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

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

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

Сообщений: 94


« Ответ #54866: 11 Июнь 2020, 14:25 »

.dispose() уничтожает диалог, а не закрывает, потом вы ещё что-то хотите делать с уже не существующим диалогом.

Закрывать диалог нужно методом oDlg.endExecute(), а чтобы переменная oDlg была видна в других макросах этого модуля, нужно объявлять её в модуле, а не в макросе.
Благодарю Rami.
Самое интересное, что я два дня ходил вокруг да около этого метода, но прочитав, что он скрывает диалог и даже не стал его пробовать.
Диалог закрывается, но... Но, почему-то, перестал работать выход из окна диалога по "Закрыть" (х, который вверху справа).
Это так и должно быть или баг?
Проверить это условие можно и по-другому (как в примере), тем более, всё равно необходимо возвращать результат в основную процедуру.
Код:
Dim oDlg '  Объект Диалог
Dim DlgRez '  Результат действия Диалога
Sub Dlg_Button()
 Dim oDlgModel, oModel
oDlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
oDlgModel.setPropertyValue("PositionX", 333) : oDlgModel.setPropertyValue("PositionY", 185)
oDlgModel.setPropertyValue("Width", 160) : oDlgModel.setPropertyValue("Height", 60)
oDlgModel.setPropertyValue("Title", "Кнопки в диалоге")
oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
oDlg.setModel(oDlgModel)
 For i% = 1 to 2
oModel = oDlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
oModel.setPropertyValue("PositionX", Clng(70*i-50)) : oModel.setPropertyValue("PositionY", 20)
oModel.setPropertyValue("Width", 50) : oModel.setPropertyValue("Height", 20)
oModel.setPropertyValue("PushButtonType", 0) : oModel.setPropertyValue("Label", "Кнопка № "&i)
oModel.setPropertyValue("TabIndex", i)
oDlgModel.insertByName("ComButton" & i, oModel)
oDlg.getControl("ComButton"&i).addActionListener(CreateUnoListener("Button_", "com.sun.star.awt.XActionListener"))
 Next
oDlg.createPeer(CreateUnoService("com.sun.star.awt.Toolkit"), null)
DlgRez = 0
oDlg.execute()
'If oDlg.execute() = 0 Then Print "Выход без кнопки!" : Exit Sub '   Почему-то не работает!?
If DlgRez Then Print "Нажата кнопка № " & DlgRez Else Print "Выход без кнопки!"
End Sub


Sub Button_actionPerformed(ActionEvent)
DlgRez = ActionEvent.Source.Model.TabIndex
Print "TabIndex: "  & DlgRez
oDlg.endExecute()
' oDlg.dispose() '  Диалог больше не нужен - можно удалять. Но вылетает приложение!!!
End Sub
Есть один небольшой вопрос: можно ли передавать параметры через обработчики событий.
Например, из основной процедуры в процедуру Button_actionPerformed(ActionEvent) объект Диалог (в данном примере - oDlg), а из процедуры Button_actionPerformed(ActionEvent) вернуть в основную процедуру DlgRez?
С большой вероятностью, думаю, что нельзя. Жаль, но ладно!

Если нельзя, тогда ещё один подвопрос: если в макросе нужно будет использовать ещё различные диалоги, можно ли безбоязненно применять этот указатель oDlg, после того как уничтожится диалог методом .dispose()?
Когда его лучше применять: до начала записи Диалога или сразу же после завершения Диалога? Или без разницы?
Но, самое главное, КАК ПРАВИЛЬНО его применять?
oDlg.dispose() - вылетает приложение!
« Последнее редактирование: 11 Июнь 2020, 14:32 от Tigrik » Записан
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

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