Получить доступ к объекту, вызывающему обработчик событий

Автор Tillevion, 29 августа 2018, 17:43

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

Tillevion

Такая ситуация. Есть ряд объектов, вызывающих общий обработчик событий. Можно ли из обработчика событий получить название вызвавшего его объекта?
Пример:

Sub Main
 oDlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
 oDlgModel.setPropertyValue("Width", 35)
 oDlgModel.setPropertyValue("Height", 30)
 oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
 oDlg.setModel(oDlgModel)
 oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
 oDlg.createPeer(oWindow, null)
 j% = 1
 For i% = 0 to j
oModel = oDlgModel.createInstance("com.sun.star.awt.UnoControlRadioButtonModel")
oModel.setPropertyValue("PositionX", 5)
oModel.setPropertyValue("PositionY", 5 + 12 * i)
oModel.setPropertyValue("Width", 30)
oModel.setPropertyValue("Height", 10)
oModel.setPropertyValue("Label", "Item" & i)
oDlgModel.insertByName("Field" & i, oModel)
oDlg.getControl("Field" & i).addItemListener(CreateUnoListener("Fields_", "com.sun.star.awt.XItemListener"))
 Next
 oDlg.execute()
End Sub

Sub Fields_itemStateChanged
 Print "Какой переключатель выбран?"
End Sub

JohnSUN

А если "в лоб"?
Sub Fields_itemStateChanged()
  j% = 1
  For i% = 0 to j
  If oDlgModel.getByName("Field" & i).State Then Print "Какой переключатель выбран? " & i
  Next i
End Sub
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Tillevion

#2
Это, конечно, сработает. Но если мы имеем дело с другими элементами управлениями? Например полями валюты, и нам нужно отслеживать изменения в них. Не хотелось бы создавать массив с текущими значениями и отслеживать какое из них изменилось - громоздко.

JohnSUN

Цитата: Tillevion от 29 августа 2018, 18:44
Не хотелось бы создавать массив... - громоздко.
И создавать диалог не программно, а в редакторе - тоже громоздко? Там весь спектр событий сразу перед глазами...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Макрос Main остаётся без изменений, а Fields_itemStateChanged немного изменяется:
Sub Fields_itemStateChanged(event)
  Print "Выбран переключатель " & event.Source.Model.Label
End Sub

Tillevion

Цитата: JohnSUN от 29 августа 2018, 17:54И создавать диалог не программно, а в редакторе - тоже громоздко? Там весь спектр событий сразу перед глазами...
Здесь вся штука в динамическом числе строк, поэтому редактор не подходит: j может меняться.

Цитата: rami от 29 августа 2018, 18:19Макрос Main остаётся без изменений, а Fields_itemStateChanged немного изменяется:
Код:

Sub Fields_itemStateChanged(event)
  Print "Выбран переключатель " & event.Source.Model.Label
End Sub
Супер! Работает! Спасибо!)