Libre Office 自定义对话框表

Posted

技术标签:

【中文标题】Libre Office 自定义对话框表【英文标题】:Libre Office custom Dialog Table 【发布时间】:2017-04-24 14:57:57 【问题描述】:

我正在创建一个自定义对话框,用户应该在其中选择多个可能的条目之一。我使用一个列表框来列出要从中选择的可能条目。

每一行都有多个变量,因此我想使用一个表格来正确对齐条目。有没有可能这样做?

我有什么:

abcdefg hijkl mnopq
abcd efghijk lmno

我想要什么:

abcdefg   hijkl      mnopq
abcd      efghilkl   mno

【问题讨论】:

【参考方案1】:

为列表框使用固定宽度的字体,并用空格填充字符串。

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。

【讨论】:

【参考方案2】:

是的,有可能。

创建一个新对话框并在底部添加一个标签。 创建一个新模块并添加以下代码:

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你应该得到你的网格:

【讨论】:

以上是关于Libre Office 自定义对话框表的主要内容,如果未能解决你的问题,请参考以下文章

Libre Office,清理范围

如何通过样式表自定义 QTableWidget?

使用样式表自定义 QTabWidget

Vue - 在引导表自定义组件上更新数据

使用样式表自定义 QDial

ABAP 实现内表自定义的F4功能