DELPHI基础教程:文件管理(一)[3]

DELPHI基础教程:文件管理(一)[3],第1张

记录文件的打开和创建

记录文件的打开和创建同文本文件一样也需要关联和初始化两个步骤 同文本文件唯一的不同是不能使用Append过程

记录文件缺省情况下以读写方式打开 如果想以只读或只写方式打开 则需要修改System单元中定义的变量FileMode的值

FileMode的取值和意义如下表

表 FileMode的取值和意义

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

取值 意义

──────────────

只读

只写

读写

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

FileMode是一个全局变量 对它的每次修改都将影响所有Reset的 *** 作 因此在打开自己的文件后应还原它的值

在本系统中 当用户按下 打开 按钮时 首先d出一个标准文件打开对话框 要求用户输入或选择文件名 确认后如果该文件名的文件存在 则用Reset打开 若不存在则创建 程序清单如下

procedure TRecFileForm OpenButtonClick(Sender: TObject)

begin

if OpenDialog Execute then

FileName := OpenDialog FileName

else

exit

AssignFile(MethodFile Filename)

try

Reset(MethodFile)

FileOpened := True

except

On EInOutError do

begin

try

if FileExists(FileName) = False then

begin

ReWrite(MethodFile)

FileOpened := True

end

else

begin

FileOpened := False

MessageDlg( 文件不能打开 mtWarning [mbOK] )

end

except

On EInOutError do

begin

FileOpened := False

MessageDlg( 文件不能创建 mtWarning [mbOK] )

end

end

end

end

if FileOpened = False then exit

Count := FileSize(MethodFile)

if Count>then

ChangeGrid

RecFileForm Caption := FormCaption+ +FileName

NewButton Enabled := False

OpenButton Enabled := False

CloseButton Enabled := True

end

首先系统试图用Reset打开一个文件 并置FileOpened为True 如果文件不能打开 则引发一个I/O异常 在异常处理过程中 首先检测文件是否存在 若不存在则创建这个文件 否则是其它原因引发的异常 则把FileOpend重置为False 并显示信息 文件不能打开 在文件创建过程中仍可能引发异常 因而在一个嵌套的异常处理中把FileOpened重置为False 并提示信息 文件不能创建

有关异常处理的内容请读者参看第十二章 这段程序说明 异常处理机制不仅能使我们的程序更健壮 而且为编程提供了灵活性

当用户按下 创建 按钮时 系统首先d出一个标准输入框 要求用户输入文件名 确认后系统首先检测文件是否存在 若存在则直接打开 否则创建一个新文件 打开或创建过程导致异常 则重置FileName和FileOpened两个全局变量

procedure TRecFileForm NewButtonClick(Sender: TObject)

begin

FileName := InputBox( 输入框 请输入文件名 )

if FileName = then Exit

try

AssignFile(MethodFile FileName)

if FileExists(FileName) then

begin

Reset(MethodFile)

Count := FileSize(MethodFile)

if Count>then

ChangeGrid

end

else

begin

Rewrite(MethodFile)

count :=

end

FileOpened := true

Except

on EInOutError do

begin

FileName :=

FileOpened := False

end

end

if FileOpened then

begin

NewButton Enabled := False

OpenButton Enabled := False

CloseButton Enabled := True

RecFileForm Caption := FormCaption+ +FileName

end

end

当文件打开或创建后 所要做的工作有

● 若文件非空 则计算文件长度 并用文件内容填充StringGrid

● 创建 打开 按钮变灰 关闭 按钮使能

● 把文件名附到窗口标题后

记录文件的读入和显示

定义一个全局变量Count用来保存文件中的记录个数 当文件装入时

Count := FileSize(MethodFile)

如果Count >则首先确定StringGrid 的高度 行数 为保证StringGrid 不会覆盖窗口下面的编辑框 定义一个常量MaxShow 当Count <MaxShow时 记录可全部显示 当Count >= MaxShow时 StringGrid 自动添加一个滚动棒 为保证滚动棒不覆盖掉显示内容 StringGrid 的宽度应留有余地

确定StringGrid 高度 行数的代码如下

With StringGrid do

if count <MaxShow then

Height := DefaultRowHeight * (Count+ )+

else

Height := DefaultRowHeight * MaxShow+

RowCount := Count+

end

而后从文件中逐个读入记录并显示在StringGrid 的相应位置

for i := to Count do

begin

Read(MethodFile MethodRec)

ShowMethod(MethodRec i)

end

ShowMehtod是一个过程 用来把一条记录填入StringGrid 的一行中 对于Name Condition域而言 只须直接赋值即可 而对Nature 域需要把枚举类型值转化为对应意义的字符串( : 微观 : 宏观 ) 而对Result域则需要把数值转化为一定格式的字符串

Str (MethodRec Result: : ResultStr)

StringGrid Cells[ Pos] := ResultStr

即Result显示域宽为 其中小数点后位数为

lishixinzhi/Article/program/Delphi/201311/25242

对话框的OnCloseQuery事件处理过程的程序清单如下

procedure TEditForm FormCloseQuery(Sender: TObjectvar CanClose: Boolean)

var

Res: Real

k: Integer

begin

if IsCancel = False then

begin

val(Result text Res k)

if (Res >) or (Res <) then k :=

if k <>then

begin

MessageDlg( 非法输入 ! mtWarning [mbOK] )

Result text :=

CanClose := False

Result SetFocus

end

end

end

文件和系统的关闭

文件关闭须调用CloseFile过程

CloseFile(MethodFile)

并对系统的状态重新进行设置

系统关闭时首先检测当前是否有打开的文件 若有则先关闭文件 这在主窗口的OnCloseQuery事件中实现

实现文件关闭的程序清单如下

procedure TRecFileForm CloseButtonClick(Sender: TObject)

begin

if FileOpened then

begin

CloseFile(MethodFile)

FileOpened := False

ClearGrid

OpenButton Enabled := True

NewButton Enabled := True

CloseButton Enabled := False

RecFileForm Caption := FormCaption

end

end

实现系统关闭前检查的程序清单如下

procedure TRecFileForm FormCloseQuery(Sender: TObject

var CanClose: Boolean)

begin

if FileOpened then

closeFile(MethodFile)

end

记录文件小结

我们所举的例子虽然简单 但基本覆盖了记录文件 *** 作的主要方面 这里关键问题在于灵活应用Delphi提供的文件管理函数 同时 为了保证程序的健壮性应对异常进行捕获并处理 在数据库应用技术发展的今天 记录文件的重要性也许有所下降 但对象我们这里所处理的简单问题它仍有用武之地

这里所举的例子一次只能处理一个文件 但读者可以很容易把它改为一个MDI程序 虽然对于这里的实际情况来说 似乎并无必要

文件控件的应用

Delphi文件管理的最大特色是提供了一组文件 *** 作控件 利用这些控件我们可以快速开发一个文件名浏览系统 其功能强大与其所需书写代码之少所形成的强烈反差 正是Dephi生命力的体现

文件控件及其相互关系

Delphi提供的专用文件控件如下表所示

表 Delphi专用文件控件

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

控件名 功能

─────────────────────────────────────

DriveComboBox 驱动器组合列表框 用于选择当前驱动器

FileListBox 文件列表框 用于显示当前目录中的文件和选中当前文件

FilterComboBox 文件类型组合列表框 用于选择显示文件的类型

DirectoryOutline 目录树( 节专门介绍)

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

以上控件前四个在Component Palette(部件选择板)的System页中 DirectoryOutline在Component Palette的Samples页中

以上文件控件再加上文件编辑框 目录标签框(事实上是一般的编辑框 标签框)就可以构成一个完整的文件 *** 作系统 它们之间的联系几乎不用代码支持 只要设置好相应的属性就可以了

FileEdit DirLabel FileListBox FileFilterComloList DirectoryListBox DriveComboList六个控件间的属性联系如下

DriveComboList DirList := DirectoryListBox

DirectoryListBox DirLabel := DirLabel

DirectoryListBox FileList := FileListBox

FileFilterComboList FileList := FileListBox

FileListBox FileEdit := FileEdit

以上联系可以在设计时完成 只要打开相应属性的选择列表框进行选择即可 也可以在运行时利用如上的赋值语句建立联系

文件控件的关键属性基本上都在以上联系中反映出来了 除此之外 FileFilterComboList有一个Filter属性 用来设置组合列表框的选择项 FileListBox 有一个Mask属性 用于设置显示文件的类型 这就允许FileListBox在脱离FileFilterComboList单独应用时仍能根据需要显示特定的文件 在 节中我们将应用这一功能

文件控件的方法 事件基本是从ListBox和ComboBox中继承的 但FileListBox 中有一个ApplyFilePath方法很有用 我们将在后边给出其用法

文件名浏览查找系统的设计思路

作为文件控件的应用实例 我们开发了一个简单的文件名浏览查找系统 这个系统可用于文件名的显示 把选中的文件写入列表框 并能按文件编辑框中输入的通配符对文件进行查找

表 部件的设计

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

部件 属性 功能

─────────────────────────────────────

FileCtrForm Position=poDefault 主窗口

DirLabel 显示当前目录

FileEdit TabOrder= 显示当前文件/输入文件显示匹配符

FileListBox FileEdit=FileEdit 显示当前目录文件

DirectoryListBox DirLabel=DirLabel 显示当前驱动器目录

FileList= FileListBox

DriveComboBox DirList= DirectoryListBox 选择当前驱动器

FilterComboBox FileList=FileListBox 选择文件显示类型

Filter= All Files(* *)|* *|

Source Files(* pas)|* pas|

Form Files(* dfm)|* dfm|

Project Files(* dpr)|* dpr

ListBox 显示选中或查找的文件

Button Caption= 查找 按 FileEdit 中的内容进行查找

Button Caption= 退出 退出系统

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

文件名浏览查找系统的功能和实现

按指定后缀名显示当前目录中的文件

实现这一功能只需要在控件间建立正确的联系即可 不需要代码支持 建立联系的方法如( )中的介绍

把选中的文件添加到列表框中

在FileListBox 的OnClick事件中

procedure TFileCtrForm FileListBox Click(Sender: TObject)

begin

if Searched then

begin

Searched := False

ListBox Items Clear

Label Caption := Selected Files

end

if NotInList(ExtractFileName(FileListBox FileName) ListBox Items) then

ListBox Items Add(ExtractFileName(FileListBox FileName))

end

Searched是一个全局变量 用于标明ListBox 当前显示内容是查找的结果还是从FileListBox 中选定的文件

lishixinzhi/Article/program/Delphi/201311/25237


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11751250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存