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

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

Read(MethodFile,MethodRec);

ShowMethod(MethodRec,i);

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;

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; 

而后打开编辑对话框并显示当前值。修改完毕后,修改结果保存在一个记录中并在StringGrid1中重新显示。

最后修改结果写入文件: 

Seek(MethodFile,CurrentRec);

Write(MethodFile,MethodRec); 

完整程序如下: 

procedure TRecFileForm.ModifyButtonClick(Sender: TObject);

var

MethodRec: TMethod;

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

0:

MethodRec.Nature := Micro;

1:

MethodRec.Nature := Macro ;

end;

Val(Result.text,Rl,k);

MethodRec.Result := Rl;

ShowMethod(MethodRec,CurrentRec+1);

seek(MethodFile,CurrentRec);

write(MethodFile,MethodRec);

end;

end;

end;  

时间: 2024-10-14 06:05:33

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

第六章-文件管理(三)(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

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

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