第六章-文件管理(二)(1)2007-05-076.2.7 记录的删除、插入、排序 删除一条记录的基本思路是:获取当前记录的位置并把该位置后的记录逐个向前移动。 文件在最后一条记录前截断。 for i:=CurrentRec+1 to Count-1 dobeginseek(MethodFile,i);read(MethodFile,MethodRec);seek(MethodFile,i-1);Write(MethodFile,MethodRec);end;Truncate(MethodFile); 为避免误删除,在进行删除操作前弹出一个消息框进行确认。删除后要更新全局变量的值和显示内容: Count := Count - 1;ChangeGrid; 完整的程序如下: procedure TRecFileForm.DeleteButtonClick(Sender: TObject);varNewFile: MethodFileType;MethodRec: TMethod;NewFileName: String;i: Integer;beginif FileOpened = False then Exit;CurrentRec := StringGrid1.Row-1;if CurrentRec < 0 then Exit;if MessageDlg("Delete Current Record ?", mtConfirmation,[mbYes, mbNo], 0) = idYes thenbeginHazAttr.text := "";for I := CurrentRec+1 to Count-1 dobeginseek(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);varNewFile: MethodFileType;MethodRec: TMethod;NewFileName: String;i: Integer;beginif FileOpened = False then Exit;CurrentRec := StringGrid1.Row-1;if CurrentRec < 0 then Exit;if MessageDlg("Delete Current Record ?", mtConfirmation,[mbYes, mbNo], 0) = idYes thenbeginHazAttr.text := "";NewFileName := ChangeFileExt(FileName,".sav");tryAssignFile(NewFile,FileName);ReWrite(NewFile);ExceptOn EInOutError dobeginRename(MethodFile,FileName);Exit;end;end;for i := 1 to Count doif I <> CurrentRec+1 thenbeginMethodRec := GridToRec(i);Write(NewFile,MethodRec);end;closeFile(MethodFile);tryAssignFile(MethodFile,Filename);Reset(MethodFile);excepton EInOutError dobeginDeleteFile(FileName);AssignFile(MethodFile,NewFileName);Reset(MethodFile);Rename(MethodFile,FileName);Exit;end;DeleteFile(NewFileName);Count:=Count-1;ChangeGrid;end;end;对于记录插入,方法基本同上。对于排序,可先将关键域读入排序,而后再按排序结果对应的记录号顺序重写文件。