第六章-文件管理(二)(4)2007-05-076.4 文件管理综合举例:文件管理器的实现 在本章的最后,我们利用Delphi提供的文件控件和文件管理函数开发一个简单的文件管理器。虽然这一文件管理器还无法和Windows提供的文件管理器相比拟,但它也为一般的文件操作提供了足够多的功能,而且如果读者感兴趣,还可以对它做进一步的扩充。在后边的拖放操作一章中,我们就为它提供了拖放支持,使它看起来更象一个“文件管理器”。6.4.1 设计基本思路 6.4.1.1 窗口设计 文件管理器的主窗口是一个多文档界面(MDI)。有关文件、目录的显示和文件管理功能的实现都放在子窗口中。在程序执行过程中将根据需要弹出一些完成不同操作的对话框。这些对话框都是在需要时动态生成的。表6.7给出了本程序所设计窗体的清单。 表6.7 FileManger窗体清单━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━窗体类 功能 用于创建该类窗体的菜单项──────────────────────────────────────TFileManager 主窗口 TFMForm 子窗口 Windows|New WindowTFileAttrForm 显示文件属性 File|Properties;Function|SearchTChangeForm 文件移动、拷贝、改名、改变 File|Move.Cope.Rename 当前目录等操作的输入对话框 Directory|change DirectoryTSearchForm 输入待查找文件的名称和路径 Function|SearchTDiskViewForm 显示磁盘信息 Function|Disk ViewTViewDir 输入待创建的子目录 Directory|CreateDirectoryTAboutBox 显示版权信息 Help|About━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.4.1.2 界面设计 主窗口界面主要是主菜单和用于表示当前目录、当前文件的状态条。 表6.8 主窗口界面设计━━━━━━━━━━━━━━━━━━━━━━━━━━━━━部件 属性 功能 ─────────────────────────────FileManager Style=fsMDI 主窗口WindowMenu=WindowsPosition=poDefault MainMenu1 主菜单FilePanel Align=alBottom 显示当前选中文件BevelInner=bvLoweredBevelWidth=2DirectoryPanel Align=alBottom 显示当前选中目录Alignment=taLeftJustifyBevelInner=bvLoweredBevelWidth=2━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━主窗口主菜单包括File、WIndows、Help三项。File菜单项在子窗口生成时被子窗口同名菜单项所取代。设置Windows、Help的GroupIndex = 9,可以使子窗口生成时这两个菜单项仍存在。子窗口界面包括主菜单、目录树(DirectoryOutline)、文件列表框、 用于显示驱动器的标签集(TabSet)以及三个用于显示驱动器类型的TImage部件。 表6.9 子窗口界面设计━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━部件 属性 功能───────────────────────────────────────FMForm ActiveControl=DirectoryOutline 子窗口Position=poDefaultStyle=fsMDIChildMainMenu1 主菜单DriveTabSet Align=alTop 显示驱动器style=tsOwnerDrawDirectoryOutline Align=alLeft 显示当前驱动器的目录树options=[ooDrawTreeRoot,ooDrawFocusRect,ooStretchBitmaps]FileList Align=alClient 显示当前目录中的文件FileType=[ftReadOnly,ftHidden,ftSystem,ftArchive,ftNormal]ShowGlyphs=TrueNetwork(Image) Picture(Network.bmp) 标志网络驱动器Vsible=FalseFloppy(Image) Picture(Floppy.bmp) 标志软驱Visible=FalseFixed(Image) Picture(Fixed.bmp) 标志硬驱Visible=False━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━子窗口主菜单包括File、Function、Directory三个菜单项, 分别用于完成文件的基本管理功能、其它管理功能和目录管理功能。由于对话框界面设计很简单,这里不再进行赘述。 读者可直接参考后面将给出的对话框界面图(图6.8---6.13)进行设计。6.4.2 子窗口的创建、布置和关闭子窗口的创建、布置由父窗口的Windows菜单控制,其菜单项如下:● New Windows : 创建新的子窗口● Tile : 平铺● Cascade : 层叠● ArrangeIcon : 排列图标 ● Minimized All : 极小化所有子窗口子窗口的创建只需要简单调用窗体的Create方法:FileMan := TFMForm.Create(Application);子窗口的标准排列方式直接调用MDI窗口的标准方法Tile、Cascade和ArrangeIcons。极小化所有子窗口的实现利用MDI窗口的两个属性:MDIChildCount和MDIChildren:for i := 0 to MDICount - 1 doMDIChildren[i].Windowstate := wsMinimized;子窗口关闭时释放内存空间,为此在子窗口TFMForm的OnClose事件中令Action := OnFree;为了保持和Windows的File Manager的一致性,我们也禁止关闭最后一个子窗口,这需要在子窗口的OnCloseQuery事件处理过程中实现:If FileManager.MDIChildCount <= 1 thenCanClose := False;CanClose是OnCloseQuery事件过程返回的一个参数,用于判定窗口是否可以关闭。由于这一过程归子窗口所有,因而MDIChildCount前必须加上其对象名FileManager。但不幸的是:这样一来我们的程序无法终止了!原来MDI窗口关闭前首先关闭其所有的子窗口。如果子窗口不能关闭,MDI窗口也不能关闭。为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的Exit项。定义一个全局变量varExitClick: Boolean;在子窗口的Exit1Click事件处理过程中:ExitClick := True;FileManager.Exit1Click(Sender);子窗口关闭前可以利用这一全局变量检测是否应关闭:If (FileManager.MDIChildCount <= 1) and (Not ExitClick) thenCanClose := False;