События для поля со списком

Автор Ириминаге, 1 апреля 2022, 09:57

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

Ириминаге

Есть БД Base, к ней прицеплена форма, на форме размещено "поле со списком" (combo box, выпадающий список), заполнил его данными из таблицы. Привесил на событие "Состояние изменено" макрос:
Sub Main

Dim oForm,  oControl, hh

'hh=ThisComponent.getControl("VybIN")

oForm = ThisComponent.Drawpage.Forms.getByName("VydMain")
oControl = oForm.getByName("INCr")
hh=oControl.text
msgbox hh

End Sub


Когда первый раз выбираю значение из списка, ничего не происходит, а во второй и последующий - всё нормуль. Вводил текст по умолчанию, вешал макрос на событие "Текст изменен" - однофигственно... Почему так интересно работает?
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

#1
Потому что вы определяете значения "не в тот момент". Ищите примеры, где в макрос передается сам контрол (как объект), они выглядят так
Sub Main(ev)
Sub Change(oEvent)

Это же позоляет сократить и ускорить код - нет нужды определять сам контрол и форму, т.к. они легко "вычисляются"  
oForm = ev.Source.Model.Parent
oControl = ev.Source

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

Ириминаге

Цитата: economist от  1 апреля 2022, 10:26
Потому что вы определяете значения "не в тот момент". Ищите примеры, где в макрос передается сам контрол (как объект), они выглядят так
Sub Main(ev)
Sub Change(oEvent)
Это же позоляет сократить и ускорить код - нет нужды определять сам контрол и форму, т.к. они легко "вычисляются"  
oForm = ev.Source.Model.Parent
oControl = ev.Source



Спасибо за ответ! А "в какой момент" мне надо определять значение? Честно говоря, вешал макрос даже на отпускание кнопки мыши. С тем же результатом. Тот пример, что вы описали, говорит о том, что в основной модуль программы передается некое событие и его программа должна обработать. Я не вижу разницы между передачей кода события и не передачей оного: Система топчется на пороге программы до повторного выбора. Как будто она согласна обработать лишь перемену значений из списка.
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

sokol92

Если Вы имеете в виду событие, которое в свойствах элемента управления называется Text Modified, то обработчик будет вызываться при каждом изменении значения ComboBox.
Владимир.

eeigor

#4
Цитата: sokol92 от  1 апреля 2022, 16:01Text Modified
?  Во всяком случае в Calc - textChanged. Но ведь это один и тот же Control?

Как-то искал, но не нашёл свойство типа SelectedItem (как в ListBox) и решил задачу перебором значений.
Sub cboItems_textChanged(oEvent As com.sun.star.awt.TextEvent)

 Dim i%  
 'Dim nSelectedItemPos%

 With oDlg.getControl("cboItems")  '== oEvent.Source; oDlg is a global var
   For i = 0 To .ItemCount - 1
     If .Items(i) = .Text Then
       '...
       Exit For
     End If
   Next
 End With

End Sub


Edit:
Sorry. В интерфейсе диалогового окна это событие действительно поименовано как "Text modified",  но на самом дел оно называется так, как я указал: "textChanged". В общем, не суть важно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: eeigor от  1 апреля 2022, 21:04Как-то искал, но не нашёл свойство типа SelectedItem (как в ListBox)
Мы же говорим о ComboBox. Можно ввести любой текст, а не обязательно тот, который есть в выпадающем списке для выбора.
Владимир.