UML软件工程组织 |
文档管理方法的实现(4) |
作者:
黎宇(摘自ZDNet
China) |
怎样移动文档,并且保证移动过程中可视?这是用户所关心的。我们可以通过拖曳方法实现。我们把文件从列表视图中拖到树视图中,事实上就是拖动一个控件,在一个完整的拖放动作(即将一个控件拖动到一个对象上,并释放鼠标按钮)完成.。拖放操作中可以设置图标,产生拖放视角。这里有几个关键的事件如MouseMove、DragDrop、DragOver等。我们在列表视图的鼠标移动事件中通过判断鼠标左键是否按下确定拖放图标并产生拖放。代码如下:
Private Sub ListView1_MouseMove_ (Button As Integer, Shift As Integer, x As Single, y As Single) If Button = vbLeftButton Then '指示拖动操作。 indrag = True '设置标志为 true。 '用 CreateDragImage 方法设置拖动图标。 ListView1.DragIcon = ListView1.SelectedItem.CreateDragImage ListView1.Drag vbBeginDrag '拖动操作。 End If End Sub 在一个完整的拖放动作完成后,DragDrop事件发生。当完成拖动时我们应该判断光标是否移动到一个对象上,当光标移动到TreeView1时就显示为系统的突出颜色,这由DropHighlight指定。释放鼠标按钮后结束拖放动作。代码如下: Private Sub ListView1_DragDrop_ (Source As Control, x As Single, y As Single) If TreeView1.DropHighlight Is Nothing Then Set TreeView1.DropHighlight = Nothing indrag = False Exit Sub Else If nodX = TreeView1.DropHighlight Then Exit Sub Cls ' Print nodX.Text & " dropped on " & TreeView1.DropHighlight.Text Set TreeView1.DropHighlight = Nothing indrag = False End If End Sub 当拖放动作产生,并拖动到TreeView1时,应该判断光标的坐标是否有效,即是否落在TreeView1上,这由HitTest 方法实现。 我们在TreeView1的DragOver(拖动经过)方法中设置鼠标的坐标。代码如下: Private Sub TreeView1_DragOver_ (Source As Control, x As Single, y As Single, State As Integer) If indrag = True Then '设置 DropHighlight 为鼠标的坐标。 Set TreeView1.DropHighlight = TreeView1.HitTest(x, y) End If End Sub 当拖放结束DragDrop时,要把拖动的对象放在目的地,这里是把被拖放的文件放入目录中,形成该目录下的文件。表面看好象是把文件移置到目录表,事实上我们只需找到该文件的目录号并把它更新于所拖到的目录中就可。要表示拖放成功,应在ListItems中删除该文件,同时重新更新TreeView1。代码如下: Private Sub TreeView1_DragDrop_ (Source As Control, x As Single, y As Single) Dim recTemp As New ADODB.Recordset Dim intPathID As Integer If TreeView1.DropHighlight Is Nothing Then Set TreeView1.DropHighlight = Nothing indrag = False Exit Sub Else If nodX = TreeView1.DropHighlight Then Exit Sub Set recTemp = objDB.OpenTable_ ("doc_path", "path_name='" & TreeView1.DropHighlight.Text & "'") intPathID = recTemp!Id Set recTemp = objDB.OpenTable_ ("doc_file", "File_name='" & nodX.Text & "'") recTemp!path_id = intPathID recTemp.Update ListView1.ListItems.Remove (nodX.Index) Call CreateTree("") indrag = False End If End Sub 删除文件的实现要简单些,主要是在ListView1删除文件,并从表中实际删除。代码如下: Private Sub cmdDelFile_Click() Dim recTemp As New ADODB.Recordset If ListView1.SelectedItem.Tag <> "file" Then MsgBox "请选择所删除的文件!", vbExclamation + vbOKOnly, "错误" Exit Sub End If If MsgBox("你真的要删除该文件吗?", vbQuestion + vbYesNo, "提示")=vbNo Then Exit Sub End If Set recTemp=objDB.OpenTable("doc_file", "File_name='" & nodX.Text & "'") recTemp.Delete recTemp.Update ListView1.ListItems.Remove (nodX.Index) cmdDelFile.Enabled = False End Sub 删除目录实际上分为删除目录和删除文件。代码如下: Private Sub cmdDelDir_Click() Dim recTemp As New ADODB.Recordset Dim Id As Integer If CurrNode.Text = "共享文件夹" Then MsgBox "该目录不能不删除!", vbExclamation + vbOKOnly, "错误" Exit Sub End If If nodX Is Nothing Then If MsgBox("你真的要删除该目录及目录下所有的文件吗?", _ vbQuestion + vbYesNo, "提示") = vbNo Then Exit Sub Else ' Set recTemp = objDB.OpenTable("doc_path",_ "path_name='" & CurrNode.Text & "' and ") Id = Mid(CurrNode.Key, 2, Len(CurrNode.Key) - 1) Set recTemp = objDB.ExecuteSQL("DELETE doc_path.* from doc_path _ where id=" & Id & " or sub_id=" & Id) ' recTemp.Delete ' recTemp.Update Call CreateTree("") Set recTemp = objDB.ExecuteSQL("DELETE doc_file.* FROM doc_file_ where path_id=" & Id) 'recTemp.Delete ' recTemp.Update Exit Sub End If End If If nodX.Tag <> "node" Then MsgBox "请选择所删除的目录!", vbExclamation + vbOKOnly, "错误" Exit Sub End If If MsgBox("你真的要删除该目录及目录下所有的文件吗?",_ vbQuestion + vbYesNo, "提示") = vbNo Then Exit Sub Else Set recTemp = objDB.OpenTable("doc_path",_ "path_name='" & nodX.Text & "'") recTemp.Delete recTemp.Update ListView1.ListItems.Remove (nodX.Index) Call CreateTree("") End If cmdDelFile.Enabled = False End Sub 目录共享功能的实现目录共享是由用户授权给共享人员,我们可以把权限分为三种(私有、完全共享、受限共享),通过一个ComboBox控件实现,其类型为下拉列表框,即属性Style选择2-Dropdown List,命名为cboType;共享的人员应该全部列出供选择,可通过ListBox实现,其类型为选择盒,即属性Style选择1-CheckBox。增加一个表单,命名为frmShareDir,布置如下: 在表单的Load事件中向List1填充yg_tab表的所有的人员号和人名,同时把它放入自定义定型yg中,供确定共享人员后填充共享字段用。代码如下: Private Sub Form_Load() Dim recTemp As New ADODB.Recordset Dim i As Integer i = 1 Set recTemp = objDB.ExecuteSQL("yg_tab") recTemp.MoveLast ReDim yg(recTemp.AbsolutePosition) recTemp.MoveFirst Do While Not recTemp.EOF yg(i).userId = recTemp!userId yg(i).userName = recTemp!userName List1.AddItem yg(i).userId + " " + yg(i).userName i = i + 1 recTemp.MoveNext Loop End Sub 在确定按钮中把共享人员的号码录入共享字段中,共享人员的号码由分号隔开。当然先应该保证录入有效。代码如下: Private Sub cmdYes_Click() Dim recTemp As New ADODB.Recordset Dim i As Integer If CurrNode = "" Then MsgBox "请输入目录名称!", vbExclamation + vbOKOnly, "错误" Exit Sub End If For i = 1 To List1.SelCount strID = strID + "," + yg(i).userId Next Set recTemp = objDB.OpenTable("doc_path", "id=" _ & Mid(CurrNode.Key, 2, Len(CurrNode.Key) - 1)) With recTemp !Path_tyep = gShareType If gShareType = 2 Then !See_id = IIf(IsNull(!See_id), "", !See_id) + "," + strID End If .Update End With Unload Me End Sub 文件共享功能的实现类似目录共享,这里不作说明。代码如下: Private Sub cboType_Click() gShareType = cboType.ListIndex If gShareType = 2 Then List1.Enabled = True Else List1.Enabled = False End If End Sub Private Sub cmdCance_Click() Unload Me End Sub Private Sub cmdYes_Click() Dim recTemp As New ADODB.Recordset Dim strID As String Dim i If List1.SelCount = 0 Then MsgBox "请选择共享人名!", vbExclamation + vbOKOnly, "错误" Exit Sub End If For i = 1 To List1.SelCount strID = strID + "," + yg(i).userId Next Set recTemp = objDB.OpenTable("doc_file", "file_id="_ & Mid(nodX.Key, 2, Len(nodX.Key) - 1)) With recTemp !file_type = gShareType If gShareType = 2 Then !See_id = IIf(IsNull(!See_id), "", !See_id) + "," + strID .Update End If End With ' frmBrowse.CreateTree ("") Unload Me End Sub Private Sub Form_Load() Dim recTemp As New ADODB.Recordset Dim i As Integer i = 1 Set recTemp = objDB.ExecuteSQL("yg_tab") recTemp.MoveLast ReDim yg(recTemp.AbsolutePosition) recTemp.MoveFirst Do While Not recTemp.EOF yg(i).userId = recTemp!userId yg(i).userName = recTemp!userName List1.AddItem yg(i).userId + " " + yg(i).userName i = i + 1 recTemp.MoveNext Loop End Sub 至此完成了一个复杂的文档管理软件的主要部分。其它希望读者自己完成。 |
版权所有:UML软件工程组织 |