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); 为避免误删除,在进行删除操作前弹出一个消息框进行确认。删除后要更新全局变量的值和显示内容: Count := Count - 1; ChangeGrid; 完整的程序如下: procedure TRecFileForm.DeleteButtonClick(Sender: TObject); var NewFile: MethodFileType; MethodRec: TMethod; NewFileName: String; i: Integer; begin if FileOpened = False then Exit; CurrentRec := StringGrid1.Row-1; if CurrentRec < 0 then Exit; if MessageDlg('Delete Current Record ?', mtConfirmation, [mbYes, mbNo], 0) = idYes then begin HazAttr.text := ''; 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); Count := Count-1; ChangeGrid; end; end; 这里所显示的删除操作简单明了。但在程序开始设计时我却走了一条弯路,后来发现虽然这种方法用于记录的删除操作显得笨拙、可笑,但却恰恰是记录插入、排序的思想。 这种思想的核心是创建一个新文件保存更新后的内容。若新文件顺利创建,则删除原文件,否则恢复原来的文件。程序清单如下: procedure TRecFileForm.DeleteButtonClick(Sender: TObject); var NewFile: MethodFileType; MethodRec: TMethod; NewFileName: String; i: Integer; begin if FileOpened = False then Exit; CurrentRec := StringGrid1.Row-1; if CurrentRec < 0 then Exit; if MessageDlg('Delete Current Record ?', mtConfirmation, [mbYes, mbNo], 0) = 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 := 1 to Count do if I <> CurrentRec+1 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-1; ChangeGrid; end; end; 对于记录插入,方法基本同上。对于排序,可先将关键域读入排序,而后再按排序结果对应的记录号顺序重写文件。 <  
1/2 1 2 下一页 尾页 |