计算机等级考试二级Delphi辅导知识:文件管理_第5页

考试站(www.examzz.com)   【考试站:中国教育考试第一门户】   2012年12月27日
6.3.3 文件名浏览查找系统的功能和实现 
   6.3.3.1 按指定后缀名显示当前目录中的文件 
   实现这一功能只需要在控件间建立正确的联系即可,不需要代码支持。建立联系的方法如(6.3.1)中的介绍。 
   6.3.3.2 把选中的文件添加到列表框中 
   在FileListBox1的OnClick事件中: 
   procedure TFileCtrForm.FileListBox1Click(Sender: TObject);
   begin
   if Searched then
   begin
   Searched := False;
   ListBox1.Items.Clear;
   Label5.Caption := 'Selected Files';
   end;
   if NotInList(ExtractFileName(FileListBox1.FileName),ListBox1.Items) then
   ListBox1.Items.Add(ExtractFileName(FileListBox1.FileName));
   end;
   Searched是一个全局变量,用于标明ListBox1当前显示内容是查找的结果还是从FileListBox1中选定的文件。
   函数NotInList用于判断待添加的字符串是否已存在于一个TStrings对象中。函数返回一个布尔型变量。
   NotInList的具体实现如下。 
   Function TFileCtrForm.NotInList(FileName: String;Items: TStrings): Boolean;
   var
   i: Integer;
   begin
   for I := 0 to Items.Count-1 do
   if Items[i] = FileName then
   begin
   NotInList := False;
   Exit;
   end;
   NotInList := True;
   end; 
   6.3.3.3 按指定匹配字符串显示当前目录中的文件 
   当在FileEdit中输入一个匹配字符串,并回车,文件列表框将显示匹配结果。这一功能在FileEdit的OnKeyPress事件中实现。 
   procedure TFileCtrForm.FileEditKeyPress(Sender: TObject; var Key: Char);
   begin
   if Key = #13 then
   begin
   FileListBox1.ApplyFilePath(FileEdit.Text);
   Key := #0;
   end;
   end;
   文件列表框提供的ApplyFilePath方法是解决这一问题的关键所在。 
   6.3.3.4 按指定匹配字符串查找当前目录中的文件 
   为了进行比较,我们用另一种方法来实现文件的查找功能,即利用标准过程FindFirst、FindNext。FileList1与ListBox1 中的内容完全一致。
   当用户单击“查找”按钮时,与FileEdit 中字符串相匹配的文件将显示在ListBox1中。下面是实现代码。 
   procedure TFileCtrForm.Button1Click(Sender: TObject);
   var
   i: Integer;
   SearchRec: TSearchRec;
   begin
   Searched := True;
   Label5.Caption := 'Search Result';
   ListBox1.Items.Clear;
   FindFirst(FileEdit.text,faAnyFile,SearchRec);
   ListBox1.Items.Add(SearchRec.Name);
   Repeat
   i := FindNext(SearchRec);
   If i = 0 then
   ListBox1.Items.Add(SearchRec.Name);
   until i <> 0;
   end;
   SearchRec是一个TSearchRec类型的记录。TSearchRec的定义如下: 
   TSearchRec = record
   Fill: array[1..21] of Byte;
   Attr: Byte;
   Time: Longint;
   Size: Longint;
   Name: string[12];
   end;
   在这一结构中提供了很多信息,灵活应用将给编程带来很大方便。下面我们举几个例子。
   1. 检测给定文件的大小。 
   function GetFileSize(const FileName: String): LongInt;
   var
   SearchRec: TSearchRec;
   begin
   if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
   Result := SearchRec.Size
   else
   Result := -1;
   end; 
   这一程序将在下一节中应用。
   2. 获取给定文件的时间戳,事实上等价于FileAge函数。 
   function GetFileTime(const FileName: String): Longint;
   var
   SearchRec: TSearchRec;
   begin
   if FindFirst(ExpandFileName(FileName),faAnyFile, SearchRec) = 0 then
   Result := SearchRec.Time
   else
   Result := -1;
   end; 
   3. 检测文件的属性。如果文件具有某种属性,则 
   SearchRec.Attr And GivenAttr > 0 
   属性常量对应的值与意义如下表: 
   表6.6 属性常量对应的值与意义
   ━━━━━━━━━━━━━━━━━━━━
   常量 值 描述
   ─────────────────────
   faReadOnly $01 只读文件
   faHidden $02 隐藏文件
   faSysFile $04 系统文件
   faVolumeID $08 卷标文件
   faDirectory $10 目录文件
   faArchive $20 档案文件
   faAnyFile $3F 任何文件
   ━━━━━━━━━━━━━━━━━━━━ 
   6.4 文件管理综合举例:文件管理器的实现 
   在本章的最后,我们利用Delphi提供的文件控件和文件管理函数开发一个简单的文件管理器。虽然这一文件管理器还无法和Windows提供的文件管理器相比拟,但它也为一般的文件操作提供了足够多的功能,而且如果读者感兴趣,还可以对它做进一步的扩充。在后边的拖放操作一章中,我们就为它提供了拖放支持,使它看起来更象一个“文件管理器”。
   6.4.1 设计基本思路 
   6.4.1.1 窗口设计 
   文件管理器的主窗口是一个多文档界面(MDI)。有关文件、目录的显示和文件管理功能的实现都放在子窗口中。在程序执行过程中将根据需要弹出一些完成不同操作的对话框。这些对话框都是在需要时动态生成的。表6.7给出了本程序所设计窗体的清单。 
   表6.7 FileManger窗体清单
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   窗体类 功能 用于创建该类窗体的菜单项
   ──────────────────────────────────────
   TFileManager 主窗口
   TFMForm 子窗口 Windows|New Window
   TFileAttrForm 显示文件属性 File|Properties;Function|Search
   TChangeForm 文件移动、拷贝、改名、改变 File|Move.Cope.Rename 当前目录等操作的输入对话框 Directory|change Directory
   TSearchForm 输入待查找文件的名称和路径 Function|Search
   TDiskViewForm 显示磁盘信息 Function|Disk View
   TViewDir 输入待创建的子目录 Directory|CreateDirectory
   TAboutBox 显示版权信息 Help|About
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
   6.4.1.2 界面设计 
   主窗口界面主要是主菜单和用于表示当前目录、当前文件的状态条。 
   表6.8 主窗口界面设计
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   部件 属性 功能
   ─────────────────────────────
   FileManager Style=fsMDI 主窗口
   WindowMenu=Windows
   Position=poDefault
   MainMenu1 主菜单
   FilePanel Align=alBottom 显示当前选中文件
   BevelInner=bvLowered
   BevelWidth=2
   DirectoryPanel Align=alBottom 显示当前选中目录
   Alignment=taLeftJustify
   BevelInner=bvLowered
   BevelWidth=2
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   主窗口主菜单包括File、WIndows、Help三项。File菜单项在子窗口生成时被子窗口同名菜单项所取代。设置Windows、Help的GroupIndex = 9,可以使子窗口生成时这两个菜单项仍存在。
   子窗口界面包括主菜单、目录树(DirectoryOutline)、文件列表框、 用于显示驱动器的标签集(TabSet)以及三个用于显示驱动器类型的TImage部件。 
   表6.9 子窗口界面设计
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   部件 属性 功能
   ───────────────────────────────────────
   FMForm ActiveControl=DirectoryOutline 子窗口
   Position=poDefault
   Style=fsMDIChild
   MainMenu1 主菜单
   DriveTabSet Align=alTop 显示驱动器
   style=tsOwnerDraw
   DirectoryOutline Align=alLeft 显示当前驱动器的目录树
   options=[ooDrawTreeRoot,
   ooDrawFocusRect,ooStretchBitmaps]
   FileList Align=alClient 显示当前目录中的文件
   FileType=[ftReadOnly,
   ftHidden,ftSystem,ftArchive,ftNormal]
   ShowGlyphs=True
   Network(Image) Picture(Network.bmp) 标志网络驱动器
   Vsible=False
   Floppy(Image) Picture(Floppy.bmp) 标志软驱
   Visible=False
   Fixed(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 do
   MDIChildren[i].Windowstate := wsMinimized;
   子窗口关闭时释放内存空间,为此在子窗口TFMForm的OnClose事件中令
   Action := OnFree;
   为了保持和Windows的File Manager的一致性,我们也禁止关闭最后一个子窗口,这需要在子窗口的OnCloseQuery事件处理过程中实现:
   If FileManager.MDIChildCount <= 1 then
   CanClose := False;
   CanClose是OnCloseQuery事件过程返回的一个参数,用于判定窗口是否可以关闭。
   由于这一过程归子窗口所有,因而MDIChildCount前必须加上其对象名FileManager。
   但不幸的是:这样一来我们的程序无法终止了!原来MDI窗口关闭前首先关闭其所有的子窗口。如果子窗口不能关闭,MDI窗口也不能关闭。
   为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的Exit项

相关文章