其数据流程图如下:

1、登录界面

2、浏览文档管理界面
员工表(yg_tab)
|
字段英文名 |
字段中文名 |
长度 |
备注 | |
|
Id |
自动编号 |
int |
4 |
主键唯一 |
|
Username |
姓名 |
varchar |
50 |
|
|
Userid |
员工编号 |
varchar |
20 |
|
|
Passwd |
密码 |
varchar |
10 |
|
目录管理doc_path(该表可描述多级子目录,采用递归算法)
|
字段名 |
字段说明 |
类型 |
长度 |
备注 |
|
Id |
自动编号 |
Int |
4 |
主键,唯一KEY |
|
Path_name |
目录名称 |
varchar |
50 |
记录当前目录名,用于显示 |
|
Path_tyep |
目录类型 |
char |
1 |
0-私有,1-完全共享,2-受限共享 |
|
Content |
共享说明 |
varchar |
50 |
|
|
Gxdate |
共享日期 |
datetime |
8 |
|
|
See_id |
共享查看人员 |
varchar |
200 |
可多个,用“,”分开,关联员工表中的userid |
|
Path_des |
目录描述 |
varchar |
200 |
|
|
Path_dir |
目录完整路径 |
varchar |
200 |
|
|
Create_userid |
目录创建者编号 |
varchar |
50 |
关联员工表中的员工编号userid |
|
Dir_date |
目录创建时间 |
datetime |
8 |
|
|
sub_id |
父目录编号 |
int |
4 |
当该目录没有父目录则为空,有则等于上面的ID |
|
Backup |
备注 |
varchar |
200 |
|
文件管理:doc_file
|
字段名 |
字段说明 |
类型 |
长度 |
备注 |
|
Path_Id |
目录编号 |
Int |
4 |
关联doc_path中的ID |
|
File_id |
文件编号 |
int |
4 |
主键,唯一KEY |
|
File_name |
文件名 |
varchar |
50 |
|
|
File_des |
文件描述 |
varchar |
100 |
|
|
Keyword |
关键字 |
varchar |
50 |
|
|
File_use |
文件拥有者 |
varchar |
50 |
关联员工表中的员工编号userid |
|
Create_date |
文件创建日期 |
datetime |
8 |
|
|
File_tyep |
文件类型 |
char |
1 |
0-私有,1-完全共享,2-受限共享 |
|
Content |
共享说明 |
varchar |
50 |
|
|
Gxdate |
共享日期 |
datetime |
8 |
|
|
See_id |
共享查看人员 |
varchar |
200 |
可多个,用“,”分开,关联员工表中的userid |
1. 先建立好上面的数据库,这里略。启动Visual Basic 6.0。在新建项目中选择标准EXE确定,则进入开发环境中,把工程名换名为FileManage。增加一个模块并命名为ModPublic,在模块中定义一些全局变量。代码如下:
Public objDB As _ New ADOAccess Public CurrNode As _ MSComctlLib.Node '树结点 Public nodX As Object '在拖动的项 Public gUserName As String '用户名 Public gUserId As String '用户号 Public gShareType As Integer '共享类型 Public Type people '自定义 userId As String userName As String End Type Public yg() As people
说明:上面的ADOAccess是本人编写的一个组件,在计算机世界网的应用与方案栏中的《Visual Basic.NET中访问数据的方法 》一文可找到。是一个功能强大的数据访问组件,有关数据操作都封装在里面,仅需直接调用就可。
2. 增加一个登录表单,命名为frmLogin,在上面放入控件二个标签,二个文本控件并命名为txtUser、txtID,一个按钮控件并命名为cmdLogin。如下图:

在其代码窗口中编号代码如下:
Private Sub Form_Load()
objDB.ConnAccess (App.Path + "\test.mdb")
End Sub
Private Sub cmdLogin_Click()
Dim strWhere As String
Dim recTemp As ADODB.Recordset
gUserName = txtUser.Text
gUserId = txtID.Text
'strWhere = "UserName='" & txtUser.Text & "' and userid='" & txtID.Text & "'"
If gUserName = "" Then
MsgBox "请输入用户!", vbExclamation + vbOKOnly, "错误"
Exit Sub
End If
If gUserId = "" Then
MsgBox "请输入用户密码!", vbExclamation + vbOKOnly, "错误"
Exit Sub
End If
strWhere = "UserName='" & gUserName & "' and passwd='" & gUserId & "'"
Set recTemp = objDB.OpenTable("yg_tab", strWhere)
If Not recTemp.EOF Then
gUserId = recTemp!userId
frmBrowse.Show
Else
MsgBox "非法的用户,请重新登录!", vbExclamation + vbOKOnly, "错误"
txtUser.Text = ""
txtID.Text = ""
Exit Sub
End If
End Sub
说明:上面的代码在表单的Load事件中连接数据库test.mdb,在登录按钮的单击事件中先取得用户名和密码,然后进行验证,确定后则进入下一表单,否则提示出错信息。3. 增加一个浏览表单,命名为frmBrowse,在上面放入二个选择控件其标题分别为浏览、查询文件,一个树控件、一个列表控件,一个公共对话盒控件,一个文本控件并命名为txtPath, 一个图片控件并命名为TreeImageList。7个按钮控件并分别命名为cmdDelFile、cmdDelDir、cmdShareFile、cmdShareDir、cmdCreateFile、cmdCreateDir、cmdSave,标题分别为删除文件、删除目录、共享文件、共享目录、创建文件、创建目录、文件上载。布置如下图:
定义二个局部变量
Dim indrag As Boolean Dim tNode As Node
单击表单,在表单的Load事件中编写图片控件的图片资源,并把列表控件设置为报表类型。代码如下:
Private Sub Form_Load()
With Me.TreeImageList.ListImages
.Clear
.Add , "Drive", LoadResPicture("Drive", vbResBitmap)
.Add 2, "Close", LoadResPicture("CLSDFOLD", vbResBitmap)
.Add , "Open", LoadResPicture("OPENFOLD", vbResBitmap)
.Add , "Doc", LoadResPicture("WINDOC", vbResBitmap)
.Add , "Bmp", LoadResPicture("BMP", vbResBitmap)
End With
ListView1.View = lvwReport
End Sub
编写一个建立树结点的过程,这里怎样建立树结点不再着作介绍,请参考其它资料。代码如下:
Public Sub CreateTree(ByVal strType As String)
Dim recTemp As New ADODB.Recordset
Dim strWhere As String
Dim parFlag As String '父结点的标记。
Dim sonFlag As String '子结点的标记。
Const TOPIMAGE = 1, FIRSTIMAGE = 1, TWOIMAGE = 1, _
THREEIMAGE = 1, FOURIMAGE = 1
TreeView1.Visible = True
Dim strNodeText As String '树结点的名字。
Dim flatNodeNum As Integer '当前层树结点数。
Dim i As Integer, j As Integer, k As Integer
TreeView1.Nodes.Clear
parFlag = "K00"
strNodeText = "文件目录列表" + strType
Set tNode = TreeView1.Nodes.Add(, tvwChild, parFlag, _
strNodeText, "Drive") '生成顶结点
tNode.Expanded = True
''''''''生成第一层结点
strWhere = "sub_id=0 order by id"
Set recTemp = objDB.OpenTable("doc_path", strWhere)
With recTemp
For i = 0 To .RecordCount - 1
strNodeText = Trim(recTemp(1))
sonFlag = "K" + CStr(recTemp!Id)
' sonFlag = CStr(recTemp!Id)
Set tNode = TreeView1.Nodes.Add(parFlag, tvwChild, _
sonFlag, strNodeText, "Close") '生成第一层结点
tNode.Tag = "node"
.MoveNext
Next
End With
''''''''生成第2层结点
strWhere = "sub_id<>0 order by id"
Set recTemp = objDB.OpenTable("doc_path", strWhere)
With recTemp
For i = 0 To .RecordCount - 1
strNodeText = Trim(recTemp(1))
parFlag = "K" + CStr(recTemp!sub_id)
sonFlag = "K" + CStr(recTemp!Id)
' sonFlag = CStr(recTemp!Id)
Set tNode = TreeView1.Nodes.Add(parFlag, _
tvwChild, sonFlag, strNodeText, "Close")
tNode.Tag = "node"
.MoveNext
Next
End With
End Sub
编写浏览单选事件,单击浏览控件,在其单击事件中编写调用建立树的语句。代码如下:
Private Sub Option1_Click()
Call CreateTree("")
End Sub
查找文档功能的实现
编写文件单选事件,单击文件查找控件,在其单击事件中编写文件查找的语句,实现方法是提供给用户一个输入查找文件的输入框,
根据输入的内容打开表进行查找,表中没有所找的文件则退出,否则把找到的文件显示在列表框中,由于列表框设置为报表类型,
所以向列表框中增加项时,记录的第一个字段是主项,其它是子项,增加项时应该判断其是否为空值,且用标记设置所增加的是文件。
由于全部用中文显示且数据来源于不同的表中,故必须用复合查询语句实现。代码如下:
Private Sub Option2_Click()
Dim FindKey As String
Dim strWhere As String Dim strSql As String
Dim recTemp As New ADODB.Recordset
FindKey = InputBox("请输入查询文件的关键字", "查询")
strSql = "SELECT DISTINCT A.File_name,A.File_des,_
B.UserName,A.Create_date,A.file_id FROM doc_file A,_
yg_tab B,doc_path C Where A.File_use = B.Userid and_
a.keyword='" & FindKey & "'"
Set recTemp = objDB.ExecuteSQL(strSql)
If recTemp.EOF And Node.Children = 0 Then
ListView1.ListItems.Clear
Else
With recTemp
If .EOF Then Exit Sub
.MoveFirst
Do While Not .EOF
Set lItem = ListView1.ListItems.Add(, "K" + _
CStr(recTemp("file_id")), recTemp(0), , "Doc")
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(1)), "", recTemp(1))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(2)), "", recTemp(2))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(3)), "", recTemp(3))
lItem.Tag = "file"
.MoveNext
Loop
End With
TreeView1.Visible = False
End Sub
浏览功能的实现
当用户在浏览文档时是由树结点所选择,所以我们应该编写树结点的单击事件的代码。
当用户单击树结点时我们应该根据他所单击的结点确定该结点的路径并显示之,该结点下的目录和文件应该全部显示在列表框中。
目录与文件用不同的图标标识。列表框的内容更新时注意先清除各项。代码如下:
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim strWhere As String
Dim strSql As String
Dim recTemp As New ADODB.Recordset
Dim intParID
Dim lItem As ListItem
Set CurrNode = Node
If Len(Node.FullPath) > 7 Then
txtPath.Text = "当前浏览目录:" + Right(Node.FullPath, _
Len(Node.FullPath) - 7)
Else
txtPath.Text = "当前浏览目录:" + Node.FullPath
Exit Sub
End If
intParID = CInt(Mid(Node.Key, 2, Len(Node.Key)))
strWhere = "Path_Id=" & intParID & " order by id"
strSql = "SELECT DISTINCT A.Path_name, A.Path_des,B.UserName,_
A.Dir_date FROM doc_path A ,yg_tab B _
where A.Create_userid = B.userid and A.sub_id=" & intParID
Set recTemp = objDB.ExecuteSQL(strSql)
If Not recTemp.EOF Then
With recTemp
ListView1.ListItems.Clear
.MoveFirst
Do While Not .EOF
Set lItem = ListView1.ListItems.Add(, , recTemp(0), , "Close")
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(1)), "", recTemp(1))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(2)), "", recTemp(2))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(3)), "", recTemp(3))
lItem.Tag = "node"
.MoveNext
Loop
End With
End If
strSql = "SELECT DISTINCT A.File_name,A.File_des,B.UserName,_
A.Create_date,A.file_id FROM doc_file A,yg_tab B,_
doc_path C Where A.File_use = B.Userid and a.path_id=" & intParID
Set recTemp = objDB.ExecuteSQL(strSql)
If recTemp.EOF And Node.Children = 0 Then
ListView1.ListItems.Clear
Else
With recTemp
If .EOF Then Exit Sub
.MoveFirst
Do While Not .EOF
Set lItem = ListView1.ListItems.Add(, "K" +_
CStr(recTemp("file_id")), recTemp(0), , "Doc")
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(1)), "", recTemp(1))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(2)), "", recTemp(2))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(3)), "", recTemp(3))
lItem.Tag = "file"
.MoveNext
Loop
End With
End If
End Sub
文档上载功能的实现
文档上载主要是把用户的文件保存在用户所指定的目录中,我们可以借助公共对话控件为用户提供上载界面。
把公共对话控件设置为保存就可。文档上载时该先判断用户所选择的是文件,否则不能上载,且上载时应该考虑文件是否已存在。
文件上载可通过建立文件系统对象Scripting.FileSystemObject,利用FileSystemObject的CopyFile方法实现。代码如下:
Private Sub cmdSave_Click()
Dim DecFileName As String
Dim fs
Dim strFileName As String
If ListView1.SelectedItem.Tag <> "file" Then
Exit Sub
End If
strFileName = App.Path + "\temp"
dlgFileSave.ShowSave
DecFileName = dlgFileSave.FileName
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(DecFileName) Then
If MsgBox("文件已存在,是否覆盖?", vbQuestion + vbYesNo, "提示") = vbNo Then
Exit Sub
End If
End If
dlgFileSave.Flags = cdlOFNOverwritePromptfile2
If DecFileName <> "" Then
fs.CopyFile strFileName, DecFileName
End If
cmdSave.Enabled = False
End Sub
增加目录功能的实现
增加目录是根据用户的需要,由用户创建,其内容由用户录入。我们提供一个录入界面,把输入的信息保存在目录表中。
实现方法是增加一个表单,命名为frmCreateDir。在上面放入四个标签控件,三个文本控件并命名为txtDirName、txtPath、txtDes,
一个下拉列表控件并命名为cboType。二个按钮并命名为cmdYes、cmdCance
单击确定按钮,在其单击事件中编写代码。先判断输入是否有效,数据有效r后打开表,把数据插入表中。同时注意要更新树视图。
Private Sub cmdYes_Click()
Dim recTemp As New ADODB.Recordset
If txtDirName = "" Then
MsgBox "请输入目录名称!", vbExclamation + vbOKOnly, "错误"
Exit Sub
End If
'strSql = "inster into DISTINCT A.Path_name, A.Path_des,_
B.UserName, A.Dir_date FROM doc_path A ,yg_tab B where _
A.Create_userid = B.userid and A.sub_id=" & intParID
Set recTemp = objDB. ExecuteSQL ("doc_path")
With recTemp
.AddNew
!path_name = txtDirName.Text
!Path_tyep = Left(cboType.Text, 1)
!path_dir = txtPath.Text
!path_des = txtDes.Text
!Create_userid = gUserId
!Dir_date = Now
!sub_id = CInt(Right(CurrNode.Key, 1))
.Update
End With
frmBrowse.CreateTree ("")
Unload Me
End Sub
Private Sub cmdCance_Click()
Unload Me
End Sub

一沙一世界 一花一天堂 掌中握無……

网络编程技术、多媒体技术、PC应用技术

| 我爱研发网 | 中电华信 | 阿里西西 | JAVA爱好者 | 北京英才网 | 全球大学查询网 |
| 中国人的网站导航 | 中国电脑论坛 | 信息产业部 | 新浪科技 | 搜狐IT | 信息产业部电子教育与考试中心 |
| IT世界网 | 软件项目交易网 | 中国软件交易网 | 国信培训网 | 亚远景科技 | ....[更多] |