На лист Calc помещен элемент управления "Список". Как в м...

Автор ForumOOo (бот), 31 октября 2016, 11:22

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

ForumOOo (бот)

Компонент: Calc
Версия продукта: 5.x
Сборка: Версия: 5.2.2.2 ID сборки: 8f96e87c890bf8fa77463cd4b640a2312823f3ad Потоков ЦП: 4; Версия ОС: Windows 6.1; Отрисовка ИП: по умолчанию;  Локаль: ru-RU (ru_RU); Calc: group
ОС: Win7 32

На лист Calc помещен элемент управления "Список". Как в макросе получить к нему доступ? Обратится, например, к его свойствам.


--
Подпись: Alex

rami

Цитата: ForumOOo (бот) от 31 октября 2016, 09:22На лист Calc помещен элемент управления "Список". Как в макросе получить к нему доступ? Обратится, например, к его свойствам.
Sub Main
oDrawPages=ThisComponent.DrawPages(0)        'рисованная страница первого листа
oForm=oDrawPages.Forms.getByName("Форма")    'имя формы по умолчанию (Форма), но может быть другим
oListBox=oForm.getByName("Список 1")         'имя списка по умолчанию (Список 1), но может быть другим
End Sub

Alex16

Спасибо большое за ответ. Пришлось зарегистрироваться, что бы продолжить дискуссию.
Я только начал изучать этот либреофис, до этого немного писал в микрософтском екселе...

В примере выше (кстати это единственный пример, который скомпилировался без ошибок из найденных в интернете)
oListBox теперь ссылается на наш список, но если я следующей строкой пишу, например:
oListBox.Visible=False
Выходит ошибка "не найдено свойство или метод Visible" тоже самое и с методом addItems
Что же возвращает метод getByName?
Можно немного расширить пример, например, в макросе списку задать "Исходный диапазон ячеек"

rami

Цитата: Alex16 от 31 октября 2016, 13:51Выходит ошибка "не найдено свойство или метод Visible" тоже самое и с методом addItems
Вместо Visible должно быть EnableVisible, а вместо addItemsinsertItemText:
Sub Main
oDrawPages=ThisComponent.DrawPages(0)        'рисованная страница первого листа
oForm=oDrawPages.Forms.getByName("Форма")    'имя формы по умолчанию, но может быть другим
oListBox=oForm.getByName("Список 1")         'имя списка по умолчанию, но может быть другим
oListBox.insertItemText(5,"новый")           'вставляет элемент по имени "новый" в пятую позицию
wait 3000                                    'ждёт 3 секунды
oListBox.EnableVisible=false                 'скрывает
wait 3000                                    'ждёт 3 секунды
oListBox.EnableVisible=true                  'показывает
End Sub

Alex16

Большое спасибо. Пример сработал как надо. Ну и наверное последние пару вопросов. Подскажите пожалуйста где посмотреть свойства и методы элементов управления?
В частности этого листбокса. Как он (листбокс, список) вообще правильно называется в LibreOffice Basic?

rami

Цитата: Alex16 от 31 октября 2016, 14:38Подскажите пожалуйста где посмотреть свойства и методы элементов управления?
Есть хорошее расширение MRI

Alex16

#6
Установил MRI... немного запутался. Но пока разбирался, наткнулся на xRay. Хорошие штуки.
Но все равно не получается некоторые вещи реализовать. Вот нужно в макросе задать исходный диапазон ячеек для списка:
Sub ButtonPr
 oDrawPages=ThisComponent.DrawPages(0)        'рисованная страница первого листа
 oForm=oDrawPages.Forms.getByName("Форма")    'имя формы по умолчанию, но может быть другим
 oListBox=oForm.getByName("Список 1")         'имя списка по умолчанию, но может быть другим
  'Пытаюсь задать так
  oListBox.ListEntrySource.CellRAnge.StartColumn = 0
  oListBox.ListEntrySource.CellRAnge.StartRow = 3
  oListBox.ListEntrySource.CellRAnge.EndColumn = 0
  oListBox.ListEntrySource.CellRAnge.EndRow = 13
 xRay oListBox ' Но все равно рентген показывает другие значения.
End Sub


Как же задать этот диапазон? Или это свойство только для чтения?

rami

Цитата: Alex16 от  1 ноября 2016, 08:23... немного запутался.
Мне кажется немного запутались разработчики списка ;D
Задать исходный диапазон, а за одно и связанную ячейку для списка:
Sub main
oDrawPages=ThisComponent.DrawPages(0)        'рисованная страница первого листа
oForm=oDrawPages.Forms.getByName("Форма")    'имя формы по умолчанию, но может быть другим
oListBox=oForm.getByName("Список 1")         'имя списка по умолчанию, но может быть другим
oRange=ThisComponent.Sheets(0).getCellRangeByName("A1:A25").RangeAddress  'диапазон значений для списка
oCell=ThisComponent.Sheets(0).getCellRangeByName("C2").CellAddress        'адрес связанной ячейки
Dim arg1(0) As New com.sun.star.beans.NamedValue
arg1(0).Name="CellRange"
arg1(0).Value=oRange
oListSource=ThisComponent.createInstanceWithArguments("com.sun.star.table.CellRangeListSource",arg1)
oListBox.setListEntrySource(oListSource)     'назначение диапазона списку
Dim arg2(0) As New com.sun.star.beans.NamedValue
arg2(0).Name="BoundCell"
arg2(0).Value=oCell
oVal=ThisComponent.createInstanceWithArguments("com.sun.star.table.CellValueBinding",arg2)
oListBox.setValueBinding(oVal)                'назначение связанной ячейки списку
End Sub

Alex16

Цитата: rami от  1 ноября 2016, 14:20
Цитата: Alex16 от  1 ноября 2016, 08:23... немного запутался.
Мне кажется немного запутались разработчики списка
Спасибо за поддержку и помощь ;)

Сам я "сделал" (нашел в инете и немного переделал) вот как:
Sub TestListBoxButtonPress
  oDrawPages=ThisComponent.DrawPages(1)        'рисованная страница первого листа
  oForm=oDrawPages.Forms.getByName("Форма")    'имя формы по умолчанию, но может быть другим
  oListBox=oForm.getByName("SpisSotrud")         'имя списка по умолчанию, но может быть другим
 
  addr = createUnoStruct("com.sun.star.table.CellRangeAddress")
  addr.StartColumn=0
  addr.StartRow=1
  addr.EndColumn=0
  addr.EndRow=ThisComponent.Sheets(0).getCellByPosition(0,0).Value-1
 
  dim initParam(0) as new com.sun.star.beans.NamedValue
  initParam(0).Name="CellRange"
  initParam(0).value = addr
  oCellRangeListSource=ThisComponent.createInstanceWithArguments("com.sun.star.table.CellRangeListSource", initParam )
  oListBox.setListEntrySource(oCellRangeListSource)
  oListBox.insertItemText(0,"<(Общий)>")
  >>>oListBox.SelectedItems=1
  'xRay oListBox
End Sub


Работает. Я так понял это примерно одно и тоже. Но вот теперь не получается установить ItemIndex(или как он тут у него называется) в этом ListBox'е. На отмеченной >>> строчке ошибка "Объектная переменная не установлена"

rami


Alex16

#10
Раз тема была про доступ к списку. Спрошу еще раз в этой теме.
Если нужен доступ к одному и тому-же объекту из разных процедур как правильно сделать?
Я сделал так:
REM  *****  BASIC  *****
   'Option Explicit
   'Public SpisSotrud as Object

Function ListBox(NameList as String) as Object
oDrawPages=ThisComponent.DrawPages(1)        'рисованная страница первого листа
oForm=oDrawPages.Forms.getByName("Форма")    'имя формы по умолчанию, но может быть другим
ListBox=oForm.getByName(NameList)     'имя списка
End Function

Sub ButtonPress
Addr = createUnoStruct("com.sun.star.table.CellRangeAddress")
Addr.Sheet=0
Addr.StartColumn=0
Addr.StartRow=2
Addr.EndColumn=0
Addr.EndRow=ThisComponent.Sheets(0).getCellByPosition(0,0).Value-1
 
Dim InitParam(0) as new com.sun.star.beans.NamedValue
InitParam(0).Name="CellRange"
InitParam(0).Value = Addr
oCellRangeListSource=ThisComponent.createInstanceWithArguments("com.sun.star.table.CellRangeListSource", InitParam )

oSpisSotrud=ListBox("SpisSotrud")
oSpisSotrud.setListEntrySource(oCellRangeListSource)
oSpisSotrud.insertItemText(0,"<(Общий)>")
oSpisSotrud.SelectedItems=Array(0)
 'xRay oListBox
End Sub

Sub TTT
ListBox("SpisSotrud").insertItemText(0,"ТЕКСТ")
End Sub

, насколько это (не)верно?
И ещё, если включить 'Option Explicit переменные Addr и oCellRangeListSource заранее объявлять какого типа, Object?

rami

Цитата: Alex16 от  2 ноября 2016, 08:11Если нужен доступ к одному и тому-же объекту из разных процедур как правильно сделать?
Можно и так, если результат подходит.

rami

Цитата: Alex16 от  2 ноября 2016, 08:11И ещё, если включить 'Option Explicit переменные Addr и oCellRangeListSource заранее объявлять какого типа, Object?
Если не знаете какой нужен тип, можно не указывать его, по умолчанию будет Variant (я типы Object и Variant не указываю), но для других типов очень желательно указывать.