後一頁
前一頁
回目錄
回首頁
第二章 Delphi面向物件的程式設計方法(二)

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後面,則表明對於庫單元來講,它是全局的,所有的事件處理過程和其他的過程、函數都可以呼叫它。如果型式是在過程中被敘述的,則是局部的,離開這一過程,該型式將失效。

         一般來講,在過程和函數中,任何型式敘述都在變數敘述之前,而任何變數敘述都在常數之前。但是,只要遵從敘述必須在過程與函數的標題之後,而且在程式代碼之前,即是有效的。


後一頁
前一頁
回目錄
回首頁