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

6.2.8 结果综合 

对不同方法的评估结果,可按一定的公式进行综合。当用户按下“计算”按钮时,系统进行计算并把综合结果写入HazAttr只读编辑框中。

为保证结果显示的正确性,每次增加、修改、删除操作确认后HazAttr编辑框清空。 

6.2.9 编辑对话框的输入检查 

当用户单击“增加”或“修改”按钮时系统将弹出一个编辑对话框,让用户输入或修改记录内容。其中的三个编辑框,一个组合列表框分别对应TMethod 的四个域。由于TMethod的Result域必须是[0,1]间的小数,因此当用户按OK键关闭对话框时应进行类型和范围检查。

在VB中我做过同样的工作,那时需要对用户输入的键码逐个进行判断。但这种方法很繁琐、很难做圆满(如不能很好地支持编辑键)。而Object Pascal提供了更好的方法。这种方法的关键就在于它的类型转换函数Val: 

procedure Val(Str: String;var V; var Code: Integer); 

V是由Str转换成的整型或实型数。若字符串非法,则出错位置返至Code;否则置Code为0。字符串非法并不会引发一个转换异常。

如果转换后的数超出了我们的范围,则显式把Code置为-1。最后统一通过检测Code是否为0来判断输入是否合法。

我们把输入检查放在对话框的OnCloseQuery事件处理过程中。如输入非法,则禁止对话框关闭,并将输入焦点置于Result编辑框中。但假如用户按了Cancel按钮,则这种检查是多余的。为此定义一个布尔变量IsCancel,对话框生成时置为False。假如用户按下Cancel,则置为True,此时OnCloseQuery事件不进行输入检查。

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

procedure TEditForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

var

Res: Real;

k: Integer;

begin

if IsCancel = False then

begin

val(Result.text,Res,k);

if (Res > 1) or (Res < 0) then k := -1;

if k <> 0 then

begin

MessageDlg('非法输入 !',mtWarning,[mbOK],0);

Result.text := '';

CanClose := False;

Result.SetFocus;

end;

end;

end; 

6.2.10 文件和系统的关闭 

文件关闭须调用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; 

6.2.11 记录文件小结 

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

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

6.3 文件控件的应用 

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

6.3.1 文件控件及其相互关系 

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

表6.4 Delphi专用文件控件━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

控件名 功能

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

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

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

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

DirectoryOutline 目录树(6.4节专门介绍)

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

以上控件前四个在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单独应用时仍能根据需要显示特定的文件。在6.4节中我们将应用这一功能。

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

时间: 2024-11-03 21:39:10

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

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

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

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

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

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

6.3.2 文件名浏览查找系统的设计思路 作为文件控件的应用实例,我们开发了一个简单的文件名浏览查找系统.这个系统可用于文件名的显示,把选中的文件写入列表框,并能按文件编辑框中输入的通配符对文件进行查找. 表6.5 部件的设计 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 部件 属性 功能 ───────────────────────────────────── FileCtrForm Position=poDefault 主窗口 DirLabel 显示当前目录

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

6.2.7 记录的删除.插入.排序 删除一条记录的基本思路是:获取当前记录的位置并把该位置后的记录逐个向前移动. 文件在最后一条记录前截断. for i:=CurrentRec+1 to Count-1 do begin seek(MethodFile,i); read(MethodFile,MethodRec); seek(MethodFile,i-1); Write(MethodFile,MethodRec); end; Truncate(MethodFile); 为避免误删除,在进行删除操

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

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

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

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

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

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

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

6.2 记录文件的应用 6.2.1 任务介绍 在这一节,我们开发一个系统安全性综合评估方法管理系统.系统安全性在复杂项目开发中十分重要,但由于牵涉面广因而很难获得客观.全面的评估值.鉴于此我们提出多角度.多侧面评估而后定量集成的思路,并在此基础上提出了多种安全性综合评估方法.每种方法由不同部门进行评估而后把结果汇总.综合. 为此我们定义如下的记录类型: type TNature = (Micro,Macro); {方法性质,分为微观和宏观两类} TMethod = Record Name: st

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

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