6.2 記錄文件的應(yīng)用
6.2.1 任務(wù)介紹
在這一節(jié),我們開發(fā)一個(gè)系統(tǒng)安全性綜合評(píng)估方法管理系統(tǒng)。系統(tǒng)安全性在復(fù)雜項(xiàng)目開發(fā)中十分重要,但由于牽涉面廣因而很難獲得客觀、全面的評(píng)估值。鑒于此我們提出多角度、多側(cè)面評(píng)估而后定量集成的思路,并在此基礎(chǔ)上提出了多種安全性綜合評(píng)估方法。每種方法由不同部門進(jìn)行評(píng)估而后把結(jié)果匯總、綜合。
為此我們定義如下的記錄類型:
type
TNature = (Micro,Macro);
{方法性質(zhì),分為微觀和宏觀兩類}
TMethod = Record
Name: string[20]; {方法名}
Condition: string[40]; {方法適用條件}
Nature: TNature; {方法性質(zhì)}
Result: Real; {方法評(píng)估值}
end;
用來記錄不同方法的信息。
由于不同方法的條件、性質(zhì)不同,因而對(duì)工程開發(fā)的不同階段適用方法集也不同。因此需要根據(jù)實(shí)際情況對(duì)方法集進(jìn)行管理。我們把每一方法作為一條記錄,每一方法集作為一個(gè)記錄文件。下面討論系統(tǒng)的實(shí)現(xiàn)方法。
6.2.2 設(shè)計(jì)基本思路
本系統(tǒng)要實(shí)現(xiàn)的基本功能是文件的打開、創(chuàng)建、關(guān)閉、顯示,記錄的增加、修改、刪除以及結(jié)果的綜合和顯示。為此我們使用了兩組按鈕分別用于文件和記錄的操作, 使用一個(gè)StringGrid控件來顯示文件內(nèi)容,使用一個(gè)只讀編輯框顯示結(jié)果的綜合。
其中各部件的名稱、功能如下表所示:
表6.1 主窗口部件的設(shè)計(jì)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件名稱 主要屬性 備注
──────────────────────────────────────
RecFileForm BorderStyle=bsDialog 文件打開后把文件名附到窗口標(biāo)題后
Position=poScreenCenter
StringGrid1 大小行數(shù)動(dòng)態(tài)確定
HazAttr(編輯框) ReadOnly=True 顯示綜合結(jié)果
OpenButton TabOrder=0 打開一個(gè)記錄文件,若文件不存在則創(chuàng)建
NewButton Caption='打開' 創(chuàng)建一個(gè)記錄文件,若文件存在則打開
CloseButton Caption='關(guān)閉' 關(guān)閉一個(gè)已打開的文件
AddButton Caption='增加' 增加一條記錄
ModifyButton Caption='修改' 修改一條記錄
DeleteButton Caption='刪除' 刪除一條記錄
CalcuButton Caption='計(jì)算' 計(jì)算最終結(jié)果并顯示
ExitButton Caption='退出' 系統(tǒng)終止。若當(dāng)前有打開的文件則先關(guān)閉
OpenDialog1 Filter= 選擇或輸入欲打開的文件
'Record File(*.Rec)|.Rec
|Any File(*.*)|*.*'
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
另外,StringGrid1、HazAttr的標(biāo)題用兩個(gè)標(biāo)簽框(Label)來顯示。
另外我們還需要一個(gè)編輯對(duì)話框。其中四個(gè)編輯框Name、Condition、Nature、 Result分別對(duì)應(yīng)TMethod記錄的四個(gè)域。
為協(xié)調(diào)程序運(yùn)行,我們定義了一組全局變量。各變量的類型、作用如下表。
表6.2 全局變量及其作用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
變量名 類型 作用
─────────────────────────────────
MethodFile MethodFileType 與當(dāng)前打開文件相關(guān)聯(lián)的文件變量
FileName string[70] 當(dāng)前打開文件的文件名
Count Count 當(dāng)前打開文件的記錄總數(shù)
CurrentRec Integer 當(dāng)前處理記錄號(hào)
FileOpened Boolean 當(dāng)前是否有文件打開
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
記錄文件類型MethodFileType的定義為
type
MethodFileType = file of TMethod;
布爾變量FileOpened用于控制文件按鈕的使能、變灰,記錄按鈕的反應(yīng)以及系統(tǒng)結(jié)束時(shí)是否需要首先關(guān)閉文件。
6.2.3 記錄文件的打開和創(chuàng)建
記錄文件的打開和創(chuàng)建同文本文件一樣也需要關(guān)聯(lián)和初始化兩個(gè)步驟。同文本文件唯一的不同是不能使用Append過程。
記錄文件缺省情況下以讀寫方式打開,如果想以只讀或只寫方式打開,則需要修改System單元中定義的變量FileMode的值。
FileMode的取值和意義如下表。
表6.3 FileMode的取值和意義
━━━━━━━━━━━━━━
取值 意義
──────────────
0 只讀
1 只寫
2 讀寫
━━━━━━━━━━━━━━
FileMode是一個(gè)全局變量,對(duì)它的每次修改都將影響所有Reset的操作,因此在打開自己的文件后應(yīng)還原它的值。
在本系統(tǒng)中,當(dāng)用戶按下“打開”按鈕時(shí),首先彈出一個(gè)標(biāo)準(zhǔn)文件打開對(duì)話框,要求用戶輸入或選擇文件名。確認(rèn)后如果該文件名的文件存在,則用Reset打開,若不存在則創(chuàng)建。程序清單如下。
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('文件不能創(chuàng)建',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;
首先系統(tǒng)試圖用Reset打開一個(gè)文件,并置FileOpened為True。如果文件不能打開,則引發(fā)一個(gè)I/O異常。在異常處理過程中,首先檢測(cè)文件是否存在。若不存在則創(chuàng)建這個(gè)文件。否則是其它原因引發(fā)的異常,則把FileOpend重置為False, 并顯示信息“文件不能打開”。在文件創(chuàng)建過程中仍可能引發(fā)異常,因而在一個(gè)嵌套的異常處理中把FileOpened重置為False,并提示信息“文件不能創(chuàng)建”。
有關(guān)異常處理的內(nèi)容請(qǐng)讀者參看第十二章。這段程序說明:異常處理機(jī)制不僅能使我們的程序更健壯,而且為編程提供了靈活性。
當(dāng)用戶按下“創(chuàng)建”按鈕時(shí),系統(tǒng)首先彈出一個(gè)標(biāo)準(zhǔn)輸入框,要求用戶輸入文件名,確認(rèn)后系統(tǒng)首先檢測(cè)文件是否存在。若存在則直接打開,否則創(chuàng)建一個(gè)新文件。打開或創(chuàng)建過程導(dǎo)致異常,則重置FileName和FileOpened兩個(gè)全局變量。
procedure TRecFileForm.NewButtonClick(Sender: TObject);
begin
FileName := InputBox('輸入框','請(qǐng)輸入文件名','');
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;
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |