逻辑悖论:学习使用microsoft windows common controls 6.0 (sp6)中几个常用控件

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 04:40:07
这几个控件是:Toolbar、Imagelist、Statusbar、Treeview、Listview

这只是本人的学习体会,水平有限,谬误之处一定不少,欢迎斧正。

为确定起见,模仿资源管理器做一个示例。

一、具体有下面一些功能:

1、窗体自带一个用Toolbar生成的菜单

2、左边是Treeview控件,用来显示文件夹,每个节点表示一个文件夹

3、右边是Listview控件,用来显示左边选中节点(文件夹)下一级的文件夹和文件,每个Item表示一个文件夹或者一个文件

4、下面是Strtusbar控件,显示一些系统状态信息,同时第六个窗格显示即时操作的动作

5、左边的Treeview可以进行的操作有
a、添加节点(同级或下级节点)
b、修改节点名称
c、删除节点
d、拖动一个节点使其成为另一个节点的子节点(在合法的条件下)
e、可以把外部的文件夹或者文件拖放到节点下,并保存到数据库

6、右边的Listview可以进行的操作有
a、修改Item的名称
b、删除Item
c、拖动一个Item使其成为另一个节点下的文件夹或者文件
d、可以将外部的文件夹或者文件拖放到Listview里,使其成为当前节点下的子文件夹或者文件
e、可以改变Listview的样式(这里只用了二种样式)
f、可以按第一、第二或第四列排序

先看一下示例的演示
2010-9-9 14:24:46 上传下载附件 (436.36 KB)

二、本示例涉及内容有:
1、建表,字段,数据类型,表间关系
2、建窗体,窗体式样,在窗体添加控件
3、建模块,自定义函数,事件过程
4、自动化对象:adodb.connection、adodb.recordset、filesystemobject、dictionary
5、sql语句中的select语句,update语句,insert语句,delete语句
6、ado连接,ado记录集,ado读写大字段
7、使用记录集
8、变量、变量类型转换、数组
9、用递归遍历指定的文件夹中的所有文件夹和文件、用递归遍历Treeview控件指定节点下的所有节点
10、Access自带的一些功能
11、自定义快捷菜单
12、imagelist,treeview,listwiew,toolbar,progressbar,statusbar等控件的初始化、加载、卸载等。

db1.rar
三、下面来一步步编写这个示例

1、先新建一个mdb,然后新建一个窗体命名为frmMain,对窗体的式样进行一些设置后保存

2、然后在vba窗体里,引用microsoft windows common controls 6.0 (sp6)

3、按照从简至繁的原则,从Toolbar开始,看名称知道是一个工具栏控件

a、在窗体添加一个Toolbar控件
在窗体的设计视图中,打开工具箱,找到Microsoft Toolbar Control 6.0,将其添加到窗体页眉,适当调整一下大小。
命名为Toolbar0


b、在窗体添加一个Imagelist控件
Toolbar中的Botton是可以带图标的。为此,在窗体上添加一个Imagelist做为图标来源。
在窗体设计视图,从工具箱中找到Microsoft Imagelist Control 6.0 (sp6),将其添加到窗体
命名为Imagelist3,选择属性对话框,为它添加图标


c、设置Toolbar,有二种方法,一种是在Toolbar的属性对话框中直接设置。另一种是用代码设置

这里采用第一种方法设置属性
2010-9-9 15:08:31 上传下载附件 (80.45 KB)

用第二种方法添加Button和ButtonMenu

添加Button
语法是:Toolbar.Buttons.Add Index, Key, Text, Type, Face

如果这个Button是下拉式的,还可以添加第二层ButtonMenu
语法是:Toolbar.Buttons(Index).ButtonMenus.Add Index, Key, Text


d、因为用的是access,理所当然用数据表来保存Toolbar的各项参数,创建二个表

一个命名为tblTbrBtn,保存Button参数
2010-9-9 15:09:12 上传下载附件 (50.43 KB)

另一个命名为tblTbrBtnMenu,保存ButtonMenu参数
2010-9-9 15:09:38 上传下载附件 (41.63 KB)

二个表之间用ID和PID组成一对多关系,并钩选实施参照完整性、级联更新和级联删除
2010-9-9 15:14:03 上传下载附件 (47.89 KB)

e、在表中输入数据
2010-9-9 15:14:16 上传下载附件 (103.27 KB)

f、在窗体加载事件中输入代码,加载Toolbar

Private Sub Form_Load()
加载Toolbar Me.Toolbar0
End Sub

g、下面是加载Toolbar过程,新建一个模块,命名为modToolbar,将下面的过程复制到模块

Sub 加载Toolbar(ByVal objTbr As Object, ByVal objImglist As Object)
Dim Rs As Object
With objTbr
.Top = 0
.Left = 0
.Width = Forms("frmMain").InsideWidth
Set Rs = CurrentDb.OpenRecordset("select * from tblTbrBtn order by id")
Do Until Rs.EOF
.Buttons.Add CInt(Rs(0)), CStr(Rs(1)), CStr(Rs(2)), CStr(Rs(3)), CInt(Rs(4))
Rs.movenext
Loop
Set Rs = Nothing
Set Rs = CurrentDb.OpenRecordset("select * from tblTbrBtnMenu order by pid, id")
Do Until Rs.EOF
.Buttons(CInt(Rs(1))).ButtonMenus.Add CInt(Rs(0)), CStr(Rs(2)), CStr(Rs(3))
Rs.movenext
Loop
Set Rs = Nothing
End With
End Sub

h、加载完成后的窗体,图13
2010-9-9 14:28:56 上传下载附件 (21.35 KB)


i、为所有的Button和ButtonMenu的单击事件指定过程

Private Sub Toolbar0_ButtonClick(ByVal Button As Object)
If Button.Key = "Exit" Then
DoCmd.Close acForm, Me.Name
Else
TbrClick Button.Key
End If
End Sub

Private Sub Toolbar0_ButtonMenuClick(ByVal ButtonMenu As Object)
TbrClick ButtonMenu.Key
End Sub

j、下面的按钮过程放在模块modToolbar中
Sub TbrClick(ByVal strAction As String)
MsgBox "当前调用的过程:" & strAction
End Sub

k、点击后的效果。至于调用的过程,也放在同一个模块中,如何写代码等具体使用时继续。

12.JPG(103.27 KB, 下载次数: 6)

2010-9-9 15:14:50 上传

下载次数: 6

4、Statusbar控件,看名称就知道是状态栏控件。接下来操作与Toolbar类似
a、在窗体页脚添加一个Statusbar控件,命名为Statusbar0,适当调整一下大小

b、创建一个数据表用来保存控件的参数,命名为tblStatusbar,并输入数据
2010-9-9 15:12:51 上传下载附件 (32.52 KB)
c、添加Panel
语法:Statusbar.Panels.Add index, key, text, Style
其中style有几个特定的值是用来显示电脑硬件信息的,这时候的text是默认的
d、添加Panel以后,对每一个Panel的属性进行设置
e、在窗体的加载事件中添加一句,成为:
Private Sub Form_Load()
加载Toolbar Me.Toolbar0
加载StatusBar Me.StatusBar0, Me.ImageList3.Object
End Sub
f、下面是加载过程。新建一个模块,命名modStatusbar,把下面的代码复制进去
Sub 加载StatusBar(ByVal objStatusBar As Object, ByVal objImagelist As Object)
Dim Rs As Object
With objStatusBar
.Top = 0
.Left = 0
.Width = Forms("frmMain").InsideWidth
Set Rs = CurrentDb.OpenRecordset("select * from tblStatusbar order by id")
Do Until Rs.EOF
If IsNull(Rs(2)) Then
.Panels.Add CInt(Rs(0)), Rs(1), , CInt(Rs(3))
ElseIf Rs("strtext") = "currentuser" Then
.Panels.Add CInt(Rs(0)), Rs(1), CurrentUser(), CInt(Rs(3))
Else
.Panels.Add CInt(Rs(0)), Rs(1), Rs(2), CInt(Rs(3))
End If
With .Panels(Int(Rs(0)))
If CInt(Rs(4)) <> 0 Then
.Picture = objImagelist.ListImages(CInt(Rs(4))).Picture
End If
.Alignment = Rs(5)
.AutoSize = Rs(6)
.Bevel = Rs(7)
.Width = Rs(8)
.ToolTipText = Rs(9)
End With
Rs.movenext
Loop
Set Rs = Nothing
End With
End Sub
g、其中第六个Panel是用来显示用户的操作信息的,当用户进行不同的操作时,提示简短的文字
过程如下,可以在需要的地方调用
Sub pnlEditText(ByVal strPnltext As String)
Forms("frmMain").Controls("StatusBar2").Panels(6).Text = strPnltext
End Sub
h、然后把原来在modToolbar中的那个点击事件过程中msgbox显示的信息,改到用Ststusbar来显示。
Msgbox "当前调用的过程:" & strAction
改为
pnlEditText "当前调用的过程:" & strAction
i、加载Toolbar和Statusbar以后的窗体,图18

2010-9-9 14:30:52 上传下载附件 (30.08 KB)

三个比较简单的控件已经ok了。重点是如何设计出合适的数据表并且添加合适的数据,然后创建合适的记录集来对控件进行加载。
接下去是二个相对要复杂一些的控件Treeview和Listview,暂时先到这里。