熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

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

2013-11-23 17:51:53  來源: Delphi編程 

   記錄的刪除插入排序

  刪除一條記錄的基本思路是獲取當前記錄的位置並把該位置後的記錄逐個向前移動 文件在最後一條記錄前截斷

  for i:=CurrentRec+ to Count do

  begin

  seek(MethodFilei)

  read(MethodFileMethodRec)

  seek(MethodFilei

  Write(MethodFileMethodRec)

  end;

  Truncate(MethodFile)

  為避免誤刪除在進行刪除操作前彈出一個消息框進行確認刪除後要更新全局變量的值和顯示內容

  Count := Count ;

  ChangeGrid;

  完整的程序如下

  procedure TRecFileFormDeleteButtonClick(Sender: TObject)

  var

  NewFile: MethodFileType;

  MethodRec: TMethod;

  NewFileName: String;

  i: Integer;

  begin

  if FileOpened = False then Exit;

  CurrentRec := StringGridRow;

  if CurrentRec < then Exit;

  if MessageDlg(Delete Current Record ? mtConfirmation

  [mbYes mbNo] ) = idYes then

  begin

  HazAttrtext := ;

  for I := CurrentRec+ to Count do

  begin

  seek(MethodFilei)

  read(MethodFileMethodRec)

  seek(MethodFilei

  Write(MethodFileMethodRec)

  end;

  Truncate(MethodFile)

  Count := Count;

  ChangeGrid;

  end;

  end;

  這裡所顯示的刪除操作簡單明了但在程序開始設計時我卻走了一條彎路後來發現雖然這種方法用於記錄的刪除操作顯得笨拙可笑但卻恰恰是記錄插入排序的思想

  這種思想的核心是創建一個新文件保存更新後的內容若新文件順利創建則刪除原文件否則恢復原來的文件程序清單如下

  procedure TRecFileFormDeleteButtonClick(Sender: TObject)

  var

  NewFile: MethodFileType;

  MethodRec: TMethod;

  NewFileName: String;

  i: Integer;

  begin

  if FileOpened = False then Exit;

  CurrentRec := StringGridRow;

  if CurrentRec < then Exit;

  if MessageDlg(Delete Current Record ? mtConfirmation

  [mbYes mbNo] ) = idYes then

  begin

  HazAttrtext := ;

  NewFileName := ChangeFileExt(FileNamesav

  try

  AssignFile(NewFileFileName)

  ReWrite(NewFile)

  Except

  On EInOutError do

  begin

  Rename(MethodFileFileName)

  Exit;

  end;

  end;

  for i := to Count do

  if I <> CurrentRec+ then

  begin

  MethodRec := GridToRec(i)

  Write(NewFileMethodRec)

  end;

  closeFile(MethodFile)

  try

  AssignFile(MethodFileFilename)

  Reset(MethodFile)

  except

  on EInOutError do

  begin

  DeleteFile(FileName)

  AssignFile(MethodFileNewFileName)

  Reset(MethodFile)

  Rename(MethodFileFileName)

  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事件不進行輸入檢查

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25236.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.