LibreOffice 对话框中的滚动条
Posted
技术标签:
【中文标题】LibreOffice 对话框中的滚动条【英文标题】:Scroll bar in LibreOffice dialog 【发布时间】:2015-08-25 14:14:33 【问题描述】:我正在尝试在 LibreOffice 中制作图像选择器组件。 我有一个动态填充图像的对话框。当用户单击一个图像时,应该选择它并关闭对话框。 问题是图像的数量是可变的。所以我需要在对话框中启用滚动(以便用户可以浏览所有图像)。
对话框对象上似乎有一些属性(滚动条、滚动宽度、滚动高度等) 但是,我找不到在任何地方使用它们的方法。
有什么想法吗?
【问题讨论】:
> "对话框对象上似乎有一些属性" 您在哪里找到这些属性?调查它,我在基本对话框编辑器或 API 文档中找不到任何内容。也许你把它和表单的属性混淆了? @ngulam 我不确定你为什么看不到它。我可以在对话框编辑器中看到这些。我正在使用 LO 5.0.0.5 (x64) 我的错 - 看错了版本。 LO 有 4.3 和 5.0.0.5 版本,打扰了。 【参考方案1】:滚动条是通过对话框编辑器提供的Controls
之一。这是在对话框上放置ScrollBar
的更简单方法。只需像任何其他控件一样插入它。通过DialogModel.addControl
有更难的方法,但这似乎对回答这个问题没有必要。
如果你在对话框中添加滚动条并运行对话框,你会发现它默认什么都不做。功能(显然)必须写入宏。适当的触发事件是ScrollBar
对象上的While Adjusting
事件,尽管它不会简单地通过对话框编辑器中的“测试模式”功能触发宏。通过宏运行对话框会在触发滚动箭头、单击滑块区域移动滑块以及拖动滑块本身时触发While Adjusting
事件。滚动条事件返回的Object
变量包含一个属性.Value
,它是一个介于0和EventObject.Model.ScrollValueMax
之间的绝对值,它允许您根据滑块的位置手动操作页面上的其他对象。
是的,没错,手动操作对象。我从LibreOffice 4.5 SDK 中找到的唯一示例正是这样做的。当然,它并没有听起来那么糟糕,因为可以通过读取数组Dialog.getControls()
来遍历页面上的所有对象。无论如何,SDK 中提供的示例的秘诀是定义 Static
变量来保存您使用滚动条操作的所有对象的初始位置,然后根据从滚动条Value
除以ScrollValueMax
。
这是一个非常简单的滚动示例。这需要在您的文档的Standard
库中保存Dialog1
,其中包含对象ScrollBar1
(垂直滚动条)和Label1
在对话框中的任意位置。 ScrollBar1
必须配置为在 While Adjusting
事件上执行宏 ScrBar
子例程(如下)。通过执行OpenDialog
宏打开对话框,滚动条将根据页面比例上下移动Label1
控件。
Sub OpenDialog
DialogLibraries.LoadLibrary("Standard")
oVariable = DialogLibraries.Standard.Dialog1
oDialog1 = CreateUnoDialog( oVariable )
oDialog1.Execute()
End Sub
Sub ScrBar (oEventObj As Object)
Static bInit As Boolean
Static PositionLbl1Y0 As Long
oSrc = oEventObj.Source
oSrcModel = oSrc.Model
scrollRatio = oEventObj.Value / oSrcModel.ScrollValueMax
oContx = oSrc.Context
oContxModl = oContx.Model
oLbl1 = oContx.getControl("Label1")
oLbl1Model = oLbl1.Model
REM on initialization remember the position of the label
If bInit = False Then
bInit = True
PositionLbl1Y0 = oLbl1Model.PositionY
End If
oLbl1Model.PositionY = PositionLbl1Y0 - (scrollRatio * oContx.Size.Height)
End Sub
SDK 提供的示例在我的设置上无法运行,但原理是合理的。
似乎还有第二种即兴方法更接近人们可能期望的功能。此方法使用DialogModel.scrollTop
属性。该属性似乎根据用户输入向上或向下迭代整个框作为滚动。然而,使用这种方法有两个问题。首先,除非您将滚动条放在其他位置,否则滚动条将与页面的其余部分一起滚动。您将需要精确调整滚动条的位置以补偿/否定整个页面的滚动。在下面的示例中,我尝试了但没有完善这一点。其次,该属性似乎会频繁丢失输入,并且很容易失去对齐/进入失调状态。也许你可以克服这些限制。这是示例,依赖于上述相同的设置。
Sub ScrBar (oEventObj As Object)
Static scrollPos
oSrc = oEventObj.Source
oSrcModel = oSrc.Model
scrollRatio = oEventObj.Value / oSrcModel.ScrollValueMax
If IsEmpty(scrollPos) = False Then
scrollDiff = oEventObj.Value - scrollPos
Else
scrollDiff = oEventObj.Value
End If
scrollPos = oEventObj.Value
oContx = oSrc.Context
oContxModl = oContx.Model
oContxModl.scrollTop = scrollDiff * -1
oSrcModel.PositionY=(scrollRatio * oContx.Size.Height/5) * -1
End Sub
这(有点)将滚动整个对话框的内容,在限制范围内并带有上述警告。
【讨论】:
以上是关于LibreOffice 对话框中的滚动条的主要内容,如果未能解决你的问题,请参考以下文章
Libre Office 配置文件 bootstrap.ini 损坏