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|DiskView
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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
主窗口主菜单包括
子窗口界面包括主菜单、目录树
表
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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
子窗口主菜单包括
由于对话框界面设计很简单,这里不再进行赘述。
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的FileManager的一致性,我们也禁止关闭最后一个子窗口,这需要在子窗口的OnCloseQuery事件处理过程中实现:
为了保持和
If FileManager.MDIChildCount <= 1 then
CanClose := False;
CanClose是OnCloseQuery事件过程返回的一个参数,用于判定窗口是否可以关闭。MDIChildCount前必须加上其对象名FileManager。
由于这一过程归子窗口所有,因而
但不幸的是:这样一来我们的程序无法终止了!原来MDI窗口关闭前首先关闭其所有的子窗口。如果子窗口不能关闭,MDI窗口也不能关闭。
为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的Exit项。
定义一个全局变量
var
ExitClick: Boolean;
在子窗口的Exit1Click事件处理过程中:
ExitClick := True;
FileManager.Exit1Click(Sender);
子窗口关闭前可以利用这一全局变量检测是否应关闭:
CanClose := False;
6.4.3 文件控件的联系TabSet、DirectoryOutline、FileListBox,用于显示和选择驱动器、目录和文件。与(6.3)中所用方法相比,使用这一组控件需要少量的代码支持。
在本例中我们使用了一组新的控件:
TabSet与DirectoryOutline的联系在TabSet的Click事件处理过程中建立:
With DriveTabSet do
DirectoryOutline.Drive := Tabs[TabIndex][1];
DirectoryOutline与FileListBox的联系在DirectoryOutline的Change事件处理过程中建立:
FileList.Directory := DirectoryOutline.Directory;
FileList.Update;
6.4.4 DriveTabSet的自画风格显示 Dephi为一些控件提供了自画风格的显示,如ListBox、ComboBox、TabSet等。 在缺省情况下,这些控件自动显示文本。而在自画风格下,拥有控件的窗体在运行时间内自己画出控件的每一项目。
自画风格显示通常的应用是为项目除文本外再添加图形显示。能以自画风格显示的控件有一个共同特点:都拥有一个TStrings类型的项目链。由于TStrings类的特点(参第三章),它们都可以加入一个和对应文本相联系的对象。而这正是自画风格显示的关键。1.设置自画风格;2.向字符串链表添加图形对象;3.画出自画项目。
6.4.4.1 设置自画风格 Style 用于设置自画风格。对于DriveTabSet,我们把Style 属性设置为tsOwnerDraw。
控件属性
对于ListBox、ComboBox等控件的设置与TabSet略有差异,读者可参阅联机帮助文档。
6.4.4.2 向字符串链表添加图形对象 1.在应用程序中添加图片部件NetWork、Floppy、Fixed,并分别与三个位图文件NetWork.bmp、Floppy.bmp、Fixed.bmp相关联。
在本程序中我们设置了三个图片部件
2.把图片添加到字符串链表中OnCreate事件处理过程中,我们利用一个循环依次检测从a到z的驱动器是否存在以及驱动器的类型。这利用了WindwosAPI函数GetDrivetype, 如果驱动器不存在则返回0,否则返回驱动器的类型(DRIVE_REMOVABLE、DRIVE_FIXED、DRIVE_REMOTE)。根据驱动器类型我们可以判断与文本(驱动器名)同时添加到Tabs中的不同图形对象。在添加过程中,DriveTabSet的TabIndex被设置为当前驱动器。
根据字符串链表的性质,我们可以把对象与已存在的字符串建立联系,也可以同时添加字符串和对象。这里我们采用后一种方法。
在子窗口的
程序清单如下:
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;
由于
BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;
TStrings 的 Objects 属性中存放的对象都是 TObject类型,并没有Width 属性,因而需要再把它转化为 TBitmap类型的对象:
当把一个控件的风格设置为自画时,
通常情况下产生一个自画风格需要三个步骤:
If (FileManager.MDIChildCount <= 1) and (Not ExitClick) then File 、 Function 、 Directory三个菜单项, 分别用于完成文件的基本管理功能、其它管理功能和目录管理功能。 读者可直接参考后面将给出的对话框界面图(图6.8---6.13) 进行设计。 File 、 WIndows 、 Help三项。File 菜单项在子窗口生成时被子窗口同名菜单项所取代。设置 Windows、Help 的 GroupIndex= 9 ,可以使子窗口生成时这两个菜单项仍存在。 (DirectoryOutline)、文件列表框、 用于显示驱动器的标签集 (TabSet)以及三个用于显示驱动器类型的TImage部件。
表
━━━━━━━━━━━━━━━━━━━━
常量 值 描述
─────────────────────
当在
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-123274/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-123274/