GridControl

Автор Ingwar, 16 июля 2024, 11:34

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

Ingwar

Здравствуйте!
Подскажите пожалуйста, как мне макросом
вывести данные из таблицы Calc в GridControl1
расположенный на окне диалога LO Calc.
Спасибо!

economist

Вы хотите странное. Диалоги в OpenOffice|LibreOffice топорны, корявы, стары, сложны в программировании событий - верный способ зависнуть на месяц.

Диалоги с таблицами в "насквозь табличном" Calc - вообще не нужны, потому что проще в листе Calc его станд. средствами: Формулами, Проверка-Данные, Усл. форматированием и просто форматированием сделать самый удобный "диалог" для ввода и валидации данных, включая любые табличные вставки, прям как в формах 1С.

Иногда, впрочем, нужны данные из других систем, для этого XGRID хорош, но через Base. В Calc жмем Сервис - Формы - Навигатор - Создать. Вот сюда вы можно вставить XGRID и в его свойствах указать табличку/запрос/представление из любой базы данных и любого файла Calc (именованный диапазон). Прослойка-пустышка Base нужна лишь для хранения запросов. Параметрический запрос может реагировать на значения в ячейках Calc. В общем и тут лучше обойтись просто ячейками, без XGRID.   

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

sokol92

Посмотрите замечательный пример использования указанных сервисов в файле GridSelection.ods из этого  сообщения @Ratslinger.

Если будут вопросы, их можно задать здесь.
Владимир.

Ingwar

Цитата: sokol92 от 16 июля 2024, 16:53Посмотрите замечательный пример использования указанных сервисов в файле GridSelection.ods из этого  сообщения @Ratslinger.

Если будут вопросы, их можно задать здесь.
Здравствуйте! Большое спасибо за Вашу помощь в решении проблемы, Подскажите может где есть примеры использования GridControl не в программных диалоговых окнах, а стандартных диалогах конструктора макросов.

economist

Отличий между программным и рисованным диалогом не так много. Документация скудна и может обескураживать, а примеров использования нек-х свойств даже Google найдет 0 результатов.

Программно создать диалог с нужными свойствами едва ли не проще, чем менять готовый. Основная сложность, кмк, компоновка, чтобы все влезло,читалось и было неуродливым.

Искать примеры работы с gridcontrolmodel и GridControl надо на форумах и сайтах OpenOffice и LibreOffice. На нашем форуме тоже есть примеры. Но программирование диалогов, со слушателями и обработками событий - наверно самое сложное, что есть в LO. И красиво может не получиться, даже если убить уйму времени.

В коммерческом проекте мы вовремя отказались от диалогов в пользу python/tk/wx/qt/html-диалогов. Это было провидение.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Цитата: Ingwar от 17 июля 2024, 19:31где есть примеры использования GridControl не в программных диалоговых окнах, а стандартных диалогах конструктора макросов.
Вот (учебный) пример, в котором в элементе управления диалога показывается содержимое диапазона ячеек d_data.
Откройте приложенный файл и выполните макрос ShowDialog.

К сожадению, есть одна "погрешность". После запуска диалога на моей конфигурации не показывается вертикальная полоса прокрутки элемента Grid. Если нажать Ctrl+End и Ctrl+Home (перейти на последнюю и потом на первую запись), то полоса прокрутки появляется. Я не знаю (не помню), как это можно поправить макросом.

Option Explicit

Sub ShowDialog
  Dim oRange, i, dataArray, arrHeadings
  Dim oDialog, oGridModel, oColumnModel, oColumn, oDataModel, oGridControl
 
  ' Переносим в элемент управления GridControl данные диапазона d_data
  oRange=ThisComponent.NamedRanges.getByName("d_data").ReferredCells
 
  oDialog=CreateUnoDialog(DialogLibraries.getByName("Standard").getByName("GridDialog"))
  oGridModel=oDialog.getControl("GridControl").Model

  ' Создаем столбцы и формируем заголовки (Title)
  oColumnModel=createUnoService("com.sun.star.awt.grid.DefaultGridColumnModel")
  For i=0 To oRange.Columns.Count-1
    oColumn=oColumnModel.createColumn
    oColumn.Title=oRange.getCellByPosition(i, 0).String
    oColumn.ColumnWidth=100
    oColumn.Resizeable=IIf(i=oRange.Columns.Count-2, True, False) ' предпоследний столбец переменной ширины
    oColumnModel.addColumn oColumn
  Next i
   
  ' Переносим данные.
  oDataModel=createUnoService("com.sun.star.awt.grid.DefaultGridDataModel")
  dataArray=oRange.getCellRangeByPosition(0, 1, oRange.Columns.Count-1, oRange.Rows.Count-1).dataArray  ' диапазон данных со второй строки
  ReDim arrHeadings(0 To Ubound(dataArray, 1))
  oDataModel.addRows arrHeadings, dataArray  ' добавляем данные, заголовки для строк не нужны.

  With oGridModel
    .GridDataModel=oDataModel
    .ColumnModel=oColumnModel
    .Sizeable=True
  End With
 
  oDialog.execute
End Sub

Владимир.

Ingwar

Нашел хороший рабочий пример, чуть-чуть перевел на русский, может кому.