在系統安全性綜合評估管理系統中,不同評估方法的結果需按特定公式進行綜合計算。當用戶點擊「計算」按鈕時,系統自動執行運算並將綜合結果顯示於 HazAttr 唯讀編輯框中。為確保顯示數據的準確性,每當執行增加、修改或刪除記錄操作並確認後,HazAttr 編輯框會自動清空,避免殘留舊數據誤導用戶。
當用戶點擊「增加」或「修改」按鈕時,系統彈出編輯對話框,包含三個編輯框與一個組合列表框,分別對應 TMethod 記錄的四個字段。由於 Result 域必須為 [0,1] 區間的小數,因此在用戶按下 OK 鍵關閉對話框時,必須進行類型與範圍驗證。
在 VB 開發中,需逐個判斷用戶輸入的鍵碼,這種方法不僅繁瑣,且難以完美支持編輯鍵(如退格鍵、刪除鍵等),用戶體驗較差。
Object Pascal 提供了更高效的 Val 函數進行字符串到數值的轉換與驗證:
procedure Val(Str: String; var V; var Code: Integer);
驗證邏輯:先用 Val 轉換,若超出 [0,1] 範圍則顯式將 Code 設為 -1,最後統一檢測 Code <> 0 判定輸入非法。
將驗證邏輯置於對話框的 OnCloseQuery 事件中,非法輸入時阻止關閉、清空輸入框並聚焦至 Result 編輯框。但若用戶按下 Cancel,則跳過驗證。引入布爾變量 IsCancel 標識取消操作:對話框創建時為 False,按下 Cancel 時置為 True。
procedure TEditForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
Res: Real;
k: Integer;
begin
if IsCancel = False then
begin
val(Result.Text, Res, k);
if (Res > 1) or (Res < 0) then k := -1;
if k <> 0 then
begin
MessageDlg('非法輸入!', mtWarning, [mbOK], 0);
Result.Text := '';
CanClose := False;
Result.SetFocus;
end;
end;
end;
調用 CloseFile(MethodFile) 關閉文件,並重置系統狀態:將 FileOpened := False、清空網格、啟用「打開」與「新建」按鈕、禁用「關閉」按鈕、恢復窗口標題。
procedure TRecFileForm.CloseButtonClick(Sender: TObject);
begin
if FileOpened then
begin
CloseFile(MethodFile);
FileOpened := False;
ClearGrid;
OpenButton.Enabled := True;
NewButton.Enabled := True;
CloseButton.Enabled := False;
RecFileForm.Caption := FormCaption;
end;
end;
在主窗口的 OnCloseQuery 事件中檢測是否有打開的文件,若有則先關閉文件再允許系統退出。
procedure TRecFileForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if FileOpened then
CloseFile(MethodFile);
end;
本節示例雖簡單,但涵蓋了記錄文件操作的核心方面:靈活運用 Delphi 文件管理函數、異常捕獲保障健壯性。雖然數據庫技術發展降低了記錄文件的重要性,但對簡單問題仍具實用價值。示例為單文檔界面(SDI),讀者可輕松擴展為多文檔界面(MDI)。
Delphi 文件管理的一大特色是提供專用文件操作控件,僅需少量代碼即可開發功能強大的文件名瀏覽系統,這種「代碼極少、功能極強」的反差正是 Delphi 生命力的體現。
Delphi 提供四大專用文件控件(位於 Component Palette 的 System 頁):
| 控件名 | 功能 |
|---|---|
| DriveComboBox | 驅動器組合列表框,用於選擇當前驅動器 |
| FileListBox | 文件列表框,顯示當前目錄文件並選中文件 |
| FilterComboBox | 文件類型組合列表框,篩選顯示文件類型 |
| DirectoryOutline | 目錄樹(Samples 頁),層級顯示目錄結構 |
加上文件編輯框(FileEdit)、目錄標籤框(DirLabel),可構建完整文件操作系統。它們之間的聯繫幾乎無需代碼,僅需在設計時或運行時設置屬性:
DriveComboList.DirList := DirectoryListBox;
DirectoryListBox.DirLabel := DirLabel;
DirectoryListBox.FileList := FileListBox;
FileFilterComboList.FileList := FileListBox;
FileListBox.FileEdit := FileEdit;
FileFilterComboList.Filter:設置組合列表框的選擇項FileListBox.Mask:設置顯示文件類型,允許脫離 FileFilterComboList 獨立工作文件控件的方法、事件多繼承自 ListBox 和 ComboBox,但 FileListBox 的 ApplyFilePath 方法極具實用價值,後文將演示用法。