?? 016.htm
字號:
<p>NewButton.Enabled := False;</p>
<p>OpenButton.Enabled := False;</p>
<p>CloseButton.Enabled := True;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 首先系統試圖用</font>Reset<font
face="宋體" lang="ZH-CN">打開一個文件,并置</font>FileOpened<font face="宋體"
lang="ZH-CN">為</font>True<font face="宋體" lang="ZH-CN">。如果文件不能打開,則引發一個</font>I/O<font
face="宋體" lang="ZH-CN">異常。在異常處理過程中,首先檢測文件是否存在。若不存在則創建這個文件。否則是其它原因引發的異常,則把</font>FileOpend<font
face="宋體" lang="ZH-CN">重置為</font>False<font face="宋體" lang="ZH-CN">,</font>
<font face="宋體" lang="ZH-CN">并顯示信息“文件不能打開”。在文件創建過程中仍可能引發異常,因而在一個嵌套的異常處理中把</font>FileOpened<font
face="宋體" lang="ZH-CN">重置為</font>False<font face="宋體" lang="ZH-CN">,并提示信息“文件不能創建”。</p>
<p> 有關異常處理的內容請讀者參看第十二章。這段程序說明:異常處理機制不僅能使我們的程序更健壯,而且為編程提供了靈活性。</p>
<p> 當用戶按下“創建”按鈕時,系統首先彈出一個標準輸入框,要求用戶輸入文件名,確認后系統首先檢測文件是否存在。若存在則直接打開,否則創建一個新文件。打開或創建過程導致異常,則重置</font>FileName<font
face="宋體" lang="ZH-CN">和</font>FileOpened<font face="宋體" lang="ZH-CN">兩個全局變量。 </p>
</font><p>procedure TRecFileForm.NewButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>FileName := InputBox('<font face="宋體" lang="ZH-CN">輸入框</font>','<font
face="宋體" lang="ZH-CN">請輸入文件名</font>','');</p>
<p>if FileName = '' then Exit;</p>
<p>try</p>
<p>AssignFile(MethodFile,FileName);</p>
<p>if FileExists(FileName) then</p>
<p>begin</p>
<p>Reset(MethodFile);</p>
<p>Count := FileSize(MethodFile);</p>
<p>if Count>0 then</p>
<p>ChangeGrid;</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>Rewrite(MethodFile);</p>
<p>count := 0;</p>
<p>end;</p>
<p>FileOpened := true;</p>
<p>Except</p>
<p>on EInOutError do</p>
<p>begin</p>
<p>FileName := '';</p>
<p>FileOpened := False;</p>
<p>end;</p>
<p>end;</p>
<p>if FileOpened then</p>
<p>begin</p>
<p>NewButton.Enabled := False;</p>
<p>OpenButton.Enabled := False;</p>
<p>CloseButton.Enabled := True;</p>
<p>RecFileForm.Caption := FormCaption+' -- '+FileName;</p>
<p>end;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 當文件打開或創建后,所要做的工作有:</p>
<p> ●</font> <font face="宋體" lang="ZH-CN">若文件非空,則計算文件長度,并用文件內容填充</font>StringGrid1</p>
<font face="宋體" lang="ZH-CN"><p> ●</font> <font face="宋體" lang="ZH-CN">“創建”、“打開”按鈕變灰,“關閉”按鈕使能</p>
<p> ●</font> <font face="宋體" lang="ZH-CN">把文件名附到窗口標題后</p>
</font><p>6.2.4 <font face="宋體" lang="ZH-CN">記錄文件的讀入和顯示 </p>
<p> 定義一個全局變量</font>Count<font face="宋體" lang="ZH-CN">用來保存文件中的記錄個數。當文件裝入時: </p>
<p> </font>Count := FileSize(MethodFile)<font face="宋體" lang="ZH-CN">; </p>
<p> 如果</font>Count > 0<font face="宋體" lang="ZH-CN">,則首先確定</font>StringGrid1<font
face="宋體" lang="ZH-CN">的高度、行數。為保證</font>StringGrid1<font
face="宋體" lang="ZH-CN">不會覆蓋窗口下面的編輯框,定義一個常量</font>MaxShow<font
face="宋體" lang="ZH-CN">。當</font>Count < MaxShow<font face="宋體" lang="ZH-CN">時,記錄可全部顯示;當</font>Count
>= MaxShow<font face="宋體" lang="ZH-CN">時,</font>StringGrid1<font face="宋體"
lang="ZH-CN">自動添加一個滾動棒。為保證滾動棒不覆蓋掉顯示內容,</font>StringGrid1<font
face="宋體" lang="ZH-CN">的寬度應留有余地。</p>
<p> 確定</font>StringGrid1<font face="宋體" lang="ZH-CN">高度、行數的代碼如下: </p>
<p> </font>With StringGrid do</p>
<p>if count < MaxShow then</p>
<p>Height := DefaultRowHeight * (Count+1)+10</p>
<p>else</p>
<p>Height := DefaultRowHeight * MaxShow+10;</p>
<p>RowCount := Count+1;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">
而后從文件中逐個讀入記錄并顯示在</font>StringGrid1<font
face="宋體" lang="ZH-CN">的相應位置: </p>
<p> </font>for i := 1 to Count do </p>
<p>begin</p>
<p>Read(MethodFile,MethodRec);</p>
<p>ShowMethod(MethodRec,i);</p>
<p>end; </p>
<p> ShowMehtod<font face="宋體"
lang="ZH-CN">是一個過程,用來把一條記錄填入</font>StringGrid1<font
face="宋體" lang="ZH-CN">的一行中。對于</font>Name<font face="宋體"
lang="ZH-CN">、</font>Condition<font face="宋體" lang="ZH-CN">域而言,只須直接賦值即可;而對</font>Nature
<font face="宋體" lang="ZH-CN">域需要把枚舉類型值轉化為對應意義的字符串</font>(0<font
face="宋體" lang="ZH-CN">:“微觀”,</font>1<font face="宋體" lang="ZH-CN">:“宏觀”</font>)<font
face="宋體" lang="ZH-CN">;而對</font>Result<font face="宋體" lang="ZH-CN">域則需要把數值轉化為一定格式的字符串: </p>
</font><p>Str (MethodRec.Result:6:4,ResultStr)<font face="宋體" lang="ZH-CN">;</p>
<p> </font>StringGrid1.Cells[3,Pos] := ResultStr; </p>
<p><font face="宋體" lang="ZH-CN">即</font>Result<font face="宋體" lang="ZH-CN">顯示域寬為</font>6<font
face="宋體" lang="ZH-CN">,其中小數點后位數為</font>4<font face="宋體"
lang="ZH-CN">。 </p>
</font><p>6.2.5 <font face="宋體" lang="ZH-CN">增加一條記錄 </p>
<p> 當用戶單擊“增加”按鈕時屏幕將會彈出一個記錄編輯模式對話框</font>EditForm<font
face="宋體" lang="ZH-CN">。在編輯框中填入合適的內容并按</font>OK<font
face="宋體" lang="ZH-CN">鍵關閉后,相應值寫入一個</font>TMethod<font
face="宋體" lang="ZH-CN">類型的變量</font>MethodRec<font face="宋體" lang="ZH-CN">中。其中</font>Nature<font
face="宋體" lang="ZH-CN">和</font>Result <font face="宋體" lang="ZH-CN">域需要進行轉換。之后增加的記錄添加到</font>StringGrid1<font
face="宋體" lang="ZH-CN">的顯示中。</p>
<p> 最后文件定位于尾部,寫入當前記錄,總記錄數加</font>1<font
face="宋體" lang="ZH-CN">。 </p>
</font><p><font face="宋體" lang="ZH-CN"> </font> Seek(MethodFile,Count);</p>
<p>Write(MethodFile,MethodRec);</p>
<p>Count := Count+1; </p>
<p><font face="宋體" lang="ZH-CN">完整的程序清單如下: </p>
</font><p>procedure TRecFileForm.AddButtonClick(Sender: TObject);</p>
<p>var</p>
<p>MethodRec: TMethod;</p>
<p>Rl: Real;</p>
<p>k: Integer;</p>
<p>EditForm: TEditForm;</p>
<p>begin</p>
<p>if FileOpenEd = False then Exit;</p>
<p>EditForm := TEditForm.Create(self);</p>
<p>if EditForm.ShowModal <> idCancel then</p>
<p>begin</p>
<p>HazAttr.text := '';</p>
<p>MethodRec.Name := EditForm.MethodName.text;</p>
<p>MethodRec.Condition := EditForm.Condition.text;</p>
<p>case EditForm.NatureCombo.ItemIndex of</p>
<p>0:</p>
<p>MethodRec.Nature := Micro;</p>
<p>1:</p>
<p>MethodRec.Nature := Macro ;</p>
<p>end;</p>
<p>Val(EditForm.Result.text,Rl,k);</p>
<p>MethodRec.Result := Rl;</p>
<p>with StringGrid1 do</p>
<p>begin</p>
<p>if Count < MaxShow then</p>
<p>Height := Height+DefaultRowHeight;</p>
<p>RowCount := RowCount+1;</p>
<p>end;</p>
<p>ShowMethod(MethodRec,Count+1);</p>
<p>seek(MethodFile,Count);</p>
<p>write(MethodFile,MethodRec);</p>
<p>Count := Count+1;</p>
<p>end;</p>
<p>end; </p>
<p>6.2.6 <font face="宋體" lang="ZH-CN">修改記錄 </p>
<p> 首先獲取當前記錄位置: </p>
<p> </font>CurrentRec := StringGrid1.Row - 1; </p>
<p><font face="宋體" lang="ZH-CN">
而后打開編輯對話框并顯示當前值。修改完畢后,修改結果保存在一個記錄中并在</font>StringGrid1<font
face="宋體" lang="ZH-CN">中重新顯示。</p>
<p> 最后修改結果寫入文件: </p>
</font><p>Seek(MethodFile,CurrentRec);</p>
<p>Write(MethodFile,MethodRec); </p>
<p><font face="宋體" lang="ZH-CN">完整程序如下: </p>
</font><p>procedure TRecFileForm.ModifyButtonClick(Sender: TObject);</p>
<p>var</p>
<p>MethodRec: TMethod;</p>
<p>Rl: Real;</p>
<p>k: Integer;</p>
<p>EditForm: TEditForm;</p>
<p>begin</p>
<p>if FileOpened = False then Exit;</p>
<p>EditForm := TEditForm.Create(self);</p>
<p>CurrentRec := StringGrid1.Row-1;</p>
<p>with EditForm do</p>
<p>begin</p>
<p>MethodName.text := StringGrid1.Cells[0,CurrentRec+1];</p>
<p>Condition.text := StringGrid1.Cells[1,CurrentRec+1];</p>
<p>if StringGrid1.Cells[2,CurrentRec+1] = '<font face="宋體" lang="ZH-CN">微</font> <font
face="宋體" lang="ZH-CN">觀</font>' then</p>
<p>NatureCombo.ItemIndex := 0</p>
<p>else</p>
<p>NatureCombo.ItemIndex := 1;</p>
<p>Result.text := StringGrid1.Cells[3,CurrentRec+1];</p>
<p>if ShowModal <> idCancel then</p>
<p>begin</p>
<p>HazAttr.text := '';</p>
<p>MethodRec.Name := MethodName.text;</p>
<p>MethodRec.Condition := Condition.text;</p>
<p>case NatureCombo.ItemIndex of</p>
<p>0:</p>
<p>MethodRec.Nature := Micro;</p>
<p>1:</p>
<p>MethodRec.Nature := Macro ;</p>
<p>end;</p>
<p>Val(Result.text,Rl,k);</p>
<p>MethodRec.Result := Rl;</p>
<p>ShowMethod(MethodRec,CurrentRec+1);</p>
<p>seek(MethodFile,CurrentRec);</p>
<p>write(MethodFile,MethodRec);</p>
<p>end;</p>
<p>end;</p>
<p>end;<font face="宋體" lang="ZH-CN"> </font></p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="017.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="015.htm"><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -