事件
Apache OpenOffice 对话框和表单都基于面向事件的编程模型,在该模型中,可以为控制元素指定事件处理程序。在执行特定操作时,事件处理程序将会运行预定义的过程。还可以使用事件处理功能编辑文档、打开数据库以及访问其他控制元素。
Apache OpenOffice 控制元素可以识别在不同情况下触发的各种类型的事件。这些事件类型可以分为以下四组:
- 鼠标控制:与鼠标操作(例如,简单的鼠标移动或单击特定的屏幕位置)对应的事件。
- 键盘控制:由键盘击键触发的事件。
- 焦点修改:激活或停用控制元素时 Apache OpenOffice 执行的事件。
- 控制元素特有的事件:仅在特定的控制元素上才会发生的事件。
在使用事件时,请确保在 Apache OpenOffice 开发环境中创建关联的对话框,并且该对话框包含所需的控制元素或文档(如果要将事件应用于表单)。
上图显示了 Apache OpenOffice Basic 开发环境以及包含两个列表框的对话框窗口。通过使用两个列表框之间的按钮,可以将数据从一个列表移到另一个列表中。
如果要在屏幕上显示版式,则应创建关联的 Apache OpenOffice Basic 过程,以使事件处理程序能够调用这些过程。尽管在任何模块中都可以使用这些过程,但最好将其限制为仅供两个模块使用。要使代码更易于阅读,应为这些过程指定有意义的名称。直接从宏跳转到一般编程过程会导致代码含糊不清。因此,要简化代码维护和故障排除,应创建另一个过程以用作事件处理的入口点(即使它仅执行对目标过程的单一调用)。
以下示例中的代码会将一个条目从对话框的左列表框移到右列表框中。
Sub cmdSelect_Initiated
Dim objList As Object
lstEntries = Dlg.getControl("lstEntries")
lstSelection = Dlg.getControl("lstSelection")
If lstEntries.SelectedItem > 0 Then
lstSelection.AddItem(lstEntries.SelectedItem, 0)
lstEntries.removeItems(lstEntries.SelectItemPos, 1)
Else
Beep
End If
End Sub
如果此过程是在 Apache OpenOffice Basic 中创建的,则可以使用对话框编辑器的属性窗口为所需的事件指定该过程。
指定对话框列出了所有 Apache OpenOffice Basic 过程。要为某个事件指定过程,请选择该过程,然后单击指定。
参数
在发生特定事件时,并非始终能够获得适当的响应。可能还需要其他信息。例如,要处理鼠标单击,您可能需要按鼠标键时所在的屏幕位置。
在 Apache OpenOffice Basic 中,可以使用对象参数为过程提供有关某个事件的详细信息,例如:
Sub ProcessEvent(Event As Object)
End Sub
Event 对象的结构和属性取决于触发过程调用的事件类型。
无论是何种类型的事件,所有对象均提供对相关控制元素及其模型的访问。可以分别使用 Event.Source 和 Event.Source.Model 访问控制元素及其模型。
可以在事件处理程序中使用这些属性触发事件。
鼠标事件
Apache OpenOffice Basic 可以识别以下鼠标事件:
- Mouse moved
- 用户移动鼠标
- Mouse moved while key pressed
- 用户在按住某个键的同时拖动鼠标
- Mouse button pressed
- 用户按下某个鼠标键
- Mouse button released
- 用户松开某个鼠标键
- Mouse outside
- 用户将鼠标移到当前窗口以外
关联事件对象的结构是在 com.sun.star.awt.MouseEvent 结构中定义的,该结构提供了以下信息:
- Buttons (short)
- 按下的键(与 com.sun.star.awt.MouseButton 一致的一个或多个常量)
- X (long)
- 从控制元素左上角算起的鼠标 X 坐标,以像素为单位
- Y (long)
- 从控制元素左上角算起的鼠标 Y 坐标,以像素为单位
- ClickCount (long)
- 与鼠标事件关联的单击次数(如果 Apache OpenOffice 的响应速度非常快,双击的 ClickCount 值也为 1,因为只启动了一个事件)
com.sun.star.awt.MouseButton 中定义的鼠标键常量为:
- LEFT
- 鼠标左键
- RIGHT
- 鼠标右键
- MIDDLE
- 鼠标中键
以下示例将输出鼠标位置和按下的鼠标键:
Sub MouseUp(Event As Object)
Dim Msg As String
Msg = "Keys: "
If Event.Buttons AND com.sun.star.awt.MouseButton.LEFT Then
Msg = Msg & "LEFT "
End If
If Event.Buttons AND com.sun.star.awt.MouseButton.RIGHT Then
Msg = Msg & "RIGHT "
End If
If Event.Buttons AND com.sun.star.awt.MouseButton.MIDDLE Then
Msg = Msg & "MIDDLE "
End If
Msg = Msg & Chr(13) & "Position: "
Msg = Msg & Event.X & "/" & Event.Y
MsgBox Msg
End Sub
键盘事件
Apache OpenOffice Basic 中提供了以下键盘事件:
- Key pressed
- 用户按下某个键。
- Key released
- 用户松开某个键
这两个事件都与逻辑按键操作相关,而与物理操作无关。如果用户按几个键以输出一个字符(例如,为字符添加重音符号),则 Apache OpenOffice Basic 仅创建一个事件。
对修改键(如 Shift 键或 Alt 键)执行的单键操作不会创建独立的事件。
Apache OpenOffice Basic 为事件处理过程提供的事件对象会提供有关按键的信息。它包含以下属性:
- KeyCode (short)
- 按键代码(与 com.sun.star.awt.Key 一致的默认值)
- KeyChar (String)
- 输入的字符(包括修改键)
以下示例使用 KeyCode 属性确定是否按下了 Enter 键、Tab 键或其他控制键之一。如果按下了上述键之一,则会返回该键的名称,否则返回键入的字符:
Sub KeyPressed(Event As Object)
Dim Msg As String
Select Case Event.KeyCode
Case com.sun.star.awt.Key.RETURN
Msg = "Return pressed"
Case com.sun.star.awt.Key.TAB
Msg = "Tab pressed"
Case com.sun.star.awt.Key.DELETE
Msg = "Delete pressed"
Case com.sun.star.awt.Key.ESCAPE
Msg = "Escape pressed"
Case com.sun.star.awt.Key.DOWN
Msg = "Down pressed"
Case com.sun.star.awt.Key.UP
Msg = "Up pressed"
Case com.sun.star.awt.Key.LEFT
Msg = "Left pressed"
Case com.sun.star.awt.Key.RIGHT
Msg = "Right pressed"
Case Else
Msg = "Character " & Event.KeyChar & " entered"
End Select
MsgBox Msg
End Sub
有关其他键盘常量的信息,请参见 API 参考中的 com.sun.star.awt.Key 常量组。
焦点事件
焦点事件表明控制元素是获得还是失去焦点。例如,您可以使用这些事件确定某个用户是否已处理完某个控制元素,以便更新对话框的其他元素。可以使用以下焦点事件:
- When receiving focus
- 元素获得焦点
- When losing focus
- 元素失去焦点
焦点事件的 Event 对象具有以下结构:
- FocusFlags (short)
- 焦点变化的原因(与 com.sun.star.awt.FocusChangeReason 一致的默认值)
- NextFocus (Object)
- 获得焦点的对象(仅适用于 When losing focus 事件)
- Temporary (Boolean)
- 暂时丢失焦点
控制元素特有的事件
除了所有控制元素都支持的上述事件之外,还有一些专为某些控制元素定义的控制元素特有的事件。其中最重要的事件是:
- When Item Changed
- 控制元素的值发生变化
- Item Status Changed
- 控制元素的状态发生变化
- Text modified
- 控制元素的文本发生变化
- When initiating
- 可以在触发控制元素(例如,按下按钮)时执行的操作
请注意,在使用事件时,每次用鼠标单击某些控制元素(例如,单选按钮)时,都会启动一些事件,如 When initiating 事件。此时并不会执行任何操作以检查控制元素的状态是否真的发生了变化。要避免此类“盲目事件”,请将旧控制元素值保存在一个全局变量中,然后检查在执行事件时该值是否发生了变化。
Item Status Changed 事件的属性如下所示:
- Selected (long)
- 当前选定的条目
- Highlighted (long)
- 当前突出显示的条目
- ItemId (long)
- 条目 ID
Content on this page is licensed under the Public Documentation License (PDL). |