第六章-文件管理(一)(3)

6.2 记录文件的应用 

6.2.1 任务介绍 

在这一节,我们开发一个系统安全性综合评估方法管理系统。系统安全性在复杂项目开发中十分重要,但由于牵涉面广因而很难获得客观、全面的评估值。鉴于此我们提出多角度、多侧面评估而后定量集成的思路,并在此基础上提出了多种安全性综合评估方法。每种方法由不同部门进行评估而后把结果汇总、综合。

为此我们定义如下的记录类型: 

type

TNature = (Micro,Macro);

{方法性质,分为微观和宏观两类} 

 TMethod = Record

Name: string[20]; {方法名}

Condition: string[40]; {方法适用条件}

Nature: TNature; {方法性质}

Result: Real; {方法评估值}

end; 

用来记录不同方法的信息。

由于不同方法的条件、性质不同,因而对工程开发的不同阶段适用方法集也不同。因此需要根据实际情况对方法集进行管理。我们把每一方法作为一条记录,每一方法集作为一个记录文件。下面讨论系统的实现方法。 

6.2.2 设计基本思路 

本系统要实现的基本功能是文件的打开、创建、关闭、显示,记录的增加、修改、删除以及结果的综合和显示。为此我们使用了两组按钮分别用于文件和记录的操作, 使用一个StringGrid控件来显示文件内容,使用一个只读编辑框显示结果的综合。

其中各部件的名称、功能如下表所示: 

表6.1 主窗口部件的设计

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

部件名称 主要属性 备注

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

RecFileForm BorderStyle=bsDialog 文件打开后把文件名附到窗口标题后

Position=poScreenCenter

StringGrid1 大小行数动态确定

HazAttr(编辑框) ReadOnly=True 显示综合结果

OpenButton TabOrder=0 打开一个记录文件,若文件不存在则创建

NewButton Caption='打开' 创建一个记录文件,若文件存在则打开

CloseButton Caption='关闭' 关闭一个已打开的文件

AddButton Caption='增加' 增加一条记录

ModifyButton Caption='修改' 修改一条记录

DeleteButton Caption='删除' 删除一条记录

CalcuButton Caption='计算' 计算最终结果并显示

ExitButton Caption='退出' 系统终止。若当前有打开的文件则先关闭

OpenDialog1 Filter= 选择或输入欲打开的文件

'Record File(*.Rec)|.Rec

|Any File(*.*)|*.*'

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

另外,StringGrid1、HazAttr的标题用两个标签框(Label)来显示。

另外我们还需要一个编辑对话框。其中四个编辑框Name、Condition、Nature、 Result分别对应TMethod记录的四个域。

为协调程序运行,我们定义了一组全局变量。各变量的类型、作用如下表。 

表6.2 全局变量及其作用

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

变量名 类型 作用

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

MethodFile MethodFileType 与当前打开文件相关联的文件变量

FileName string[70] 当前打开文件的文件名

Count Count 当前打开文件的记录总数

CurrentRec Integer 当前处理记录号

FileOpened Boolean 当前是否有文件打开

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

记录文件类型MethodFileType的定义为 

type

MethodFileType = file of TMethod; 

布尔变量FileOpened用于控制文件按钮的使能、变灰,记录按钮的反应以及系统结束时是否需要首先关闭文件。 

6.2.3 记录文件的打开和创建 

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

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

FileMode的取值和意义如下表。 

表6.3 FileMode的取值和意义

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

取值 意义

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

0 只读

1 只写

2 读写

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

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

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

procedure TRecFileForm.OpenButtonClick(Sender: TObject);

begin

if OpenDialog1.Execute then

FileName := OpenDialog1.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],0);

end;

except

On EInOutError do

begin

FileOpened := False;

MessageDlg('文件不能创建',mtWarning,[mbOK],0);

end;

end;

end;

end;

if FileOpened = False then exit;

Count := FileSize(MethodFile);

if Count>0 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,并提示信息“文件不能创建”。

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

当用户按下“创建”按钮时,系统首先弹出一个标准输入框,要求用户输入文件名,确认后系统首先检测文件是否存在。若存在则直接打开,否则创建一个新文件。打开或创建过程导致异常,则重置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>0 then

ChangeGrid;

end

else

begin

Rewrite(MethodFile);

count := 0;

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;

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

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

● “创建”、“打开”按钮变灰,“关闭”按钮使能

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

时间: 2024-11-01 08:50:08

第六章-文件管理(一)(3)的相关文章

第六章-文件管理(三)(8)

6.4.8.2 状态条的显示 状态条用于显示当前目录和当前选中文件.它们的值在DirectoryOutline 和FileList的Change事件处理过程中修改. DirectoryOutline和FileList最终的Change事件处理过程如下: procedure TFMForm.DirectoryOutlineChange(Sender: TObject); begin CreateCaption; FileList.clear; FileList.Directory := Direc

第六章-文件管理(三)(2)

6.4.5.2 文件拷贝.移动.删除.更名 文件拷贝的关键是使用了以文件句柄为操作对象的文件管理函数,因而提供了一种底层的I/O通道.在Object Pascal中这一点是利用无类型文件实现的. 在文件拷贝中首先检查目标文件名是否是一个目录.如是则把原文件的文件名添加到目标路径后,生成目标文件全路径名.而后提取源文件的时间戳,以备拷贝完成后设置目标文件.拷贝过程中使用了返回文件句柄或以文件句柄为参数的文件管理函数FileOpen.FileCreate.FileRead.FileWrite.Fil

第六章-文件管理(二)(4)

6.4 文件管理综合举例:文件管理器的实现 在本章的最后,我们利用Delphi提供的文件控件和文件管理函数开发一个简单的文件管理器.虽然这一文件管理器还无法和Windows提供的文件管理器相比拟,但它也为一般的文件操作提供了足够多的功能,而且如果读者感兴趣,还可以对它做进一步的扩充.在后边的拖放操作一章中,我们就为它提供了拖放支持,使它看起来更象一个"文件管理器". 6.4.1 设计基本思路 6.4.1.1 窗口设计 文件管理器的主窗口是一个多文档界面(MDI).有关文件.目录的显示和

第六章-文件管理(二)(2)

6.2.8 结果综合 对不同方法的评估结果,可按一定的公式进行综合.当用户按下"计算"按钮时,系统进行计算并把综合结果写入HazAttr只读编辑框中. 为保证结果显示的正确性,每次增加.修改.删除操作确认后HazAttr编辑框清空. 6.2.9 编辑对话框的输入检查 当用户单击"增加"或"修改"按钮时系统将弹出一个编辑对话框,让用户输入或修改记录内容.其中的三个编辑框,一个组合列表框分别对应TMethod 的四个域.由于TMethod的Resul

第六章-文件管理(一)(1)

6.1 文件类型和标准过程 Delphi同Object Pascal一样支持三种文件类型,即:文本文件.记录文件.无类型文件. 6.1.1文本文件 文本文件类型的变量用如下方法声明: var TextFileVar: Text ; 文本文件是以行为单位进行读.写操作的.由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写.而且文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读.写操作是不允许的. 6.1.1.1 文本文件的打开.关闭 文本文件的打开需要两

第六章-文件管理(三)(7)

6.4.7.4 改变当前目录 改变当前目录的实现非常简单,只要修改DirectoryOutline的Directory属性.但需注意的是:当改变后目录所在驱动器也发生变化时应相应修改DriveTabSet的当前值.由于驱动器名与DriveTabSet的索引属性TabIndex之间并没有确定的对应关系,因而需要通过一个循环进行查找匹配. Change Directory的菜单事件处理过程是FileChange,即与文件的移动.拷贝.更名共用一个事件处理过程.详细情况请读者参看(6.4.5.3)中的

第六章-文件管理(三)(4)

6.4.6 其它文件管理功能的实现 在子窗口的Function菜单中,定义了一些其它的文件管理功能: ● Search :查找一个给定名字的文件,若存在则显示该文件属性 ● Disk View :显示当前驱动器的大小和剩余空间 ● View type :确定显示文件的类型 6.4.6.1 文件查找 当用户单击Search菜单项时,程序弹出一个对话框(如图6.10),要求输入待查找的文件名和查找路径.文件名可以是通配符.当用户确认后程序显示第一个匹配文件的属性(如图6.9).查找不到匹配文件则给出

第六章-文件管理(三)(1)

2.画出每个自画项目 这在TabSet的OnDrawTab事件处理过程中完成.这一事件处理过程的参数中包含了待画项目索引.画板.待画区域.是否被选中等.这里我们只利用了前三个参数.事实上利用最后一个参数,我们可以对被选中的标签进行一些特殊的视觉效果处理.这一工作就留给读者自己去完成. procedure TFMForm.DriveTabSetDrawTab(Sender: TObject; TabCanvas: TCanvas; R: TRect; Index: Integer; Selecte

第六章-文件管理(二)(5)

6.4.3 文件控件的联系 在本例中我们使用了一组新的控件:TabSet.DirectoryOutline.FileListBox,用于显示和选择驱动器.目录和文件.与(6.3)中所用方法相比,使用这一组控件需要少量的代码支持. TabSet与DirectoryOutline的联系在TabSet的Click事件处理过程中建立: With DriveTabSet do DirectoryOutline.Drive := Tabs[TabIndex][1]; DirectoryOutline与Fil