一、表格控件
Microsoft Hierarchical FlexGrid (MSHFlexGrid)、Microsoft FlexGrid (MSFlexGrid)、DataGrid是VB本身部件库中为开发者提供的三个常用的表格控件。通过这几个控件可以对数据库中的记录进行读写操作。
MSHFlexGrid控件可以显示网格数据,在对包含字符串和图片的表格进行分类、合并以及格式化时,具有完全的灵活性;还可以绑定到一个数据控件(如ADO、Data)上,对数据库中的数据进行读取,但是数据只能读,不能修改。
DataGrid控件实际上是一个固定的列集合,每一列的行数都是不确定的。它的每一个单元格都可以包含文本值,但不能链接或内嵌对象。可以在代码中指定当前单元格,或者用户可以使用鼠标或箭头键在运行时改变它。通过在单元格中键入或编程的方式,单元格可以交互地编辑。单元格能够被单独地选定或按照行来选定。也就是说,可以绑定到一个数据控件上,对数据库中的数据进行读写,即数据可读可写,但是这个控件的每一列的行数都是不确定的,而且它的每一个单元格都不能链接或内嵌对象。
综上所述,这几个表格控件虽然有其优点,但又都有局限性。程序员如果需要使用具有读写功能,而又不想与数据控件进行绑定的表格控件,就要自己来编写大量的代码,既麻烦又容易出错。下面介绍一个已经写好的表格控件代码,既把这三个控件的优点结合在一起,又回避了三者的局限性,让程序员的编程更容易更方便!
二、自定义控件
按照以上步骤制作的自定义控件UCXgrid 具备原表格控见的所有功能,同时还具有新的功能如下:据grid1的Rows属性设置用户表格的行数,Cols属性设置用户表格的列数;在表格上有一个文本输入区,跟随光标移动,输入的内容可以显示在相应的表格中;文本输入区跟随光标移动,还可以用键盘上的方向键来控制。
三、界面设计
在VB6.0中建立一个ActiveX工程,工程名称改为“UCXgrid”,在工具箱部件中添加MSHFLXGD.ocx 文件(或者在工程的部件中添加MSHFlexGrid控件),此处也可将MSHFlexGrid换成MSFlexGrid控件,将刚添加的控件加到用户控件内,名称改为grid1。再添加一个文本控件text2,其边框设为无。
四、控件制作
1.添加新功能
在代码编辑区编写如下代码:
'用户自定义过程
'根据Rows和Cols属性,加载表格的行数和列数,以及行标题和列的标题
Sub grid()
Dim j As Integer
With Grid1
For j = 1 To .Cols - 1
.TextMatrix(0, j) = "列" & j
Next j
For j = 1 To .Rows - 1
.TextMatrix(j, 0) = "行" & j
Next j
End With
End Sub
'对表格内容读功能的实现
'当前活动单元更改到一个不同单元时发生,实现 Text2文本的漂浮跟踪
Private Sub Grid1_EnterCell()
If Grid1.Row = 0 Or Grid1.Col = 0 Then Exit Sub
With Text2
.Text = ""
.Visible = False
.Top = Grid1.Top + Grid1.CellTop
.Left = Grid1.Left + Grid1.CellLeft
.Width = Grid1.CellWidth
.Height = Grid1.CellHeight
.Text = Grid1.Text
.Visible = True
.SetFocus
End With
End Sub
'对表格内容写功能的实现
'当前活动单元变更到一个不同的单元之前立即发生,实现Text2文本中的值添加到单元格中
Private Sub Grid1_LeaveCell()
Grid1.Text = Text2.Text
Text2.Text = ""
Text2.Visible = False
End Sub
'提高操作性的功能代码
'通过方向键来控制光标所在单元格中的位置
Private Sub Text2_Keydown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 39 '向右
Grid1.SetFocus
If Grid1.Col < Grid1.Cols Then Text2.Left = Grid1.Left + Grid1.CellLeft
Case 37 '向左
Grid1.SetFocus
If Grid1.Col > 1 Then Text2.Left = Grid1.Left - Grid1.CellLeft
Case 40 '向下
Grid1.SetFocus
If Grid1.Row < Grid1.Rows Then Text2.Top = Grid1.Top + Grid1.CellTop
Case 38 '向上
Grid1.SetFocus
If Grid1.Row <= 2 Then
Text2.Top = Grid1.Top + Grid1.CellTop
Else
Text2.Top = Grid1.Top - Grid1.CellTop
End If
End Select
End Sub
'通过方向键来控制光标所在单元格中的位置
Private Sub Text2_KeyUp(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 37, 38, 39, 40
Text2.SetFocus
End Select
End Sub
以上代码是需要用户自己添加的内容,接下来要利用VB6的控件接口向导,将想要的属性、方法和事件添加到自定义控件中。注意必须要选定Rows、Cols属性和grid方法,其他的步骤根据需要去选,或者按照向导默认完成。在完成向导提示内容后,回到代码编辑区,会看到关于Rows、Cols的代码,其中Rows代码勿动,Cols代码修改如下:
'注意!不要删除或修改下列被注释的行!
'MappingInfo=Grid1,Grid1,-1,Cols
Public Property Get Cols() As Long
Cols = Grid1.Cols
End Property
Public Property Let Cols(ByVal New_Cols As Long)
Grid1.Cols = New_Cols
PropertyChanged "Cols"
End Property
'Rows代码参考如下:
'注意!不要删除或修改下列被注释的行!
'MappingInfo=Grid1,Grid1,-1,Rows
Public Property Get Rows() As Long
Rows = Grid1.Rows
End Property
Public Property Let Rows(ByVal New_Rows As Long)
Grid1.Rows() = New_Rows
PropertyChanged "Rows"
End Property
五、文件保存及编译
将以上文件保存,然后通过文件菜单中的编译菜单项编译成UCXgrid.ocx文件,保存到文件加中。在文本框中输入表格的行数和列数,表格自动添加行列;当用户用鼠标点击表格中的任意单元格时,text2文本框会随着鼠标移动,并能把添加在text2中的内容添加在当前单元格中,这样就可以通过改写表格中的数据,来更新数据库相应记录中的数据了。
六、UCXgrid控件的加载和测试
1.文件加载
建立标准EXE工程,在工具箱的部件中通过浏览按钮,找到UCXgrid.ocx文件,添加到部件库,然后选中它,加载到本工程中。这时就可以像使用标准控件一样,使用自定义控件了。
2.UCXgrid控件使用
将UCXgrid控件添加到窗体form1中,可以在设计时,更改Rows、Cols属性值,也可以在运行时写代码赋值。然后在form1的load事件中调用UCXgrid控件的grid方法。
如添加后的UCXgrid控件名称为UCXgrid1,将其设置成8行5列,其使用的代码如下:
private sub form_load()
with UCXgrid1
. Rows=8
. Cols=5
. grid
end with
end sub
3.运行功能
将文件保存,运行后,表格自动被设成8行5列,同时具有标题行和列行,并且在表格单元内始终有文本框跟踪光标,可读取表格单元内的数据,也可以修改其内容,表格单元的光标移动,可以用方向键来控制。
七、结语
根据用户的要求制作自己的ActiveX控件,对用户来讲既方便又灵活,编译后的文件可以多次使用,提高了代码的重用性,减少了代码的出错机率。总之,这个自定义控件既具备了MSHFlexGrid、MSFlexGrid和DataGrid三者的优点,又回避了其缺点,同时还增强了其功能,提高了操作的灵活性。
|