Data 类
Data控件是一个Win32原生控件,用于打开DAO数据库并通过数据绑定向窗体上的其他控件公开单个记录集。它绘制一条包含四个箭头按钮的条——Move-First、Move-Previous、Move-Next、Move-Last——中间居中显示Caption,允许用户用鼠标浏览记录集。该控件通常在设计时放置在Form或UserControl上。设置DatabaseName和RecordSource即可填充控件;记录集在控件首次创建时自动打开。默认事件是Validate;该控件没有可用的默认属性。
Private Sub Form_Load()
With Data1
.DatabaseName = App.Path & "\biblio.mdb"
.RecordSource = "Authors"
.Caption = "Authors"
End With
Set Text1.DataSource = Data1
Text1.DataField = "Author"
End Sub
Private Sub Data1_Reposition()
Me.Caption = "Author " & (Data1.Recordset.AbsolutePosition + 1)
End Sub连接数据库
DefaultType选择数据库引擎(DatabaseTypeConstants):
| 常量 | 值 | 引擎 |
|---|---|---|
| vbUseJet | 2 | Microsoft Jet(经典VB6默认值)。 |
| vbUseODBC | 1 | ODBC数据源。 |
| vbUseACE | 3 | Microsoft Access ACE引擎。twinBASIC新增。 |
DatabaseName提供数据库文件路径(用于Jet/ACE)或DSN(用于ODBC);Connect是连接字符串。Jet风格的默认值"Access 2000;"在数据库打开前被改写为"MS Access;",与VB6行为匹配。Exclusive和ReadOnly传递给OpenDatabase,Options是DAO选项位掩码。DefaultCursorType仅在DefaultType为vbUseODBC时使用。
RecordSource是针对数据库打开的表名(或SQL语句),RecordsetType在表、动态集和快照之间选择(RecordsetTypeConstants)。调用Refresh使用这些属性的当前值重新打开记录集——通常在运行时更改其中一个属性后调用。
打开的对象以只读方式通过Database公开,以读写方式通过Recordset公开。为Recordset赋新值会断开与当前数据库的连接,采用新的记录集,并重新绑定所有依赖控件。
绑定控件
其他控件通过将其DataSource设置为此Data控件、将其DataField设置为Recordset中的字段名来成为数据绑定控件。绑定控件在当前记录更改时从该字段读取值,并在下次保存时将用户编辑写回字段。Data控件调解双向操作,在绑定控件重新同步后引发Reposition,在丢弃未保存编辑的操作之前引发Validate。
' 设计时这些通常在属性窗口中设置,
' 但也可以在代码中赋值:
Set txtTitle.DataSource = Data1
txtTitle.DataField = "Title"
Set chkInPrint.DataSource = Data1
chkInPrint.DataField = "InPrint"导航和文件末尾行为
四个按钮通过MoveFirst、MovePrevious、MoveNext和MoveLast浏览记录集。BOFAction控制用户移过第一条记录时发生什么(DataBOFconstants):vbMoveFirst(默认)跳回第一条记录;vbBOF让记录集停留在BOF标记上。EOFAction控制移过最后一条记录时发生什么(DataEOFConstants):vbMoveLast(默认)、vbEOF或vbAddNew——后者清除所有绑定控件并开始新记录。
验证/保存周期
每当控件即将离开当前记录——通过导航按钮、编程移动、Refresh、Update、Delete或卸载窗体——它会引发Validate,带有来自DataValidateConstants的Action参数和指示绑定控件是否持有未保存编辑的Save标志。将Action设置为vbDataActionCancel (0)取消操作并保留当前记录。如果返回时Save非零且操作继续执行,绑定控件会在移动发生前将数据写回记录集。
Reposition在成功移动后引发,此时绑定控件已显示新记录。UpdateControls在不引发Reposition的情况下将当前记录重新拉取到绑定控件中,UpdateRecord保留用于显式保存而不移动(当前未实现)。
属性
Appearance
确定操作系统如何绘制控件的边框。AppearanceConstants的成员:vbAppearFlat或vbAppear3d(默认)。
BackColor
Caption后面条带的填充颜色,类型为OLE_COLOR。默认为系统窗口背景色。
BOFAction
控制用户移过记录集开头时发生什么。DataBOFconstants的成员:vbMoveFirst (0,默认——跳回第一条记录)或vbBOF (1——让记录集停留在文件开头标记上,绑定控件保持清空)。
Caption
导航按钮之间条带中绘制的文本。String,默认"Data"。字符串直接从底层窗口读取——赋值给Caption会立即反映。
语法:object.Caption [ = string ]
CausesValidation
确定先前获得焦点的控件的Validate事件是否在此控件获得焦点之前运行。Boolean,默认True。这指的是先前控件的验证;关于Data控件自身的Validate事件,请参见上方的验证/保存周期部分。
Connect
传递给OpenDatabase的连接字符串。String,默认"Access 2000;"。默认值在数据库打开前被改写为"MS Access;",与VB6行为匹配。与DatabaseName、Exclusive、ReadOnly和Options一起使用。
ControlType
只读的ControlTypeConstants值,将此控件标识为Data控件。始终为vbDataControl。
Database
当前打开的DAO数据库。只读——赋值给Recordset或调用Refresh来更改。
DatabaseName
数据库文件路径(用于vbUseJet和vbUseACE)或DSN(用于vbUseODBC)。String。与Connect、Exclusive、ReadOnly和Options组合使用,在控件首次实例化或调用Refresh时打开数据库。
DefaultCursorType
当DefaultType为vbUseODBC时使用的游标驱动程序。DefaultCursorTypeConstants的成员:vbUseDefaultCursor (0,默认)、vbUseODBCCursor (1)或vbUseServersideCursor (2)。Jet和ACE连接忽略此属性。
DefaultType
要使用的数据库引擎。DatabaseTypeConstants的成员:vbUseJet (2,默认)、vbUseODBC (1)或vbUseACE (3——twinBASIC新增,使用Access ACE引擎)。在记录集打开时读取一次。
DragIcon
控件被拖放时用作鼠标光标的StdPicture(参见Drag和DragMode)。
DragMode
控件是否应在用户按住鼠标时自动拖动。DragModeConstants的成员:vbManual (0,默认——从代码调用Drag)或vbAutomatic (1)。
Enabled
确定控件是否接受用户输入。禁用的Data控件仍显示标题,但将导航按钮绘制为变暗状态并忽略键盘和鼠标交互。Boolean,默认True。
EOFAction
控制用户移过记录集末尾时发生什么。DataEOFConstants的成员:vbMoveLast (0,默认——跳回最后一条记录)、vbEOF (1——停留在文件末尾标记上)或vbAddNew (2——清除所有绑定控件并开始新记录以便编辑)。
Exclusive
当为True时,数据库以独占方式打开(其他进程或Data控件无法打开它)。Boolean,默认False。
Font
用于渲染Caption的StdFont。便捷属性FontName、FontSize、FontBold、FontItalic、FontStrikethru和FontUnderline读写此对象的相应成员。
ForeColor
标题的文本颜色,类型为OLE_COLOR。默认为系统窗口文本色。禁用的控件使用系统灰色文本色绘制标题。
Height
控件的高度,默认以缇为单位(或使用容器的ScaleMode单位)。Single。
hWnd
底层控件的Win32窗口句柄,类型为LongPtr。只读。可用于传递给API函数。
Index
当控件是控件数组的一部分时,此实例在数组中的从零开始的Long索引。运行时只读。
Left
从容器的左边缘到控件左边缘的水平距离。Single。
MouseIcon
当MousePointer为vbCustom且指针位于控件上时用作鼠标光标的StdPicture。
MousePointer
指针位于控件上时显示的鼠标光标。MousePointerConstants的成员。
Name
控件在其父窗体上的唯一设计时名称。运行时只读。
Negotiate
INFO
保留用于与VB6兼容;目前在twinBASIC中未实现。
OLEDropMode
控件如何响应OLE放置。OLEDropConstants的受限成员:vbOLEDropNone或vbOLEDropManual。Data控件不支持自动放置模式。
Options
DAO OpenRecordset选项的位掩码(如dbReadOnly、dbAppendOnly、dbDenyWrite)。Long,默认0。在记录集打开时读取一次。
Parent
对包含此控件的Form(或UserControl)的引用。只读。
ReadOnly
当为True时,数据库以只读方式打开,阻止对绑定字段的编辑。Boolean,默认False。注意这是twinBASIC中的保留字,必须通过成员访问(Data1.ReadOnly)或在声明中转义([ReadOnly])来引用。
Recordset
当前填充绑定控件的DAO记录集。Object(运行时为DAO.Recordset)。
语法:object.Recordset [ = recordset ]
读取Recordset返回打开的记录集,如果控件尚未连接则返回Nothing。使用Set设置Recordset会断开与当前数据库的连接,采用提供的记录集(及其父数据库),将其DatabaseName、Connect、ReadOnly、RecordsetType和RecordSource值复制回控件,重新绑定所有依赖字段,并引发Reposition。
RecordsetType
要打开的记录集类型。RecordsetTypeConstants的成员:vbRSTypeTable (0)、vbRSTypeDynaset (1,默认)或vbRSTypeSnapShot (2)。在记录集打开时读取一次。
RecordSource
提供记录集的表名、查询名或SQL语句。String。在记录集打开时读取一次。
RightToLeft
INFO
保留用于与VB6兼容;目前在twinBASIC中未实现。
TabIndex
控件在窗体TAB键导航顺序中的位置。Long。
TabStop
用户是否可以通过按TAB键到达控件。Boolean,默认True。禁用的控件无论此设置如何都会被跳过。
Tag
应用程序可用于将自定义数据与控件关联的自由格式String。框架忽略此属性。
ToolTipText
当用户将鼠标悬停在控件上时作为工具提示显示的多行String。
Top
从容器顶部到控件顶部的垂直距离。Single。
Visible
控件是否显示。Boolean,默认True。
VisualStyles
绘制导航按钮时是否使用操作系统主题引擎。Boolean,默认True。
WhatsThisHelpID
标识应用程序帮助文件中"这是什么?"弹出帮助主题的Long值。参见ShowWhatsThis。
Width
控件的宽度。Single。
方法
Drag
开始、完成或取消手动拖放操作。通常在DragMode为vbManual时从MouseDown处理程序中调用。
语法:object.Drag [ Action ]
- Action
- 可选 DragConstants的成员:vbCancel (0)、vbBeginDrag (1,默认)或vbEndDrag (2)。
Move
在单次调用中重新定位并可选地调整控件大小。
语法:object.Move Left [, Top [, Width [, Height ] ] ]
- Left
- 必需 给出新水平位置的Single值。
- Top、Width、Height
- 可选 对应属性的新值。省略的值保持不变。
OLEDrag
从控件发起OLE拖动操作,引发OLEStartDrag事件以便应用程序填充DataObject。
语法:object.OLEDrag
Refresh
保存绑定控件中所有未保存的编辑,关闭当前记录集,并使用DatabaseName、Connect、RecordSource、RecordsetType、Exclusive、ReadOnly和Options的当前值重新打开。绑定控件随后重新同步并引发Reposition。
语法:object.Refresh
SetFocus
将输入焦点移至控件。控件必须同时Visible和Enabled,否则引发运行时错误5(Invalid procedure call or argument)。
语法:object.SetFocus
ShowWhatsThis
INFO
保留用于与VB6兼容;目前在twinBASIC中未实现。
以"这是什么?"弹出的方式显示由WhatsThisHelpID标识的主题。
语法:object.ShowWhatsThis
UpdateControls
将当前记录的值重新读入所有绑定控件,丢弃任何未保存的编辑。当验证拒绝编辑时作为手动"还原"很有用。不引发Reposition。
语法:object.UpdateControls
UpdateRecord
INFO
保留用于与VB6兼容;目前在twinBASIC中未实现。在VB6中,这会将绑定控件的编辑保存到记录集而不引发Validate。在实现之前,可通过直接调用Recordset.Update强制保存,或触经过验证/保存周期的导航/刷新。
语法:object.UpdateRecord
ZOrder
将控件置于其同级堆栈的前面或后面。
语法:object.ZOrder [ Position ]
- Position
- 可选 ZOrderConstants的成员:vbBringToFront (0,默认)或vbSendToBack (1)。
事件
DragDrop
手动拖动操作在目标控件上结束时在目标控件上引发。
语法:object_DragDrop( Source As Control, X As Single, Y As Single )
DragOver
手动拖动操作进行中时在光标下方的控件上引发。
语法:object_DragOver( Source As Control, X As Single, Y As Single, State As Integer )
Error
INFO
保留用于与VB6兼容;目前在twinBASIC中不会引发。在VB6中,当异步DAO操作在应用程序可拦截的代码路径之外失败时引发此事件;通过正常的On Error处理产生的同步错误不需要此事件。
语法:object_Error( DataErr As Integer, Response As Integer )
Initialize
在底层窗口创建后且记录集打开前立即引发一次。用于从代码及时设置DatabaseName、RecordSource或Connect以进行首次连接。twinBASIC新增——VB6在Data控件上没有等效功能。
语法:object_Initialize( )
MouseDown
用户在控件上按下任意鼠标按钮时引发。
语法:object_MouseDown( Button As Integer, Shift As Integer, X As Single, Y As Single )
MouseMove
光标在控件上移动时引发。
语法:object_MouseMove( Button As Integer, Shift As Integer, X As Single, Y As Single )
MouseUp
用户在控件上释放鼠标按钮时引发。
语法:object_MouseUp( Button As Integer, Shift As Integer, X As Single, Y As Single )
MouseWheel
鼠标滚轮在控件上滚动时引发。twinBASIC新增。
语法:object_MouseWheel( Delta As Integer, Horizontal As Boolean )
OLECompleteDrag
OLE拖动操作完成时在源控件上引发,指示目标接受了哪种效果(复制、移动、无)。
语法:object_OLECompleteDrag( Effect As Long )
OLEDragDrop
用户将数据放置到目标控件上时在目标控件上引发。
语法:object_OLEDragDrop( Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single )
OLEDragOver
OLE拖动经过目标控件时在目标控件上引发。
语法:object_OLEDragOver( Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer )
OLEGiveFeedback
拖动期间在源控件上引发,以便应用程序调整光标或其他视觉反馈。
语法:object_OLEGiveFeedback( Effect As Long, DefaultCursors As Boolean )
OLESetData
当目标请求已注册但尚未提供的数据格式时在源控件上引发。
语法:object_OLESetData( Data As DataObject, DataFormat As Integer )
OLEStartDrag
OLE拖动开始时在源控件上引发,以便应用程序填充DataObject并选择允许的效果。
语法:object_OLEStartDrag( Data As DataObject, AllowedEffects As Long )
Reposition
在当前记录更改后引发——通过导航按钮、对Recordset的编程移动、对Recordset的赋值或Refresh——且每个绑定控件已重新同步到新记录之后。这是更新派生UI(如"第 n 条,共 m 条"标题)的时机。
语法:object_Reposition( )
Resize
INFO
保留用于与VB6兼容;目前在twinBASIC中不会引发。
语法:object_Resize( )
Validate
在任何将离开当前记录的操作之前引发——导航按钮、编程移动、Update、Delete、Refresh、Find、AddNew、显式关闭或卸载窗体。默认事件。
语法:object_Validate( Action As Integer, Save As Integer )
- Action
- DataValidateConstants的成员,标识触发验证的操作。将Action设置为vbDataActionCancel (0)取消操作并保留当前记录。
- Save
- 进入时,当绑定控件持有未保存编辑时为非零。返回前将其设置为零可丢弃这些编辑而不写回;保持非零可在操作继续执行前将编辑写入记录集。