DELPHI基础教程:文件管理(二)[1]

 我来答
清宁时光17
2022-10-19 · TA获得超过1.4万个赞
知道大有可为答主
回答量:7047
采纳率:100%
帮助的人:40.5万
展开全部

   记录的删除 插入 排序

  删除一条记录的基本思路是 获取当前记录的位置并把该位置后的记录逐个向前移动 文件在最后一条记录前截断

  for i:=CurrentRec+ to Count do

  begin

  seek(MethodFile i)

  read(MethodFile MethodRec)

  seek(MethodFile i )

  Write(MethodFile MethodRec)

  end;

  Truncate(MethodFile)

  为避免误删除 在进行删除操作前弹出一个消息框进行确认 删除后要更新全局变量的值和显示内容

  Count := Count ;

  ChangeGrid;

  完整的程序如下

  procedure TRecFileForm DeleteButtonClick(Sender: TObject)

  var

  NewFile: MethodFileType;

  MethodRec: TMethod;

  NewFileName: String;

  i: Integer;

  begin

  if FileOpened = False then Exit;

  CurrentRec := StringGrid Row ;

  if CurrentRec < then Exit;

  if MessageDlg( Delete Current Record ? mtConfirmation

  [mbYes mbNo] ) = idYes then

  begin

  HazAttr text := ;

  for I := CurrentRec+ to Count do

  begin

  seek(MethodFile i)

  read(MethodFile MethodRec)

  seek(MethodFile i )

  Write(MethodFile MethodRec)

  end;

  Truncate(MethodFile)

  Count := Count ;

  ChangeGrid;

  end;

  end;

  这里所显示的删除操作简单明了 但在程序开始设计时我却走了一条弯路 后来发现虽然这种方法用于记录的删除操作显得笨拙 可笑 但却恰恰是记录插入 排序的思想

  这种思想的核心是创建一个新文件保存更新后的内容 若新文件顺利创建 则删除原文件 否则恢复原来的文件 程序清单如下

  procedure TRecFileForm DeleteButtonClick(Sender: TObject)

  var

  NewFile: MethodFileType;

  MethodRec: TMethod;

  NewFileName: String;

  i: Integer;

  begin

  if FileOpened = False then Exit;

  CurrentRec := StringGrid Row ;

  if CurrentRec < then Exit;

  if MessageDlg( Delete Current Record ? mtConfirmation

  [mbYes mbNo] ) = idYes then

  begin

  HazAttr text := ;

  NewFileName := ChangeFileExt(FileName sav )

  try

  AssignFile(NewFile FileName)

  ReWrite(NewFile)

  Except

  On EInOutError do

  begin

  Rename(MethodFile FileName)

  Exit;

  end;

  end;

  for i := to Count do

  if I <> CurrentRec+ then

  begin

  MethodRec := GridToRec(i)

  Write(NewFile MethodRec)

  end;

  closeFile(MethodFile)

  try

  AssignFile(MethodFile Filename)

  Reset(MethodFile)

  except

  on EInOutError do

  begin

  DeleteFile(FileName)

  AssignFile(MethodFile NewFileName)

  Reset(MethodFile)

  Rename(MethodFile FileName)

  Exit;

  end;

  DeleteFile(NewFileName)

  Count:=Count ;

  ChangeGrid;

  end;

  end;

  对于记录插入 方法基本同上 对于排序 可先将关键域读入排序 而后再按排序结果对应的记录号顺序重写文件

   结果综合

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

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

   编辑对话框的输入检查

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

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

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

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

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

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

lishixinzhi/Article/program/Delphi/201311/25236

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式