Проблема с закрытием диалога в Calc LibreOffice

Автор ASP, 28 февраля 2025, 18:27

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

ASP

Добрый день. Существует следующая проблема. Есть диалог, в диалоге есть кнопки. Диалог создан в объектной модели. При запуске диалога осуществляется программное прослушивание события кнопок (нажатие). Диалог запускается кнопкой на листе Calc. Все работает. Проблема возникает при закрытии диалога. Диалог закрывается, но открывается окно макросов, а в нем открываются вкладки всего, что только есть в редакторе. Если на момент открытия диалога было открыто окно макросов, то такого не происходит.

Dim oDlg As Object

Sub StartDialog
   
    DialogLibraries.LoadLibrary("Standard")
    oDoc=ThisComponent
oDlgDesc=oDoc.DialogLibraries.GetByName("Standard").GetByName("Proba")


  oDlg=CreateUnoDialog(oDlgDesc)
   
  For Each oControl In oDlg.Controls
    b=oControl.Model.Name
      if InStr(oControl.Model.Name, "cmb")>0 then
       
        oDlg.getControl((oControl.Model.Name).addActionListener(CreateUnoListener("Button_", "com.sun.star.awt.XActionListener"))
       
      end if
      if InStr(oControl.Model.Name, "box")>0 then
        oDlg.getControl(oControl.Model.Name).addItemListener(CreateUnoListener("CheckBox_", "com.sun.star.awt.XItemListener"))
      end if
     
  Next oControl

    oDlg.execute()
 
End Sub

sokol92

Нужен файл с демонстрацией проблемы.
Владимир.

ASP


sokol92

Спасибо за пример.

Каждый Слушатель (Listener) имеет фиксированный список событий. Вы должны предусмотреть обработчики для всех событий без исключения. В Вашем коде не хватает следующих подпрограмм:

Sub Button_disposing(oEvent)

End Sub

Sub CheckBox_disposing(oEvent)

End Sub

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

ASP

Цитата: sokol92 от  2 марта 2025, 16:26Спасибо за пример.

Каждый Слушатель (Listener) имеет фиксированный список событий. Вы должны предусмотреть обработчики для всех событий без исключения. В Вашем коде не хватает следующих подпрограмм:

Sub Button_disposing(oEvent)

End Sub

Sub CheckBox_disposing(oEvent)

End Sub

Попробуйте добавить указанный выше код.

Огромное спасибо. я так понимаю данный код останавливает прослушивание событий?

ASP

Не сочтите за наглость, но помогите пожалуйста еще.
На листе Calc есть контролы (текстовое поле, кнопка...) ни как не могу изменить текст в поле, на кнопке. может подскажите какую-нибудь литературу.. Питоньяка на русском языке нашел, но видимо в моей редакции ответа на мой вопрос нет...

sokol92

Событие disposing вызывается перед уничтожением объекта - источника события и информирует об этом Слушателя.

Кстати, Вы можете использовать один и тот же экземпляр слушателя для прослушивания нескольких объектов подходящего типа (а не создавать каждый раз новый экземпляр слушателя).

Владимир.

ASP

Цитата: sokol92 от  2 марта 2025, 16:51Событие disposing вызывается перед уничтожением объекта - источника события и информирует об этом Слушателя.

Кстати, Вы можете использовать один и тот же экземпляр слушателя для прослушивания нескольких объектов подходящего типа (а не создавать каждый раз новый экземпляр слушателя).



Для меня сейчас все это немного звучит как китайская грамота. Вынуждено перехожу с VBA на star basic, поэтому получается наскальная живопись, а не программа

sokol92

Цитата: ASP от  2 марта 2025, 16:42Питоньяка на русском языке нашел
Увы, в наше время всю актульную информацию в области программирования приходится получать из англоязычных источников (наш форум - исключение  ;) ).
Последний вариант знаменитой книги Питоньяка - OOME_4_1.odt. На мой взгляд, это лучшая книга для обучения LibreOffice, особенно для тех, кто имеет опыт программирования на VBA. Кстати, автоматические переводчики с английского на русский сейчас работают достаточно хорошо.

Текст на кнопке задается с помощью свойства Label модели.
Владимир.

ASP


Возможно не до конца разобрался в правилах языка, но до кнопки добрался, свойства считываю, изменяю, но на самой кнопке изменений не происходит, как было написано "Кнопка", так и остается надпись неизменной. Хотя программно когда считываешь данные, считывает с учетом изменений.

ASP

Sub Label()
  Dim oDrawPage As Object
  oDrawPage=ThisComponent.Sheets(0).DrawPage
 
  For i=0 To oDrawPage.Count-1
    oShape=oDrawPage(i)
     msgbox  oDrawPage(i).name
   
    if instr(oDrawPage(i).name, "cb")>0 then
      oDrawPage(i).setlabel("TEST")
     
    end if
   
  Next i
End Sub



sokol92

Давайте вместе попробуем в Вашем примере.

oDlg.getControl("cmb01010").Model.Label="LO Forum"
перед

oDlg.execute()
Владимир.

ASP

В диалоге все работает. Там вопросов нет. Проблема с контролами на листе в calc. Пока задача шла, немного изменилась))) надо на листе сделать псевдоалог. По сути что уже сделано и работает надо перенести на лист и привязать к ячейкам. Вот с листом как раз и возникли проблемы.

sokol92

Вероятно, следует создать новую тему, сформулировать вопрос, приложить файл-пример, ...  :)
Владимир.