首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 記錄文件進階操作:刪除、插入、排序與替代實現方案

     編輯:Delphi

6.2.7 記錄的刪除、插入與排序

標準刪除算法:原地移動法

刪除記錄的基本思路:獲取當前記錄位置,將後續記錄逐個向前移動,最後在文件倒數第二條記錄處截斷(Truncate)。為防誤刪,操作前彈出確認對話框;刪除後更新全局變量 Count 並刷新顯示(ChangeGrid)。

procedure TRecFileForm.DeleteButtonClick(Sender: TObject);
var
  MethodRec: TMethod;
  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;
    end;
    DeleteFile(NewFileName);
    Count := Count - 1;
    ChangeGrid;
  end;
end;

插入與排序的通用思路

  • 插入記錄:同樣採用新文件重建法,在目標位置寫入新記錄,其餘記錄順序寫入。
  • 排序記錄:先將關鍵字段讀入內存排序,再按排序後的記錄號順序重寫文件。

這種「新文件替換舊文件」模式雖增加 I/O 開銷,但邏輯清晰、易於擴展,特別適合插入、排序等涉及大量記錄位移的操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved