文件管理(一)
|
源代码网整理以下 Delphi继承了Object Pascal的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准控件,同时也提供了更多的文件管理函数。利用Delphi的强大功能,开发一个自己的文件管理系统就成为很容易的事。 源代码网整理以下 本章首先介绍Delphi文件管理的基本概念和标准过程/函数,并提供了一个记录文件的应用实例,这是从我们实际课题开发中提取出来的。而后介绍Delphi提供的文件控件的使用方法。最后提供的一个综合例程MDI文件管理器则是对Delphi文件管理功能的综合应用。 6.1 文件类型和标准过程 源代码网整理以下 Delphi同Object Pascal一样支持三种文件类型,即:文本文件、记录文件、无类型文件。 源代码网整理以下6.1.1文本文件 源代码网整理以下 文本文件类型的变量用如下方法声明: 源代码网整理以下var 源代码网整理以下TextFileVar: Text ; 源代码网整理以下 文本文件是以行为单位进行读、写操作的。由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。而且文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。 源代码网整理以下6.1.1.1 文本文件的打开、关闭 源代码网整理以下 文本文件的打开需要两个步骤:(1). 文件变量与文件名关联;(2). 初始化读写。 源代码网整理以下 联文件变量与文件名调用AssignFile标准过程: 源代码网整理以下AssignFile ( TextFileVar , FileName ) ; 源代码网整理以下 FileName 既可以是全路径名,也可以仅是文件名。对于后者系统将在当前目录下查找。 源代码网整理以下 AssignFile是Delphi新提供的一个函数,其功能等价于Object Pascal中的Assign。而Assign在Delphi中更多地被用作一个方法名。 源代码网整理以下初始化读写有三种方式: 软件开发网 www.mscto.com 源代码网整理以下1. Reset : 为读打开文件并把文件指针移动到文件首; 源代码网整理以下2. Rewrite : 为写创建一个新文件; 源代码网整理以下3. Append : 为写打开存在的文件并把文件指针定位在文件尾。 源代码网整理以下 当使用Reset或Append过程而文件不存在时将会引发一个I/O异常。有关I/O异常的处理请参看本章例程和第十二章中的介绍。 源代码网整理以下 文件的关闭很简单,只须调用CloseFile过程即可。 源代码网整理以下 虽然Delphi应用程序在退出时会自动关闭所有打开的文件,但自己动手关闭文件可以确保释放文件句柄,并使程序的可移植性增强。 源代码网整理以下 为保持兼容,Delphi也允许用户用Assign建立关联,Close关闭文件。 源代码网整理以下6.1.1.2 文本文件的读写 源代码网整理以下 从文本文件中读取信息用Read、Readln两个标准过程。 源代码网整理以下 当读入数值时,Read、Readln假定数值是用一个或多个空格分开的,而不是逗号、分号或其它字符。对如下一条语句: 源代码网整理以下Read ( TextFileVar , Num1 , Num2 , Num3 ) ; 源代码网整理以下 如果文件中的数值是: 源代码网整理以下100 200 300 源代码网整理以下 则能够成功读入,而若文件中的数值是 源代码网整理以下100 200, 300 源代码网整理以下 则Read读入“200,”并试图把它转化成一个数值时会引发一个异常。 源代码网整理以下 当读入字符是字符串时,Read、Readln过程总是读取尽可能多的字符填充到字符串变量中或一直读到行结束符为止。因此从文本文件中读取格式化的字符串数据,必须声明与其长度相匹配的字符串变量。如果要从文件中读取单词,必须先把文件中的每一行读入字符串,然后再从字符串中逐个分析出单词。或者一次只从文本文件中读入一个字符并测试每个字符后是否是单词断开处。 源代码网整理以下 格式化字符串之间的分隔符应读入到一个临时变量中,而字符串与数值、数值与数值间的分隔符读入时会自动识别剔除。对如下一行数据: 源代码网整理以下Mon 12:10 40 50 源代码网整理以下定义 源代码网整理以下var 源代码网整理以下Day: string[3] ; 软件开发网 www.mscto.com 源代码网整理以下Time: string[5] ; 源代码网整理以下Num1, Num2: Integer ; 源代码网整理以下则须用如下的read 语句读入: 源代码网整理以下read ( TextFileVar , Day , c , Time , Num1 , Num2 ) ; 源代码网整理以下C为一个临时字符变量。 源代码网整理以下6.1.1.3 文本文件的编辑 源代码网整理以下 在Delphi中实现对一个文本文件的编辑,只须让其与一个Tmemo控件建立关联即可: 软件开发网 www.mscto.com 源代码网整理以下Memo1.Lines.LoadFromFile ( TextFileName ) ; 源代码网整理以下这样在TMemo上所做的一切修改当调用Memo部件的SaveToFile方法后都会反映到文件中去。 源代码网整理以下6.1.2 记录文件 源代码网整理以下 记录文件是一种操作更为灵活的文件类型。它允许同时为读和写打开,而且由于记录文件中每条记录的长度固定,所以可随机存取。 源代码网整理以下记录文件的类型变量可如下声明: 源代码网整理以下var 源代码网整理以下RecordFileVar: file of RecordType; 源代码网整理以下RecordType是一个自定义的记录类型。 源代码网整理以下 有关记录文件的操作我们将在下一节中结合例程进行讨论。 源代码网整理以下6.1.3 无类型文件 源代码网整理以下 无类型文件提供了底层的I/O通道,可用于存取可变长度记录的文件。经常用于文件的复制操作中。由于Delphi提供了更好的方法(见第四节),所以无类型文件很少使用。有兴趣的读者可参看BlockRead、BlockWrite两个联机帮助主题。 源代码网整理以下6.1.4 Delphi的文件管理标准过程 源代码网整理以下 根据功能我们把标准过程划分为十一类进行介绍。 源代码网整理以下6.1.4.1 文件的打开与关闭 源代码网整理以下AssignFile :把一个外部文件名和一个文件变量相关联 源代码网整理以下Reset :打开一个存在的文件 源代码网整理以下Rewrite :创建并打开一个新文件(或覆盖原有文件) 源代码网整理以下Append :以添加方式打开一个文件(只适用于文本文件) 源代码网整理以下CloseFile : 关闭一个打开的文件 源代码网整理以下FileOpen :打开一个特定的文件并返回文件句柄 源代码网整理以下FileCreate :创建一个给定文件名的文件并返回文件句柄 源代码网整理以下FileClose :关闭一个特定句柄的文件 源代码网整理以下 后边三个文件主要供系统内部使用,在文件复制的编程中也往往会用到。它们操作的对象是文件句柄而不是文件变量。 软件开发网 www.mscto.com 源代码网整理以下6.1.4.2 文件定位 源代码网整理以下Seek :把文件当前位置移到指定部分 源代码网整理以下FilePos : 返回文件的当前位置 源代码网整理以下Eoln : 返回行结束标志 源代码网整理以下EOF : 返回文件结束标志 源代码网整理以下FileSeek : 改变当前文件指针的位置 源代码网整理以下 Seek与FileSeek的区别是:1. Seek仅用于记录文件;2. FileSeek的参数是文件句柄、偏移量、起始位置。其中起始位置有文件首、当前位置、文件尾三种选择。Seek的参数是文件变量、偏移量,偏移量是从文件首开始定位的。3. FileSeek的偏移量以字节数来计算,而Seek是根据记录号进行移动。 源代码网整理以下 Seek、FilePos仅用于记录文件。但任何文件都可以看作是基于字节的记录文件。下面一段程序表示了它们的用法。 源代码网整理以下{ 该例子的设计界面为一个包含TOpenDialog部件的窗体。} 源代码网整理以下uses Dialogs; 源代码网整理以下var 源代码网整理以下f: file of Byte; 源代码网整理以下size: Longint; 源代码网整理以下S: String; 软件开发网 www.mscto.com
源代码网整理以下y: Integer; 软件开发网 www.mscto.com 源代码网整理以下begin 源代码网整理以下if OpenDialog1.Execute then 源代码网整理以下begin 源代码网整理以下AssignFile(f, OpenDialog1.FileName); 源代码网整理以下Reset(f); 源代码网整理以下size := FileSize(f); 源代码网整理以下S := "File size in bytes: " IntToStr(size); 源代码网整理以下y := 10; 源代码网整理以下Canvas.TextOut(5, y, S); 源代码网整理以下y := y Canvas.TextHeight(S) 5; 源代码网整理以下S := "Seeking halfway into file..."; 源代码网整理以下Canvas.TextOut(5, y, S); 源代码网整理以下y := y Canvas.TextHeight(S) 5; 源代码网整理以下Seek(f,size div 2); 源代码网整理以下S := "Position is now " IntToStr(FilePos(f)); 源代码网整理以下Canvas.TextOut(5, y, S); 软件开发网 www.mscto.com 源代码网整理以下CloseFile(f); 源代码网整理以下end; 源代码网整理以下end. 源代码网整理以下6.1.4.3 文件删除与截断 源代码网整理以下Erase : 删除一个存在的文件 源代码网整理以下DeleteFile : 删除一个文件 源代码网整理以下Truncate :从文件当前位置将文件截断 源代码网整理以下 Erase与DeleteFile的区别是:Erase以文件变量为参数,当文件不能删除时引起一个异常;DeleteFile以文件名为参数,当文件不存在或不能删除时返回False,而并不引起一个异常。 源代码网整理以下6.1.4.4 文件名操作 源代码网整理以下Rename :文件更名,以文件变量为操作对象 源代码网整理以下RenameFile :文件更名,参数为文件的原名和新名 软件开发网 www.mscto.com 源代码网整理以下ChangeFileExt :改变文件扩展名 源代码网整理以下ExpandFileName :返回文件全路径名 软件开发网 www.mscto.com 源代码网整理以下ExtractFileExt :返回文件扩展名 源代码网整理以下ExtractFileName :从全路径名中返回文件名 源代码网整理以下ExtractFilePath :返回特定文件的路径 源代码网整理以下6.1.4.5 文件属性 软件开发网 www.mscto.com 源代码网整理以下FileGetAttr :返回文件属性 源代码网整理以下FileSetAttr :设置文件属性 源代码网整理以下6.1.4.6 文件状态 源代码网整理以下FileSize :返回文件对象大小 软件开发网 www.mscto.com 源代码网整理以下IOResult :返回上一次I/O操作的状态 源代码网整理以下FileExists :检测文件是否存在 源代码网整理以下6.1.4.7 文件日期 源代码网整理以下DateTimeToFileDate :把Delphi日期格式转换为DOS日期格式 源代码网整理以下FileDateToDateTime :把DOS日期格式转换为Delphi日期格式 源代码网整理以下FileGetDate :返回文件的DOS日期时间戳 源代码网整理以下FileSetDate :设置文件的DOS日期时间戳 源代码网整理以下6.1.4.8 文件读写 软件开发网 www.mscto.com 源代码网整理以下Read,Readln :从文本或记录文件中读取变量 源代码网整理以下Write :将指定变量写入文本或记录文件 软件开发网 www.mscto.com 源代码网整理以下Writeln :将指定变量写入文本文件并写入一个行结束标志 源代码网整理以下FileRead :从一个指定文件中读取变量 源代码网整理以下FileWrite :向指定文件写入数据 软件开发网 www.mscto.com 源代码网整理以下FileRead和FileWrite都是以文件句柄为操作对象,主要供系统内部使用。 软件开发网 www.mscto.com 源代码网整理以下6.1.4.9 目录操作 源代码网整理以下MkDir :创建当前目录的子目录 源代码网整理以下ChDir :改变当前目录 源代码网整理以下GetDir :返回特定磁盘的当前目录 源代码网整理以下RmDir :删除一个空子目录 源代码网整理以下6.1.4.10 磁盘操作 源代码网整理以下DiskFree :返回磁盘自由空间 源代码网整理以下DiskSize :返回特定磁盘的大小 源代码网整理以下6.1.4.11 文件查找 软件开发网 www.mscto.com
源代码网整理以下FileSearch :查找目录中是否存在某一特定文件 源代码网整理以下FindFirst :在目录中查找与给定文件名(可以包含匹配符)及属性集相匹配的第一个文件 软件开发网 www.mscto.com
源代码网整理以下FindNext :返回符合条件的下一个文件 源代码网整理以下FindClose :中止一个FindFirst / FindNext序列 软件开发网 www.mscto.com 源代码网整理以下 有关文件管理标准过程/函数的更详细资料,请查阅Delphi相关的Help主题。以上的大部分过程在后面都有应用实例,读者可以从中体会其用法。 源代码网整理以下 在Delphi的联机帮助Help系统中把有关文件的过程/函数分为两个主题:I/O Routine和File_Management Routine。前者大部分以文件变量为操作对象,而后者大部分以文件名或文件句柄为操作对象。这里为了方便读者的使用,我们按功能重新进行了分类。在下一节中主要应用I/O Routine主题下的过程,而在第四节的综合举例中主要应用File_Management Routine主题下的过程。 源代码网整理以下 另外,Windows提供了许多有关文件管理的API函数。虽然在一般情况下,利用Delphi提供的函数已足够解决问题,但有时候仍然需要使用Windows API。在(6.4.4.2)中我们就用到了Windows API函数GetDriveType。有关Windows API函数的情况,请读者参阅相关的资料,这里不再进行介绍。 6.2 记录文件的应用 源代码网整理以下6.2.1 任务介绍 源代码网整理以下 在这一节,我们开发一个系统安全性综合评估方法管理系统。系统安全性在复杂项目开发中十分重要,但由于牵涉面广因而很难获得客观、全面的评估值。鉴于此我们提出多角度、多侧面评估而后定量集成的思路,并在此基础上提出了多种安全性综合评估方法。每种方法由不同部门进行评估而后把结果汇总、综合。 源代码网整理以下 为此我们定义如下的记录类型: 源代码网整理以下type 源代码网整理以下TNature = (Micro,Macro); 软件开发网 www.mscto.com 源代码网整理以下{方法性质,分为微观和宏观两类} 源代码网整理以下 TMethod = Record 软件开发网 www.mscto.com 源代码网整理以下Name: string[20]; {方法名} 软件开发网 www.mscto.com 源代码网整理以下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="打开" 创建一个记录文件,若文件存在则打开 软件开发网 www.mscto.com
源代码网整理以下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记录的四个域。 源代码网整理以下为协调程序运行,我们定义了一组全局变量。各变量的类型、作用如下表。 软件开发网 www.mscto.com 源代码网整理以下 表6.2 全局变量及其作用 源代码网整理以下━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 源代码网整理以下 变量名 类型 作用 软件开发网 www.mscto.com源代码网整理以下───────────────────────────────── 源代码网整理以下MethodFile MethodFileType 与当前打开文件相关联的文件变量 软件开发网 www.mscto.com 源代码网整理以下FileName string[70] 当前打开文件的文件名 源代码网整理以下Count Count 当前打开文件的记录总数 源代码网整理以下CurrentRec Integer 当前处理记录号 源代码网整理以下FileOpened Boolean 当前是否有文件打开 软件开发网 www.mscto.com 源代码网整理以下━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 源代码网整理以下记录文件类型MethodFileType的定义为 源代码网整理以下 type 软件开发网 www.mscto.com 源代码网整理以下MethodFileType = file of TMethod; 软件开发网 www.mscto.com 源代码网整理以下 布尔变量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); 软件开发网 www.mscto.com
源代码网整理以下FileOpened := True; 源代码网整理以下except 源代码网整理以下On EInOutError do 源代码网整理以下begin 源代码网整理以下try[page] 源代码网整理以下if FileExists(FileName) = False then 源代码网整理以下begin 源代码网整理以下ReWrite(MethodFile); 源代码网整理以下FileOpened := True; 源代码网整理以下end 软件开发网 www.mscto.com
源代码网整理以下else 源代码网整理以下begin 源代码网整理以下FileOpened := False; 源代码网整理以下MessageDlg("文件不能打开",mtWarning,[mbOK],0); 源代码网整理以下end; 源代码网整理以下except 源代码网整理以下On EInOutError do 源代码网整理以下begin 源代码网整理以下FileOpened := False; 源代码网整理以下MessageDlg("文件不能创建",mtWarning,[mbOK],0); 源代码网整理以下end; 源代码网整理以下end; 软件开发网 www.mscto.com
源代码网整理以下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,并提示信息“文件不能创建”。 源代码网整理以下 有关异常处理的内容请读者参看第十二章。这段程序说明:异常处理机制不仅能使我们的程序更健壮,而且为编程提供了灵活性。 软件开发网 www.mscto.com 源代码网整理以下 当用户按下“创建”按钮时,系统首先弹出一个标准输入框,要求用户输入文件名,确认后系统首先检测文件是否存在。若存在则直接打开,否则创建一个新文件。打开或创建过程导致异常,则重置FileName和FileOpened两个全局变量。 源代码网整理以下procedure TRecFileForm.NewButtonClick(Sender: TObject); 源代码网整理以下begin 软件开发网 www.mscto.com 源代码网整理以下FileName := InputBox("输入框","请输入文件名","); 源代码网整理以下if FileName = " then Exit; 源代码网整理以下try 源代码网整理以下AssignFile(MethodFile,FileName); 源代码网整理以下if FileExists(FileName) then 源代码网整理以下begin 软件开发网 www.mscto.com
源代码网整理以下Reset(MethodFile); 源代码网整理以下Count := FileSize(MethodFile); 源代码网整理以下if Count>0 then 软件开发网 www.mscto.com 源代码网整理以下ChangeGrid; 源代码网整理以下end 源代码网整理以下else 软件开发网 www.mscto.com 源代码网整理以下begin 源代码网整理以下Rewrite(MethodFile); 软件开发网 www.mscto.com 源代码网整理以下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; 软件开发网 www.mscto.com 源代码网整理以下end; 源代码网整理以下end; 源代码网整理以下 当文件打开或创建后,所要做的工作有: 源代码网整理以下 ● 若文件非空,则计算文件长度,并用文件内容填充StringGrid1 源代码网整理以下 ● “创建”、“打开”按钮变灰,“关闭”按钮使能 源代码网整理以下 ● 把文件名附到窗口标题后 源代码网整理以下6.2.4 记录文件的读入和显示 源代码网整理以下 定义一个全局变量Count用来保存文件中的记录个数。当文件装入时: 源代码网整理以下 Count := FileSize(MethodFile); 源代码网整理以下 如果Count > 0,则首先确定StringGrid1的高度、行数。为保证StringGrid1不会覆盖窗口下面的编辑框,定义一个常量MaxShow。当Count < MaxShow时,记录可全部显示;当Count >= MaxShow时,StringGrid1自动添加一个滚动棒。为保证滚动棒不覆盖掉显示内容,StringGrid1的宽度应留有余地。 源代码网整理以下 确定StringGrid1高度、行数的代码如下: 源代码网整理以下 With StringGrid do 源代码网整理以下if count < MaxShow then 源代码网整理以下Height := DefaultRowHeight * (Count 1) 10 源代码网整理以下else 源代码网整理以下Height := DefaultRowHeight * MaxShow 10; 源代码网整理以下RowCount := Count 1; 源代码网整理以下end; 源代码网整理以下 而后从文件中逐个读入记录并显示在StringGrid1的相应位置: 源代码网整理以下 for i := 1 to Count do 源代码网整理以下begin 软件开发网 www.mscto.com 源代码网整理以下Read(MethodFile,MethodRec); 源代码网整理以下ShowMethod(MethodRec,i); 软件开发网 www.mscto.com 源代码网整理以下end; 源代码网整理以下 ShowMehtod是一个过程,用来把一条记录填入StringGrid1的一行中。对于Name、Condition域而言,只须直接赋值即可;而对Nature 域需要把枚举类型值转化为对应意义的字符串(0:“微观”,1:“宏观”);而对Result域则需要把数值转化为一定格式的字符串: 源代码网整理以下Str (MethodRec.Result:6:4,ResultStr); 源代码网整理以下 StringGrid1.Cells[3,Pos] := ResultStr; 源代码网整理以下即Result显示域宽为6,其中小数点后位数为4。 源代码网整理以下6.2.5 增加一条记录 源代码网整理以下 当用户单击“增加”按钮时屏幕将会弹出一个记录编辑模式对话框EditForm。在编辑框中填入合适的内容并按OK键关闭后,相应值写入一个TMethod类型的变量MethodRec中。其中Nature和Result 域需要进行转换。之后增加的记录添加到StringGrid1的显示中。 源代码网整理以下 最后文件定位于尾部,写入当前记录,总记录数加1。 源代码网整理以下 Seek(MethodFile,Count); 源代码网整理以下Write(MethodFile,MethodRec); 源代码网整理以下Count := Count 1; 源代码网整理以下完整的程序清单如下: 源代码网整理以下procedure TRecFileForm.AddButtonClick(Sender: TObject); 源代码网整理以下var 源代码网整理以下MethodRec: TMethod; 源代码网整理以下Rl: Real; 源代码网整理以下k: Integer; 软件开发网 www.mscto.com
源代码网整理以下EditForm: TEditForm; 源代码网整理以下begin 源代码网整理以下if FileOpenEd = False then Exit; 源代码网整理以下EditForm := TEditForm.Create(self); 源代码网整理以下if EditForm.ShowModal <> idCancel then 源代码网整理以下begin 源代码网整理以下HazAttr.text := "; 源代码网整理以下MethodRec.Name := EditForm.MethodName.text; 源代码网整理以下MethodRec.Condition := EditForm.Condition.text; 源代码网整理以下case EditForm.NatureCombo.ItemIndex of 源代码网整理以下0: 源代码网整理以下MethodRec.Nature := Micro; 源代码网整理以下1: 源代码网整理以下MethodRec.Nature := Macro ; 源代码网整理以下end; 源代码网整理以下Val(EditForm.Result.text,Rl,k); 源代码网整理以下MethodRec.Result := Rl; 源代码网整理以下with StringGrid1 do 源代码网整理以下begin 源代码网整理以下if Count < MaxShow then 源代码网整理以下Height := Height DefaultRowHeight; 源代码网整理以下RowCount := RowCount 1; 源代码网整理以下end; 源代码网整理以下ShowMethod(MethodRec,Count 1); 源代码网整理以下seek(MethodFile,Count); 源代码网整理以下write(MethodFile,MethodRec); 源代码网整理以下Count := Count 1; 源代码网整理以下end; 源代码网整理以下end; 源代码网整理以下6.2.6 修改记录 源代码网整理以下 首先获取当前记录位置: 源代码网整理以下 CurrentRec := StringGrid1.Row - 1; 软件开发网 www.mscto.com
源代码网整理以下 而后打开编辑对话框并显示当前值。修改完毕后,修改结果保存在一个记录中并在StringGrid1中重新显示。 源代码网整理以下 最后修改结果写入文件: 源代码网整理以下Seek(MethodFile,CurrentRec); 源代码网整理以下Write(MethodFile,MethodRec); 源代码网整理以下完整程序如下: 源代码网整理以下procedure TRecFileForm.ModifyButtonClick(Sender: TObject); 源代码网整理以下var 源代码网整理以下MethodRec: TMethod; 软件开发网 www.mscto.com
源代码网整理以下Rl: Real; 源代码网整理以下k: Integer; 源代码网整理以下EditForm: TEditForm; 源代码网整理以下begin 源代码网整理以下if FileOpened = False then Exit; 源代码网整理以下EditForm := TEditForm.Create(self); 源代码网整理以下CurrentRec := StringGrid1.Row-1; 源代码网整理以下with EditForm do 源代码网整理以下begin 源代码网整理以下MethodName.text := StringGrid1.Cells[0,CurrentRec 1]; 源代码网整理以下Condition.text := StringGrid1.Cells[1,CurrentRec 1]; 源代码网整理以下if StringGrid1.Cells[2,CurrentRec 1] = "微 观" then 源代码网整理以下NatureCombo.ItemIndex := 0 源代码网整理以下else 源代码网整理以下NatureCombo.ItemIndex := 1; 源代码网整理以下Result.text := StringGrid1.Cells[3,CurrentRec 1]; 源代码网整理以下if ShowModal <> idCancel then 源代码网整理以下begin 源代码网整理以下HazAttr.text := "; 源代码网整理以下MethodRec.Name := MethodName.text; 源代码网整理以下MethodRec.Condition := Condition.text; 源代码网整理以下case NatureCombo.ItemIndex of 软件开发网 www.mscto.com 源代码网整理以下0: 源代码网整理以下MethodRec.Nature := Micro; 源代码网整理以下1: 源代码网整理以下MethodRec.Nature := Macro ; 源代码网整理以下end; 源代码网整理以下Val(Result.text,Rl,k); 源代码网整理以下MethodRec.Result := Rl; 源代码网整理以下ShowMethod(MethodRec,CurrentRec 1); 软件开发网 www.mscto.com 源代码网整理以下seek(MethodFile,CurrentRec); 源代码网整理以下write(MethodFile,MethodRec); 源代码网整理以下end; 源代码网整理以下end; 源代码网整理以下end; 源代码网推荐 源代码网供稿. |
