6.2 記錄文件的應用
6.2.1 任務介紹
在這一節,我們開發一個系統安全性綜合評估方法管理系統。系統安全性在復雜項目開發中十分重要,但由於牽涉面廣因而很難獲得客觀、全面的評估值。鑒於此我們提出多角度、多側面評估而後定量集成的思路,並在此基礎上提出了多種安全性綜合評估方法。每種方法由不同部門進行評估而後把結果匯總、綜合。
為此我們定義如下的記錄類型:
type
TNature = (Micro,Macro);
{方法性質,分為微觀和宏觀兩類}
TMethod = Record
Name: string[20]; {方法名}
Condition: string[40]; {方法適用條件}
Nature: TNature; {方法性質}
Result: Real; {方法評估值}
end;
用來記錄不同方法的信息。
由於不同方法的條件、性質不同,因而對工程開發的不同階段適用方法集也不同。因此需要根據實際情況對方法集進行管理。我們把每一方法作為一條記錄,每一方法集作為一個記錄文件。下面討論系統的實現方法。
6.2.2 設計基本思路
本系統要實現的基本功能是文件的打開、創建、關閉、顯示,記錄的增加、修改、刪除以及結果的綜合和顯示。為此我們使用了兩組按鈕分別用於文件和記錄的操作, 使用一個StringGrid控件來顯示文件內容,使用一個只讀編輯框顯示結果的綜合。
其中各部件的名稱、功能如下表所示:
表6.1 主窗口部件的設計
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件名稱 主要屬性 備注
──────────────────────────────────────
RecFileForm BorderStyle=bsDialog 文件打開後把文件名附到窗口標題後
Position=poScreenCenter
StringGrid1 大小行數動態確定
HazAttr(編輯框) ReadOnly=True 顯示綜合結果
OpenButton TabOrder=0 打開一個記錄文件,若文件不存在則創建
NewButton Caption='打開' 創建一個記錄文件,若文件存在則打開
CloseButton Caption='關閉' 關閉一個已打開的文件
AddButton Caption='增加' 增加一條記錄
ModifyButton Caption='修改' 修改一條記錄
DeleteButton Caption='刪除' 刪除一條記錄
CalcuButton Caption='計算' 計算最終結果並顯示
ExitButton Caption='退出' 系統終止。若當前有打開的文件則先關閉
OpenDialog1 Filter= 選擇或輸入欲打開的文件
'Record File(*.Rec)|.Rec
|Any File(*.*)|*.*'
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
另外,StringGrid1、HazAttr的標題用兩個標簽框(Label)來顯示。
另外我們還需要一個編輯對話框。其中四個編輯框Name、Condition、Nature、 Result分別對應TMethod記錄的四個域。
為協調程序運行,我們定義了一組全局變量。各變量的類型、作用如下表。
表6.2 全局變量及其作用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
變量名 類型 作用
─────────────────────────────────
MethodFile MethodFileType 與當前打開文件相關聯的文件變量
FileName string[70] 當前打開文件的文件名
Count Count 當前打開文件的記錄總數
CurrentRec Integer 當前處理記錄號
FileOpened Boolean 當前是否有文件打開
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
記錄文件類型MethodFileType的定義為
type
MethodFileType = file of TMethod;
布爾變量FileOpened用於控制文件按鈕的使能、變灰,記錄按鈕的反應以及系統結束時是否需要首先關閉文件。
6.2.3 記錄文件的打開和創建
記錄文件的打開和創建同文本文件一樣也需要關聯和初始化兩個步驟。同文本文件唯一的不同是不能使用Append過程。
記錄文件缺省情況下以讀寫方式打開,如果想以只讀或只寫方式打開,則需要修改System單元中定義的變量FileMode的值。
FileMode的取值和意義如下表。
表6.3 FileMode的取值和意義
━━━━━━━━━━━━━━
取值 意義
──────────────
0 只讀
1 只寫
2 讀寫
━━━━━━━━━━━━━━
FileMode是一個全局變量,對它的每次修改都將影響所有Reset的操作,因此在打開自己的文件後應還原它的值。
在本系統中,當用戶按下“打開”按鈕時,首先彈出一個標准文件打開對話框,要求用戶輸入或選擇文件名。確認後如果該文件名的文件存在,則用Reset打開,若不存在則創建。程序清單如下。
procedure TRecFileForm.OpenButtonClick(Sender: TObject);
begin
if OpenDialog1.Execute then
FileName := OpenDialog1.FileName
else
exit;
AssignFile(MethodFile,Filename);
try
Reset(MethodFile);
FileOpened := True;
except
On EInOutError do
begin
try
if FileExists(FileName) = False then
begin
ReWrite(MethodFile);
FileOpened := True;
end
else
begin
FileOpened := False;
MessageDlg('文件不能打開',mtWarning,[mbOK],0);
end;
except
On EInOutError do
begin
FileOpened := False;
MessageDlg('文件不能創建',mtWarning,[mbOK],0);
end;
end;
end;
end;
if FileOpened = False then exit;
Count := FileSize(MethodFile);
if Count>0 then
ChangeGrid;
RecFileForm.Caption := FormCaption+' -- '+FileName;
NewButton.Enabled := False;
OpenButton.Enabled := False;
CloseButton.Enabled := True;
end;
首先系統試圖用Reset打開一個文件,並置FileOpened為True。如果文件不能打開,則引發一個I/O異常。在異常處理過程中,首先檢測文件是否存在。若不存在則創建這個文件。否則是其它原因引發的異常,則把FileOpend重置為False, 並顯示信息“文件不能打開”。在文件創建過程中仍可能引發異常,因而在一個嵌套的異常處理中把FileOpened重置為False,並提示信息“文件不能創建”。
有關異常處理的內容請讀者參看第十二章。這段程序說明:異常處理機制不僅能使我們的程序更健壯,而且為編程提供了靈活性。
當用戶按下“創建”按鈕時,系統首先彈出一個標准輸入框,要求用戶輸入文件名,確認後系統首先檢測文件是否存在。若存在則直接打開,否則創建一個新文件。打開或創建過程導致異常,則重置FileName和FileOpened兩個全局變量。
procedure TRecFileForm.NewButtonClick(Sender: TObject);
begin
FileName := InputBox('輸入框','請輸入文件名','');
if FileName = '' then Exit;
try
AssignFile(MethodFile,FileName);
if FileExists(FileName) then
begin
Reset(MethodFile);
Count := FileSize(MethodFile);
if Count>0 then
ChangeGrid;
end
else
begin
Rewrite(MethodFile);
count := 0;
end;
FileOpened := true;
Except
on EInOutError do
begin
FileName := '';
FileOpened := False;
end;
end;
if FileOpened then
begin
NewButton.Enabled := False;
OpenButton.Enabled := False;
CloseButton.Enabled := True;
RecFileForm.Caption := FormCaption+' -- '+FileName;
end;
end;
當文件打開或創建後,所要做的工作有:
● 若文件非空,則計算文件長度,並用文件內容填充StringGrid1
● “創建”、“打開”按鈕變灰,“關閉”按鈕使能
● 把文件名附到窗口標題後