Настраиваемая диалоговая таблица Libre Office

Я создаю настраиваемый диалог, в котором пользователь должен выбрать одну из нескольких возможных записей. Я использую окно списка, чтобы перечислить возможные записи, из которых нужно выбрать.

Для каждой строки есть несколько переменных, поэтому я хотел бы использовать таблицу для правильного выравнивания записей. Есть ли возможность это сделать?

Что у меня есть:

abcdefg hijkl mnopq
abcd efghijk lmno

Что я хочу:

abcdefg   hijkl      mnopq
abcd      efghilkl   mno

person thomas    schedule 24.04.2017    source источник


Ответы (2)


Используйте шрифт фиксированной ширины для окна списка и дополняйте строки пробелами.

Sub PaddedListboxItems
    oListBox.addItems(Array(
        PaddedItem(Array("abcdefg", "hijkl", "mnopq")),
        PaddedItem(Array("abcd", "efghijk", "lmno"))), 0)
End Sub

Function PaddedItem(item_strings As Array)
    PaddedItem = PadString(item_strings(0), 10) & _
        PadString(item_strings(1), 11) & item_strings(2)
End Function

Function PadString(strSource As String, lPadLen As Long)
    PadString = strSource & " "
    If Len(strSource) < lPadLen Then
        PadString = strSource & Space(lPadLen - Len(strSource))
    End If
End Function

Дополнительные способы дополнения строк в Basic находятся на странице http://www.tek-tips.com/viewthread.cfm?qid=522164, хотя не все из них работают в LibreOffice Basic.

person Jim K    schedule 24.04.2017

Да, это возможно.

Создайте новый диалог и внизу добавьте метку. Создайте новый модуль и добавьте следующий код:

Option Explicit
Option Base 0

Dim oDialog1 As Object, oDataModel As Object, oListener As Object

Sub OpenDialog()
    Dim oGrid As Object, oGridModel As Object, oColumnModel As Object, oCol As Object
    Dim oLabel1 As Object, rect(3) As Integer

    DialogLibraries.LoadLibrary("Standard")
    oDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    oGridModel = oDialog1.getModel().createInstance("com.sun.star.awt.grid.UnoControlGridModel")

    oLabel1 = oDialog1.getModel().getByName("Label1")
    rect(0) = oLabel1.getPropertyValue("PositionX")
    rect(1) = 10
    rect(2) = oLabel1.getPropertyValue("Width")
    rect(3) = oLabel1.getPropertyValue("PositionY") - 2*rect(1)
    With oGridModel
        .PositionX = rect(0)
        .PositionY = rect(1)
        .Width = rect(2)
        .Height = rect(3)
    End With

    oColumnModel = oGridModel.ColumnModel
    oCol = oColumnModel.createColumn()
    oCol.Title = "Column 1"
    oColumnModel.addColumn(oCol)

    oCol = oColumnModel.createColumn()
    oCol.Title = "Column 2"
    oColumnModel.addColumn(oCol)

    oCol = oColumnModel.createColumn()
    oCol.Title = "Column 3"
    oColumnModel.addColumn(oCol)

    oDialog1.getModel().insertByName("grid", oGridModel)
    oGrid = oDialog1.getControl("grid")
    oListener = (CreateUnoListener("grid_", "com.sun.star.awt.grid.XGridSelectionListener"))
    oGrid.addSelectionListener(oListener)

    oDataModel = oGridModel.GridDataModel
    oDataModel.addRow("a", Array("abcdefg", "hijkl", "mnopq"))
    oDataModel.addRow("b", Array("abcd", "efghijk", "lmno"))

    oDialog1.execute()
    oDialog1.dispose()
End Sub

Чтобы получить значения выбранной строки, добавьте прослушиватель для события grid_selectionChanged:

Sub grid_selectionChanged(ev)
    Dim oRows() As Object, oLabel1 As Object, sCells(2) As String
    oRows = ev.Source.getSelectedRows()
    oLabel1 = oDialog1.getModel().getByName("Label1")
    sCells(0) = oDataModel.getRowData(oRows(0))(0)
    sCells(1) = oDataModel.getRowData(oRows(0))(1)
    sCells(2) = oDataModel.getRowData(oRows(0))(2)
    oLabel1.setPropertyValue("Label", "Selected values: " + sCells(0) + "," + sCells(1) + "," + sCells(2))
End Sub

Если вы все сделали правильно, запустив OpenDialog, вы должны получить свою сетку:

введите описание изображения здесь

person deblocker    schedule 16.06.2017