Как работать с ComboBox?

Автор Strannik61, 28 июня 2016, 09:47

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

Strannik61

На одной из страниц диалога нужно добавить пункт один из списка.
Попытался сделать через комбобокс, но опять же не понимаю как правильно.
Сделано так:
Создан диалог на нём существует комбобокс с именем "NewPerson" и кнопкой "AddPerson" к которой привязан макрос.
Кусочек текста макроса, которым пытался создать управление комбобоксом:
oDlgM = oDlgModel.createInstance("com.sun.star.awt.UnoControlComboBoxModel")
oDlgM.setPropertyValue("Name", "NewOrgPers")
oDlgM.setPropertyValue("TabIndex", 23)
oDlgM.setPropertyValue("FontDescriptor", ButtonFont)
oDlgM.setPropertyValue("MaxTextLen", 60)
oName2 =  oDlg.getControl("NewOrgPers").getText()
oName2.addItems("Вася", 1, "Пупкин", 2)


Не понимаю, как создать массив для комбобокса и получить значение выбранного поля.
Достаточно ли привязанного макроса или создавать слушателя для кнопки "AddPerson"?

rami

Цитата: Strannik61 от 28 июня 2016, 07:47Сделано так:
Создан диалог на нём существует комбобокс с именем "NewPerson" и кнопкой "AddPerson" к которой привязан макрос.
Кусочек текста макроса, которым пытался создать управление комбобоксом:
Код:
   oDlgM = oDlgModel.createInstance("com.sun.star.awt.UnoControlComboBoxModel")
   oDlgM.setPropertyValue("Name", "NewOrgPers")   
   oDlgM.setPropertyValue("TabIndex", 23)   
   oDlgM.setPropertyValue("FontDescriptor", ButtonFont)   
   oDlgM.setPropertyValue("MaxTextLen", 60)   
   oName2 =  oDlg.getControl("NewOrgPers").getText()
   oName2.addItems("Вася", 1, "Пупкин", 2)
Прежде чем украшать комбобокс бантиками и рюшечками (FontDescriptor и др.), нужно:
1. задать размеры и координаты:
oDlgM.setPropertyValue("Height",100)
oDlgM.setPropertyValue("Width",50)

2. вставить комбобокс в модель диалога:
oDlgModel.insertByName("NewOrgPers",oDlgM)
3. кроме того есть такие важные свойства как раскрываемый или нет и если да, то на сколько строк
Цитата: Strannik61 от 28 июня 2016, 07:47Не понимаю, как создать массив для комбобокса и получить значение выбранного поля.
Список (вставляется массивом при создании комбобокса):oDlgM.setPropertyValue("StringItemList",Array("Вася","1","Пупкин","2","пятая строка"))
Поштучное добавление в список (только одна строка и её позиция за один раз):
oName2=oDlg.getControl("NewOrgPers")
oName2.addItem("одна строка",2)
oName2.addItem("ещё одна строка",0)

Цитата: Strannik61 от 28 июня 2016, 07:47Достаточно ли привязанного макроса или создавать слушателя для кнопки "AddPerson"?
Это зависит от того, что нужно сделать.
Для добавления введённого текста в список при нажатии на кнопку, макрос получает свойство "text" и выполняет метод "addItem("строка",позиция)

Strannik61

Спасибо за пример! Помогает, но вопросы всё равно остаются.
Теперь по-порядку.
Я немножко ступил, когда копировал сюда свой код. Взял из черновика. Поэтому возникла некоторая путаница в описании.
У меня в стандартной библиотеке создан шаблон диалога и в нём созданы два контрола.
Один - комбобокс, другой кнопка. К кнопке привязан макрос, который обрабатывает данные полученные из диалога.
Программно их создавать не нужно.
Имя кнопки (для справки) - "AddPerson".
Имя комбобокса - "NewPerson".
Формируется он так:
oSQL = "SELECT id, name FROM ... ORDER BY name"
oRowSet=Statement.executeQuery(oSQL)
If Not IsNull(oRowSet) Then
oName=oDlg.getControl("NewPerson")
while oRowSet.Next
oName.addItem(oRowSet.getString(2),oRowSet.getString(1))
wend
End If

Я надеялся. что как в php здесь передаётся не только имя, но и id к этому имени
Но при нажатии на кнопку срабатывает макрос:
oName=oDlg.getControl("NewPerson")
oPerson=oName.getText

И передаётся только имя.
Можно ли как-то получить id от этой записи?

rami

Цитата: Strannik61 от 28 июня 2016, 15:36Но при нажатии на кнопку срабатывает макрос:
Код:
   oName=oDlg.getControl("NewPerson")
   oPerson=oName.getText
И передаётся только имя.
Можно ли как-то получить id от этой записи?
У комбобокса помимо прочего есть два свойства:
1. text — это то, что записано в поле — это одна единственная строка и у неё не может быть ID
2. Items — массив элементов списка
ID какой записи нужно получить?

Strannik61

#4
Выбранной.
Из выпадающего списка выбирается одна запись. Нужно в макрос передать id, соответствующей этой записи. а перед этим ещё и привязать как-то этот id к ней. Я думал тут идёт пара id, name
Сейчас пока обошёлся повторным выбором из БД уже по name. Но это немного извратно. :)

rami

А зачем нужен комбобокс? Может лучше подойдёт простой список? У списка есть и SelectedItem и SelectedItemPos.

Strannik61

Цитата: rami от 28 июня 2016, 16:54А зачем нужен комбобокс? Может лучше подойдёт простой список? У списка есть и SelectedItem и SelectedItemPos.
Можно и просто список. Только это не меняет сути проблемы. Я не могу передать в связке с именем идентификатор.
То есть из БД я получаю массив пар значений id, name ("SELECT id, name FROM user WHERE ... ORDER BY name ASC"),
а из списка получаю только только name. Номер позиции вообще никак не привязывается к id.
Поэтому мне потом всё равно повторно из БД выдёргивать по name значение id нужно ("SELECT id FROM user WHERE name=... ")
И хорошо если имя уникально.
Пока придумал только способ в конец имени дописывать id и делать цвет шрифта как у фона.
А потом отрезать и смотреть его значение.
Сейчас буду пробовать получится так или нет.
oSQL = "SELECT id, name FROM user WHERE ... ORDER BY name ASC"
oRowSet=Statement.executeQuery(oSQL)
If Not IsNull(oRowSet) Then
oName2=oDlg.getControl("NewPerson")
while oRowSet.Next
oTemp1 = oRowSet.getString(2) & "  "
oTemp2 = oRowSet.getString(1)
...
' Здесь как-то нужно покрасить oTemp2
oName2.addItem(oTemp1 & oTemp2,oRowSet.getString(1))
wend
End If

Strannik61

Возвращаясь к старому. И всё-таки я не понимаю почему такой код не работает, как описано в справке.
createInsertControl(oDlgM, iTabIndex, "Pattern", "com.sun.star.awt.UnoControlListBoxModel",_
Array("FontDescriptor", ButtonFont, "Step", 0, "PositionX", 50, "PositionY", 70, "Width", 240,_
"Height", 20, "LineCount",6,"Dropdown",True))
oName2=oDlg.getControl("Pattern")
for j=12 to 15
oName2.addItem(j,j)
next j
oControl = oDlg.getControl("CommandButton1")
oControl.setLabel("Далее")
y = oDlg.execute()
if y = 1 then
CloseDialog
oIdPattern =  oDlg.getControl("Pattern").getSelectedItemPos()
msgbox oIdPattern
end if

Отображает в листбоксе правильно - от 12 до 15, но выводит значения от 0 до 3.
Как будто сам создаёт индексы.
В описании стоит:
ЦитироватьgetSelectedItemPos
short
getSelectedItemPos();

Description
    returns the position of the currently selected item.
Ничего не говорится, что индекс будет создавать сам.(
Посоветуйте, как получить нужный индекс?

rami

Цитата: Strannik61 от 28 октября 2016, 09:09Отображает в листбоксе правильно - от 12 до 15, но выводит значения от 0 до 3.
Как будто сам создаёт индексы.
При создании списка элемент вставляется в указанную позицию, если она не больше чем номер последней позиции, иначе элемент помещается в конце списка. При выборе элемента указывается его текущая позиция в списке, а не та в которую мы его вставили или хотели вставить.

Strannik61

Печально. Так и остаётся делать повторную выборку из БД по имени. >:(