庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>Delphi语言>基础教程>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

Delphi文件管理(四)

 作者:本站收集   日期:2005-3-29
字号选择〖 〗/ 双击滚屏 单击停止   

6.3.3.3 按指定匹配字符串显示当前目录中的文件 

  当在FileEdit中输入一个匹配字符串,并回车,文件列表框将显示匹配结果。这一功能在FileEditOnKeyPress事件中实现。 

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 按指定匹配字符串查找当前目录中的文件 

  为了进行比较,我们用另一种方法来实现文件的查找功能,即利用标准过程FindFirstFindNextFileList1ListBox1 中的内容完全一致。

        当用户单击“查找”按钮时,与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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

主窗口主菜单包括FileWIndowsHelp三项。File菜单项在子窗口生成时被子窗口同名菜单项所取代。设置WindowsHelpGroupIndex = 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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

子窗口主菜单包括FileFunctionDirectory三个菜单项, 分别用于完成文件的基本管理功能、其它管理功能和目录管理功能。

  由于对话框界面设计很简单,这里不再进行赘述。 读者可直接参考后面将给出的对话框界面图(6.8---6.13)进行设计

 

6.4.2 子窗口的创建、布置和关闭

 

  子窗口的创建、布置由父窗口的Windows菜单控制,其菜单项如下:

  ● New Windows : 创建新的子窗口

Tile : 平铺

  ● Cascade : 层叠

  ● ArrangeIcon : 排列图标

  Minimized All : 极小化所有子窗口

 

  子窗口的创建只需要简单调用窗体的Create方法:

 

  FileMan := TFMForm.Create(Application);

 

子窗口的标准排列方式直接调用MDI窗口的标准方法TileCascadeArrangeIcons

  极小化所有子窗口的实现利用MDI窗口的两个属性:MDIChildCountMDIChildren

 

  for i := 0 to MDICount - 1 do

MDIChildren[i].Windowstate := wsMinimized;

 

 

  子窗口关闭时释放内存空间,为此在子窗口TFMFormOnClose事件中令

 

Action := OnFree

 

  为了保持和WindowsFile Manager的一致性,我们也禁止关闭最后一个子窗口,这需要在子窗口的OnCloseQuery事件处理过程中实现:

 

If FileManager.MDIChildCount <= 1 then

CanClose := False;

 

CanCloseOnCloseQuery事件过程返回的一个参数,用于判定窗口是否可以关闭。

  由于这一过程归子窗口所有,因而MDIChildCount前必须加上其对象名FileManager

  但不幸的是:这样一来我们的程序无法终止了!原来MDI窗口关闭前首先关闭其所有的子窗口。如果子窗口不能关闭,MDI窗口也不能关闭。

为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的Exit项。

  定义一个全局变量

 

  var

ExitClick: Boolean;

 

在子窗口的Exit1Click事件处理过程中:

 

ExitClick := True;

FileManager.Exit1Click(Sender);

 

 

  子窗口关闭前可以利用这一全局变量检测是否应关闭:

 

  If (FileManager.MDIChildCount <= 1) and (Not ExitClick) then

CanClose := False;

 

6.4.3 文件控件的联系

 

  在本例中我们使用了一组新的控件:TabSetDirectoryOutlineFileListBox,用于显示和选择驱动器、目录和文件。与(6.3)中所用方法相比,使用这一组控件需要少量的代码支持。

  TabSetDirectoryOutline的联系在TabSetClick事件处理过程中建立:

 

  With DriveTabSet do

DirectoryOutline.Drive := Tabs[TabIndex][1];

 

DirectoryOutlineFileListBox的联系在DirectoryOutlineChange事件处理过程中建立:

 

FileList.Directory := DirectoryOutline.Directory;

FileList.Update;

 

6.4.4 DriveTabSet的自画风格显示 

  Dephi为一些控件提供了自画风格的显示,如ListBoxComboBoxTabSet等。 在缺省情况下,这些控件自动显示文本。而在自画风格下,拥有控件的窗体在运行时间内自己画出控件的每一项目。

自画风格显示通常的应用是为项目除文本外再添加图形显示。能以自画风格显示的控件有一个共同特点:都拥有一个TStrings类型的项目链。由于TStrings类的特点(参第三章),它们都可以加入一个和对应文本相联系的对象。 而这正是自画风格显示的关键。

  通常情况下产生一个自画风格需要三个步骤:

  1.设置自画风格;

  2.字符串链表添加图形对象;

  3.画出自画项目。 

6.4.4.1 设置自画风格 

  控件属性Style 用于设置自画风格。对于DriveTabSet,我们把Style 属性设置为tsOwnerDraw

  对于ListBoxComboBox等控件的设置与TabSet略有差异,读者可参阅联机帮助文档。 

6.4.4.2 字符串链表添加图形对象 

  1.在应用程序中添加图片部件

  在本程序中我们设置了三个图片部件NetWorkFloppyFixed,并分别与三个位图文件NetWork.bmpFloppy.bmpFixed.bmp相关联。

  2.把图片添加到字符串链表中

  根据字符串链表的性质,我们可以把对象与已存在的字符串建立联系,也可以同时添加字符串和对象。这里我们采用后一种方法。

  在子窗口的OnCreate事件处理过程中,我们利用一个循环依次检测从az驱动器是否存在以及驱动器的类型。这利用了Windwos API函数GetDrivetype, 如果驱动器不存在则返回0,否则返回驱动器的类型(DRIVE_REMOVABLEDRIVE_FIXEDDRIVE_REMOTE)。根据驱动器类型我们可以判断与文本(驱动器名)同时添加到Tabs中的不同图形对象。在添加过程中,DriveTabSetTabIndex被设置为当前驱动器。

程序清单如下: 

procedure TFMForm.FormCreate(Sender: TObject);

var

Drive, AddedIndex: Integer;

DriveLetter: Char;

begin

for Drive := 0 to 25 do

begin

DriveLetter := Chr(Drive + ord('a'));

case GetDrivetype(Drive) of

DRIVE_REMOVABLE:

AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Floppy.Picture.Graphic);

DRIVE_FIXED:

AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Fixed.Picture.Graphic);

DRIVE_REMOTE:

AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Network.Picture.Graphic);

end;

if UpCase(DriveLetter) = UpCase(FileList.Drive) then

DriveTabSet.TAbIndex := AddedIndex;

end;

end;

6.4.4.3 画出自画项目 

  当把一个控件的风格设置为自画时,Windows不再负责往屏幕上画出控件的项目,而是为每个可见项目产生自画事件。应用程序可以通过处理自画事件画出控件的项目。 

1.确定自画项目的大小 

  对于TabSet而言,这在OnMeasureTab事件处理过程中完成。我们需要把DriveTabSet每个标签的宽度增大到足以同时放下文本和位图。 

procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer;

var TabWidth: Integer);

var

BitmapWidth: Integer;

begin

BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;

Inc(TabWidth, 2 + BitmapWidth);

end;

  由于TStringsObjects属性中存放的对象都是TObject类型,并没有Width属性,因而需要再把它转化为TBitmap类型的对象: 

  BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;

 

上一篇:Delphi文件管理(五)    下一篇:Delphi文件管理(三)  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-3-29
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿