| 後一頁 前一頁 回目錄 回首頁 |
2.1.4 跳轉語句 Object Pascal的跳轉語句有if和case兩個。 2.1.4.1 if語句 if語句會計算一個表達式,並根據計算結果決定程式流程。在上文的例程中,根據ColorDialog.Execute的返回值,決定窗體的背景顏色。if保留字後跟隨一個產生Boolean值True或False的表達式。一般用“=”作為關係運算符,比較產生一個布爾型值。當表達式為True時,執行then後的語句。否則執行else後的代碼,if語句也可以不含else部分,表達式為False時自動跳到下一行程式。 if語句可以巢狀,當使用復合語句表達時,復合語句前後需加上begin…end。else保留字前不能加“;”,而且,編譯器會將else語句視為屬於最靠近的if語句。必要時,須使用begin…end保留字來強迫else部分屬於某一級的if語句。 2.1.4.2 case語句 case語句適用於被判斷的變數或屬性是整形、字元型、枚舉型或子界型時(LongInt除外)。用case語句進行邏輯跳轉比編寫複雜的if語句容易閱讀,而且程式代碼整形較快。 下面的例程顯示一個使用case語句的窗體: 建立如下的事件處理過程: procedure TForm1.Button1Click(Sender: TObject); var Number : Integer; begin Number := StrToInt(Edit1.Text); case Number of 1,3,5,7,9: Label2.Caption := '奇數'; 0,2,4,6,8: Label2.Caption := '偶數'; 10..100: begin Label2.Caption := '在10到100之間'; Form1.Color := clBlue; end; else Label2.Caption := '大於100或為負數'; end; end; 執行程式,當Edit1部件接受到一個值,並按動“OK”按鈕觸發程式後,Number便被賦值為用戶輸入的數值。case語句根據Number的值判斷該執行哪一條語句。象if語句一樣。case語句也有可選擇的else部分。case語句以end結尾。 2.1.5 回圈語句 Object Pascal的回圈語句有三種:repeat、while和for語句。 2.1.5.1 repeat語句 repeat語句會重複執行一行或一段語句直到某一狀態為真。語句以repeat開始,以until結束,其後跟隨被判斷的布爾表達式。參閱以下的例程: i := 0; repeat i := i+1; Writen(i); until i=10; 當此語句被執行時,窗體的下方會出現1到10的數字。布爾表達式 i=10 (注意,與其他語言不同的是,“=”是關係運算符,而不能進行賦值操作)直到repeat..until程式段的結尾才會被計算,這意味著repeat語句至少會被執行一次。 2.1.5.2 while語句 while語句和repeat語句的不同之處是,它的布爾表達式在回圈的開頭進行判斷。while保留字後面必須跟一個布爾表達式。如果該表達式的結果為真,回圈被執行,否則會結束回圈,執行while語句後面的程式。 下面的例程達到和上面的repeat例程達到同樣的效果: i := 0; while i<10 do begin i := i+1; writeln(i); end; 2.1.5.3 for語句 for語句的程式代碼會執行一定的次數。它需要一個回圈變數來控制回圈次數。您需要敘述一個變數,它的型式可以是整形、布爾型、字元型、枚舉型或子界型。 下面的程式段會顯示1到5的數字,i為控制變數: var i : integer; for i := 1 to 5 do writeln(i); 以上介紹了三種回圈語句。如果您知道回圈要執行多少次的話,可以使用for語句。for回圈執行速度快,效率比較高。如果您不知道回圈要執行多少次,但至少會執行一次的話,選用repeat..until語句比較合適;當您認為程式可能一次都不執行的話,最好選用while..do語句。 2.1.6 程式模群組 程式模群組在Object Pascal中是很重要的概念。它們提供了應用程式的結構,決定了變數、屬性值的範圍及程式執行的過程。它由兩個部分群群組成:可選擇的敘述部分和語句部分。如果有敘述部分,則必在語句部分之前。敘述部分包括變數敘述、常數敘述、型式敘述、標號敘述、程式,函數,方法的敘述等。語句部分敘述了可執行的邏輯行動。 在Delphi中,最常見的程式模群組便是事件處理過程中的程式模群組。下面的事件處理過程是含有變數敘述部分的程式模群組: procedure TForm.Button1Click(Sender Tobject); var {程式模群組的敘述部分} Name : string; begin {程式模群組的語句部分} Name := Edit1.Text; Edit2.Text := 'Welcome to Delphi'+Name; end; {程式模群組結束} 庫單元也是程式模群組。庫單元的interface部分含有庫函數、型式、私有,公有欄位的敘述,也可以含有常數、變數的敘述。這一部分可以作為程式模群組的敘述部分。在庫單元的implementation部分中通常含有各種事件處理過程,它們可以視為模群組的語句部分,是事件處理模群組。庫單元模群組結束於庫單元結束的end.處。 程式模群組中可以包含其他的程式模群組。上文庫單元模群組中含有事件處理模群組。而庫單元模群組實際是在工程程式模群組中。 所有的Delphi應用程式都有相同的基本結構。當程式逐漸複雜時,在程式中加入模群組即可。例如在庫單元模群組中加入事件處理模群組,向工程中加入庫單元模群組等。模群組化程式設計使得程式結構良好,並且對數據具有保護作用。 2.1.7 關於作用範圍 2.1.7.1 標識符的作用範圍 一個變數、常數、方法、型式或其他標識符的範圍定義了這個標識符的活動區欄位。對於敘述這個標識符的最小程式模群組而言,此標識符是局部的。當您的應用程式在敘述一個標識符的程式模群組外執行時,該標識符就不在此範圍內。這意味著此時執行的程式無法存取這個標識符,只有當程式再度進入敘述這個標識符的程式模群組時,才可以存取它。 下面的示意圖表示一個含有兩個庫單元的工程,每個庫單元中又各有三個過程或事件處理過程。 2.1.7.2 存取其他程式模群組中的敘述 您可以在目前的程式模群組中存取其他程式模群組中的敘述。例如您在庫單元中編寫一個事件處理過程來計算利率,則其他的庫單元可以存取這個事件處理過程。要存取不在目前庫單元中的敘述,應在這個敘述之前加上其他應用程式的標簽和一個點號(.)。例如,在庫單元Unit1中有事件處理過程CalculateInterest過程,現在您想在庫單元Unit2中呼叫這一過程,則可以在Unit2的uses子句中加入Unit1,並使用下面的敘述: Unit1.CalculateInterest(PrincipalInterestRate : Double); 應用程式的代碼不能在一個模群組外存取它敘述的變數。事實上,當程式執行跳出一個模群組後,這些變數就不存在於記憶體中了。這一點對於任何標識符都是一樣的,不管事件處理過程、過程、函數還是方法,都具有這一性質。這樣的標識符稱為局部變數。 2.1.7.3 按照作用範圍敘述標識符 您可以在應用程式的不同地方敘述一個標識符,而只需保證它們的有效範圍不同即可。編譯器會自動存取最靠近目前範圍的標識符。 庫單元的全局變數一般可以敘述在保留字implementation後面。例如,下面的例程實現將兩個編輯框中的整數相加,顯示在第三個編輯框中。用到了一個整形的全局變數Count: …implememntation var Count : Integer; procedure TForm1.AddClick(Sender:TObject); var FirstNumber,SecondNumber:Integer; begin Count := Count + 1; Counter.Text := IntToStr(Count); FirstNumber := StrToInt(Edit1.Text); SecondNumber := StrToInt(Edit2.Text); Edit3.Text := IntToStr(FirstNumber+SecondNumber); end; … 為了實現每按動一次按鈕Count增加一次,必須對全程變數Count進行初始化處理。在程式庫單元的結尾處,最後一個end.保留字之前,加入保留字initialization和初始化Count的代碼: … initialization Count := 0; 這樣當事件處理過程AddClick被觸發時,Count就會被增加一次,以表征計算次數。如果用面向物件程式設計,則Count可以敘述成窗體的一個欄位,這在下一節中將有講述。 2.1.8 編寫一個過程或函數 在您開發Delphi應用程式時,所需的大部分代碼都編寫在事件處理過程中,但有時仍然需要編寫不是事件處理過程的函數或過程。例如,您可以把在多個事件處理過程中用得到語句編寫成過程,然後任何事件處理過程、過程、函數都可以象呼叫已經存在的過程或函數一樣直接呼叫它。好處是您只需編寫一次代碼,而且程式代碼會比較清楚。 2.1.8.1 一個自行編寫的函數例程 在上文兩個數相加的程式中,如果編輯框中無值,則會使得程式出錯中斷。為避免這種情況,編寫下面的函數,檢查編輯框中是否有值,如無值,則提醒用戶輸入: function NoValue(AnEditBox:TEdit):Boolean; begin if AnEditBox.Text='' then begin AnEditBox.Color := clRed; AnEditBox.Text := '請輸入整數值'; Result := True; end else begin AnEditBox.Color := clWindow; Result := False; end; end; NoValue函數會檢查編輯框是否為空,如果是,編輯框顏色變紅,並提醒用戶輸入一個整數,然後函數返回真值;Result保留字在Delphi中用來專指函數返回值。在上文的例程中加入NoValue函數: procedure TForm1.AddClick(Sender: TObject); var FirstNumber,SecondNumber : Integer; begin if NoValue(Edit1)or NoValue(Edit2) then exit; Count := Count + 1; Counter.Text := IntToStr(Count); FirstNumber := StrToInt(Edit1.Text); SecondNumber := StrToInt(Edit2.Text); Edit3.Text := IntToStr(FirstNumber+SecondNumber); end; 如果其中的任何一個返回真值,則表示有編輯框空,會執行exit過程,使得目前的程式模群組停止執行,並使得編輯框出現輸值提示。當新值被輸入後,再執行程式時,紅色提示被隱去,恢復正常的計算狀態。 2.1.8.2 過程和函數的標題 每一個過程或函數都以標題開始,其中包括過程或函數的標簽和它使用的參數。過程以保留字procedure開始,函數以保留字function開始。參數位於括號�堶情A每一個參數以分號分隔。例如: procedure validateDate(Day : Integer; month : Integer; Year : Integer); 您也可以將相同型式的參數群群組合在一起,則上述過程頭寫作: procedure ValidateDate(Day, Month, Year : Integer); 函數在標題中還多了一項:返回值的型式。下面是一個返回值為Double型的函數標題: function CalculateInterest(principal,InterestRate:Double):Double; 2.1.8.3 函數和過程中的型式敘述 一個過程或函數程式模群組也含有敘述部分和語句部分。敘述部分可以包括型式敘述、變數敘述、常數敘述等。除了Object Pascal語言中已經定義的型式之外,Delphi的應用程式還可以建立新的數據型式。型式敘述部分有保留字type開始。下面是一些型式的敘述: type Tcount = Integer; TPrimaryColor = (Red,Yellow,Blue); TTestIndex = 1..100; TTextValue = -99..99; TTestList = array [TTestIndex] of TTestValue; TCharVal = Ord('A')..Ord('Z') ; Today = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday, Sunday) ; 在型式標識符後面,用“=”號定義了新的型式。型式界定了變數的取值範圍,例如,TCount型式的變數必須是整形值;一個TPrimaryColor型式的變數只能是red、yellow或blue等等。每一個型式的標簽都是由字母T開始,這並非必須的,但它是Delphi的慣例,在區別型式名和標識符時非常有用。型式敘述可以是局部的,也可以是全局的。如果您把它放在implementation後面,則表明對於庫單元來講,它是全局的,所有的事件處理過程和其他的過程、函數都可以呼叫它。如果型式是在過程中被敘述的,則是局部的,離開這一過程,該型式將失效。 一般來講,在過程和函數中,任何型式敘述都在變數敘述之前,而任何變數敘述都在常數之前。但是,只要遵從敘述必須在過程與函數的標題之後,而且在程式代碼之前,即是有效的。 |
後一頁 前一頁 回目錄 回首頁 |