LibreOffice对话框中的滚动条

时间:2015-08-25 14:14:34

标签: openoffice.org libreoffice libreoffice-basic openoffice-basic

我正在尝试在LibreOffice中创建一个图像选取器组件。 我有一个动态填充图像的对话框。当用户单击一个图像时,应该选择它并关闭对话框。 问题是图像的数量是可变的。所以我需要在对话框中启用滚动(以便用户可以浏览所有图像)。

对话框对象上似乎有一些属性(滚动条,滚动宽度,滚动高度等) 但是,我找不到在任何地方使用它们的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

滚动条是对话框编辑器中可用的Controls之一。这是在对话框中放置ScrollBar的更简单方法。只需像任何其他控件一样插入它。通过DialogModel.addControl有一个更难的方法,但这似乎不是回答这个问题的必要条件。

如果在对话框中添加滚动条并运行对话框,则默认情况下它不会执行任何操作。功能(显然)必须写入宏。适当的触发事件是While Adjusting对象上的ScrollBar事件,尽管它不会仅仅通过"测试模式"触发宏。对话框编辑器中的函数。通过宏运行对话框会在触发滚动箭头,单击滑块区域以移动滑块以及拖动滑块本身时触发While Adjusting事件。滚动条事件返回的Object变量包含一个属性.Value,它是一个介于0和EventObject.Model.ScrollValueMax之间的绝对值,它允许您手动操作页面上的其他对象。滑块的位置。

是的,没错,手动操纵对象。我发现的唯一例子来自LibreOffice 4.5 SDK,正是这样做的。当然,它没有听起来那么糟糕,因为可以通过读取数组Dialog.getControls()来遍历页面上的所有对象。无论如何,SDK中提供的示例的秘诀是定义Static变量以保存您使用滚动条操纵的所有对象的初始位置,然后根据派生的比率简单地索引这些初始位置来自滚动条Value除以ScrollValueMax

这是一个如何滚动的非常简单的工作示例。这需要在文档的Dialog1库中保存Standard,其中包含对象ScrollBar1(垂直滚动条)和对话框中任意位置的Label1。必须将ScrollBar1配置为在ScrBar事件上执行宏While Adjusting子例程(下面)。通过执行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

这种(有点)将在限制范围内滚动整个对话框的内容,并附上上述注意事项。