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

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

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

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как работать с ComboBox?  (Прочитано 5221 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Стартовое сообщение: 28 Июнь 2016, 09: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)


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

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #1: 28 Июнь 2016, 10:58 »

Сделано так:
Создан диалог на нём существует комбобокс с именем "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. кроме того есть такие важные свойства как раскрываемый или нет и если да, то на сколько строк
Не понимаю, как создать массив для комбобокса и получить значение выбранного поля.
Список (вставляется массивом при создании комбобокса):
Код:
oDlgM.setPropertyValue("StringItemList",Array("Вася","1","Пупкин","2","пятая строка"))
Поштучное добавление в список (только одна строка и её позиция за один раз):
Код:
oName2=oDlg.getControl("NewOrgPers")
oName2.addItem("одна строка",2)
oName2.addItem("ещё одна строка",0)
Достаточно ли привязанного макроса или создавать слушателя для кнопки "AddPerson"?
Это зависит от того, что нужно сделать.
Для добавления введённого текста в список при нажатии на кнопку, макрос получает свойство "text" и выполняет метод "addItem("строка",позиция)
Записан

Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #2: 28 Июнь 2016, 17:36 »

Спасибо за пример! Помогает, но вопросы всё равно остаются.
Теперь по-порядку.
Я немножко ступил, когда копировал сюда свой код. Взял из черновика. Поэтому возникла некоторая путаница в описании.
У меня в стандартной библиотеке создан шаблон диалога и в нём созданы два контрола.
Один - комбобокс, другой кнопка. К кнопке привязан макрос, который обрабатывает данные полученные из диалога.
Программно их создавать не нужно.
Имя кнопки (для справки) - "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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #3: 28 Июнь 2016, 18:04 »

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

Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #4: 28 Июнь 2016, 18:14 »

Выбранной.
Из выпадающего списка выбирается одна запись. Нужно в макрос передать id, соответствующей этой записи. а перед этим ещё и привязать как-то этот id к ней. Я думал тут идёт пара id, name
Сейчас пока обошёлся повторным выбором из БД уже по name. Но это немного извратно. Улыбка
« Последнее редактирование: 28 Июнь 2016, 18:18 от Strannik61 » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #5: 28 Июнь 2016, 18:54 »

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

Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #6: 29 Июнь 2016, 17:21 »

А зачем нужен комбобокс? Может лучше подойдёт простой список? У списка есть и 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
Участник
**
Offline Offline

Сообщений: 40


« Ответ #7: 28 Октябрь 2016, 11:09 »

Возвращаясь к старому. И всё-таки я не понимаю почему такой код не работает, как описано в справке.
Код:
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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #8: 28 Октябрь 2016, 11:50 »

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

Strannik61
Участник
**
Offline Offline

Сообщений: 40


« Ответ #9: 28 Октябрь 2016, 11:53 »

Печально. Так и остаётся делать повторную выборку из БД по имени. Злой
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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