文件系统控件方案:文件搜索器应用程序

因为用户常常希望快速查找应用程序的可用文件或文件组,所以,许多应用程序都提供查询文件系统的功能。Winseek.vbp 示例应用程序协助用户浏览驱动器和目录并显示所有类型的文件。

图 7.19   WinSeek 应用程序中的文件系统控件

下表总结了 WinSeek 应用程序 Seek.frm 窗体中使用的控件。

控件 属性 设置值
DriveListBox Name drvList
DirListBox Name dirList
FileListBox Name
Pattern
filList
*.*
第一个 CommandButton Name
Caption
Default
cmdSearch
&Search
True
第二个 CommandButton Name
Caption
cmdExit
E&xit
ListBox Name lstFoundFiles

注意 文件系统控件没有 caption 属性,虽然可为它们加标签并指定访问键。关于这种使用标签的方法的详细信息,请参阅本章后面的“使用 Label 控件”一节。

编写 WinSeek 应用程序的代码

用鼠标单击驱动器列表框中的项目就会触发 Change 事件。当用户选定项目并接着改变窗体上的焦点时也将触发 Change 事件。在目录列表框中,需要 DblClick 事件生成 Change 事件。

当用户不想用鼠标变更目录时,通常使用箭头键选定需要的目录然后按 ENTER 键。

因为 ENTER 键通常与缺省 CommandButton 控件关联,所以,WinSeek 必须识别,用户在何时只是想变更目录而不搜索文件。

通过判断 dirList 列表框的路径是否不同于当前突出显示的目录,WinSeek 应用程序解决了这个问题。当用户单击目录列表框中的项目或用箭头键在目录列表框中移动时,可能发生这种情况。下列代码判断 dirList.Path 是否与突出显示的目录不同。若不同,则更新 dirList.Path。若相同,则执行搜索操作。

Private Sub cmdSearch_Click()
   .
   .
   .
' dirList.Path 与当前选定目录不同,
'则执行更新操作;否则执行
'搜索操作。
If dirList.Path <> dirList.List(dirList.ListIndex) Then
   dirList.Path = dirList.List(dirList.ListIndex)
   Exit Sub
End If
'继续搜索。
   .
   .
   .
End Sub

WinSeek 应用程序使用下述过程处理重要的事件:

DriveListBox 控件的 Change 事件

当用户单击驱动器列表框的项目时就会生成控件的 Change 事件。此时将调用 drvList_Change 事件过程并运行下述代码:

Private Sub drvList_Change ()
   On Error GoTo DriveHandler
   '若选定新驱动器,则 Dir1 列表框
   '更新显示。
   dirList.Path = drvList.Drive
   Exit Sub   
'若发生错误,则用 dirList.Path 重新
'设置 drvList.DriveDriveHandler:
   drvList.Drive = dirList.Path
   Exit Sub   
End Sub

注意,无论用鼠标单击还是移动选项(例如,利用箭头键移动),在选定新驱动器时都将在驱动器列表框中发生 Change 事件。试图访问未关闭驱动器门的软盘驱动器,或者选定一个无意中已切断连接的网络驱动器,诸如此类的操作都将触发错误处理程序。因为出错后不能按原先的安排赋值,所以 dirList.Path 仍包含先前的有效驱动器。将 dirList.Path 重新赋予 drvList.Drive 后就可更正这个错误。

详细信息 请参阅“调试代码和处理错误”。

DirListBox 控件的 Change 事件

如果用户双击目录列表框中的项目或在代码中(如 drvList_Change 过程中)变更 dirList 的 Path 属性,就会启动 dirList_Change 事件。下列代码响应此事件:

Private Sub dirList_Change ()
   '更新文件列表框,以便与目录列表框同步。
   filList.Path = dirList.Path
End Sub

此事件过程将 dirList 列表框的 Path 属性赋予 filList 列表框的 Path 属性。这将在 filList 列表框中触发重新绘制的 PathChange 事件;不必在 filList_PathChange 过程中添加代码,因为此应用程序中的事件链在 filList 列表框结束。

CommandButton 控件的 Click 事件

此事件过程判断 dirList 列表框中突出显示的项目是否和 dirList.Path 相同。若项目不同,则更新 dirList.Path;否则执行搜索操作。

Private Sub cmdSearch_Click ()
   .
   .
   .
   ' dirList.Path 与当前选定的目录不同,
   '则更新;否则执行搜索。
   If dirList.Path <> dirList.List _
   (dirList.ListIndex) Then
      dirList.Path = dirList.List(dirList.ListIndex)
      Exit Sub
   End If
   '继续搜索。
   .
   .
   .
End Sub

注意 可用附加功能增强 WinSeek 应用程序。例如会出现这样的情况,希望使用文件控件的属性。这时可通过使用复选框使用户设置文件属性的不同组合,以使文件列表框显示 Hidden、System 等等属性的文件。这将把搜索限制在满足条件的文件中。