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

        Delphi的程式設計語言是以Pascal為基礎的。Pascal語言具有可讀性好、編寫容易的特點,這使得它很適合作為基礎的開發語言。同時,使用編譯器建立的應用程式只產生單個可執行文件(.EXE),正是這種結合,使得Pascal成為Delphi這種先進開發環境的程式設計語言。

        本章中,我們將討論Object Pascal的主要特點,並講解如何在事件處理過程和其他應用程式中,使用它來編制程式代碼。本章將講解Delphi應用程式中最常用的Object Pascal語法,而不是Pascal語言的一切細節。如果您完全不熟悉Pascal程式設計,請參閱一些基礎的Pascal教程。如果您具有程式設計經驗,並能熟練地使用其他流行程式語言,您將在本章的Object Pascal中發現一些相同的概念。如果您已經熟悉了Borland Pascal,就可以快速瀏覽或跳過本章。 

2.1 編寫Object Pascal程式代碼 

        在前邊的章節中,我們通過例程,已經編寫了幾行簡單的代碼。在本章中,我們將從熟悉Pascal程式設計的角度,配合實例,講解Object Pascal程式設計的基本方法。

        在編寫自己的Object Pascal程式時,要注意程式的可讀性。Pascal語言是英式結構語言,在程式中選擇合適的縮排、大小寫風格,並在需要時將程式代碼分行,會使得程式代碼能夠很容易地被自己和他人讀懂。一般的程式員都有這樣的體驗:如果不給程式加上適當的註解,一段時間後,自己也難以理清程式的流程。給程式及時地加上注解是良好的程式設計習慣。Delphi的注解需要加注在{}之間,編輯器會把它們處理成為空白。Delphi保留了Borland Pascal編輯器的風格,關鍵字採用黑體字,被注解的部分會變暗,這使得程式設計風格良好,易讀易寫。 

2.1.1 編寫賦值語句 

        在事件處理過程中,最常用到的工作就是把一個新值賦給一個屬性或變數。在設計用戶介面時,可以使用Object Inspector(Object Inspector)來改變其屬性;但有時需要在程式執行時改變屬性的值,而且有些屬性只能在執行時改變,這些屬性在Delphi的在線輔助敘述的“Proprety”主題中被標為執行期屬性。進行這種改變,就必須使用賦值語句。

       下文的賦值語句表征一個OnClick事件。當按鈕按動後,將編輯框部件Edit1Color屬性置為clRed:

procedure TForm1.Button1Click(Sender: TObject);

begin

Edit1.Color := clRed;

end; 

        當按動按鈕後賦值語句被執行,編輯框變成紅色。

        在語句中,部件的標簽在屬性前,中間用“.”表示屬性的所屬關係。這樣就準確地指定了要將clRed值賦給哪一部件的哪一屬性。賦值號為“:=”,不論給屬性還是給變數賦值,都是將右邊的值賦給左邊的屬性或變數。

         當將一個屬性值、變數、常數或文本數據賦給屬性或變數時,所賦值的型式和接受此值的屬性或變數的型式應相同或相容。一個屬性或變數的型式定義了此屬性或變數的可能值集合,也定義了程式代碼可以執行的運算。在前邊的例程中,編輯框部件的Color屬性和clRed的型式都是TColor。可以在在線輔助敘述中找到一個屬性的型式;另外一種方法是在Object Inspector中選取該屬性值段,並按下F1鍵,則型式將在屬性敘述的結尾處列出,例如Color屬性列出下邊的語句: 

Property Color : TColor; 

         有些屬性是唯讀(Read Only)的,它們只能被讀取,不能被改變。請查閱在線輔助敘述,在Delphi中這些唯讀屬性都有註解。 

2.1.2 標識符的敘述與使用 

         標識符是Delphi應用程式中一些量的標簽,這些量包括變數(var)、常數(const)、型式(type)、過程(procedure)、方法(Method)及其他,Object Pascal 在應用標識符時,必須首先敘述它們。Object Pascal是強型式語言,它的編譯器可以檢查確保賦給變數或屬性的值是正確的型式,以便於您改正錯誤。因為Object Pascal是編譯語言,所以Delphi的執行速度要比使用解釋語言快得多。在使用標識符前敘述它們,可以減少程式錯誤並增加代碼的效率。 

2.1.2.1 變數

         變數是程式代碼中代表一個記憶體位址的標識符,而此位址的記憶體內容在程式代碼執行時可以被改變。在使用變數前必須對它進行敘述,即對它進行命名,並敘述它的型式。在所有變數敘述以前加上保留字var。變數敘述左邊是變數的標簽,右邊則是該變數的型式,中間用(:)隔開。 

var

Value ,Sum : Integer;

Line : String; 

        在窗體中加入一個標簽為Edit1的編輯框,再加入一個標簽(屬性Name)Add的按鈕部件,並建立如下的事件處理過程:

procedure TForm1.addClick(Sender: TObject);

var

X , Y: Integer;

begin

X := 100;

Y := 20;

Edit1.Text := IntToStr(X + Y);

end; 

        在本例中,當按動ADD按鈕時,編輯框中顯示值120。在Object Pascal中,必須確保變數或屬性被賦予型式相同或相容的值。您可以嘗試將賦給X的值改為100.0,或去掉IntToStr函數,在編譯時會出現型式不匹配的錯誤,這也敘述了Object Pascal強型式語言的特點。 

2.1.2.2 預定義型式 

        Object Pascal有多個預定義的數據型式,您可以敘述任何這些型式的變數:

        整形:Integer的範圍是-3276832767,2位元群組的記憶體;Shortint-128127,佔1位元群組記憶體;Longint-21474436482147483647 4位元群組記憶體;Byte0255,佔1位元群組;Word065535,佔2位元群組記憶體。它們都是沒有小數部分的數字。

        實型:Single可以包含78位有效小數部分,佔用4位元群組的記憶體;Double類可以包含1516位有效小數部分,佔用8位元群組的記憶體;Extended型式包含1920位有效小數部分,佔用10位元群組記憶體;Comp可以包含1920位有效小數部分,佔用8位元群組記憶體。以上實數型式只有在8087/80287選項[N+]打開才可以使用。Real可以包含1112位有效小數部分,佔用6位元群組記憶體。它只有在和以前Borland Pascal相容的情況下才使用,否則應使用DoubleExtended

       布爾型:Boolean,只包含trueFalse兩個值,佔用1位元群組記憶體。

       字元型:Char,一個ASCII字元;字元串型式String一串最長可達255ASCII字元。

       指標型:Pointer,可以指向任何特定型式。

       字元串型:PChar,是一個指向以零結尾的字元串的指標。

        除了預定義型式外,Delphi還有自行定義的型式。上述例程的TColor就是這種型式。此外,用戶還可以定義自己的數據型式,這部分內容將在下文中詳細講述。

        整型類別和實型類別都各有五種型式,同一類別中,所有的型式與其他同類別的都相容,您可以將一種型式的值賦給相同類別中不同型式的變數或屬性,而只需要這個值的範圍在被賦值的變數或屬性的可能值範圍內。例如,對於一個Shortint型的變數,可以接受在-128127範圍內的任意整數,例如Shortint型式的7;您不能將300賦給它,因為300已經超出了Shortint的範圍了。將範圍檢查功能打開(選用Options|Project,並在Compiler Options Page中選擇Range Checking),將會檢查出一個範圍錯誤;如果Range Checking沒有被打開,那麼程式代碼將可以執行,但被賦值的值將不是您期望的值。

        在一些情況下,您可以進行不同型式的變數或屬性的賦值。一般來說,可以將一個較小範圍的值賦給一個較大範圍的值。例如,您可以將整型值10賦給一個接受實型值的Double屬性而使得值成為10.0,但如果將一個Double型式的值賦給整形變數,則會出現型式錯誤。如果您不清楚型式的相容性,可以參閱Delphi的在線輔助敘述中“Type Compatibility and Assignment Compatibility”主題。 

2.1.2.3 常數 

       常數在敘述時就被賦予了一個值,在程式執行過程中是不可改變的。下面的例子敘述了三個常數: 

const

Pi = 3.14159;

Answer = 342;

ProductName = "Delphi"; 

        象變數一樣,常數也有型式。不同的是,常數假設其型式就是常數敘述中其所代表的值的型式。上文的三個常數的型式分別是real型、整形、字元串型。常數用“= " 表示兩邊的值是相等的。 

2.1.3 過程與函數 

        過程與函數是程式中執行特定工作的模群組化部分。Delphi的執行庫包含許多過程與函數以供您的應用程式呼叫。您不必了解過程與函數的邏輯,但要知道過程與函數的用途。在物件中敘述的過程和函數稱為方法(Method)。所有的事件處理過程都是過程,以保留字procedure開頭。每一個事件處理過程只包含了當這一事件發生時需要執行的程式代碼。在事件處理過程中使用Delphi已經存在的過程與函數,只需在程式代碼中呼叫它們即可。 

2.1.3.1 一個呼叫Delphi方法的簡單例程 

      下文將通過對一個Memo部件的文本進行剪下來、拷貝、貼上去、清除等編輯的應用程式編制,介紹使用Delphi過程和函數的呼叫方法。

       Memo(備註)部件有一個CutToClipboard方法,實現將用戶在memo中選擇的文本移到剪貼簿上去。由於這個功能已經被建立在此方法中了,所以您只需知道這個方法做什麼以及如何使用它即可。

       下面的語句表明如何呼叫一個名為Memo1memo部件的CutToClipboard方法: 

       Memo1.CutToClipboard; 

       通過指定Memo1的標簽,敘述呼叫哪一個部件的CutToClipboard方法。如果不指明物件標簽,Delphi會顯示Unknown identifier錯誤。當該事件處理過程被觸發,程式會執行CutToclipboard中的語句,將Memo1中的文本剪貼到剪貼簿上去。

       下文的例程展示了如何呼叫Delphi的方法,實現將備註部件的文本資訊剪下來、拷貝到剪貼簿上;將剪貼簿上的標記文本貼上去到備註中,清除備註部件中的全部文本等四個功能。

       打開一個新的空窗體,加入一個memo部件和四個按鈕,並排列整齊。改變按鈕部件的Name屬性,分別命名為Cut,Copy,Paste,Clear。您會發現,當Name屬性發生改變時,Caption屬性將發生相應的變化。在Caption屬性前加標“&”號設立加速鍵

        將memo部件的ScrollBars屬性設為ScVertical,以便加上滾行條。將WordWrap屬性設定為True,這樣當用戶輸入文本到達Memo部件的右邊緣時會自動回行。將Line屬性第一行的Memo1文本解除,使得memo部件在初始顯示時為空的。

為每一個按鈕建立如下的事件處理過程: 

procedure TForm1.CutClick(Sender: TObject)

begin

Memo1.CutToClipboard;

end; 

procedure TForm1.CopyClick(Sender: TObject);

begin

Memo1.CopyToClipboard;

end; 

procedure TForm1.PasteClick(Sender: TObject);

begin

Memo1.PasteFromClipboard;

end; 

procedure TForm1.ClearClick(Sender: TObject);

begin

Memo1.clear;

end; 

        執行此程式。您可以在備註部件中輸入文本,在進行了文本的標記後,可以任意地進行剪下來、拷貝、貼上去和清除。當按鈕被按動時,就呼叫相應的過程進行處理。用戶可以通過查閱在線輔助敘述進行Memo部件的Topic Search,在Memo Component項中查閱Method,會得到以上過程的詳細敘述。 

2.1.3.2 呼叫Delphi的含參過程 

        有些過程要求用戶指明參數。被呼叫的過程會在執行時使用傳入的參數值,這些值在過程中被認為是已經被敘述的變數。例如,LoadFromFile方法在TString物件中被敘述為: 

Procedure LoadFromFile(const FileName: String); 

        在呼叫這一過程時,應指明FileName參數是要載入的檔案標簽稱。下面的程式將先打開Open對話方塊,當您選擇了一個文件後,Delphi將把該文件讀入一個Memo部件: 

begin

OpenDialog.Execute;

Memo1.lines.LoadFromFile(OpenDialog.FileName);

end; 

2.1.3.3 使用Delphi函數 

        與過程一樣,函數的程式代碼也執行特定的工作。它和過程的差別為:函數執行時會返回一個值,而過程則沒有返回值。函數可以用來賦給一個屬性或變數;也可以使用返回值來決定程式的流程。

        前文中我們實際上已經接觸過了函數。在講述變數時,曾用到過下面的程式段: Edit1.Text := IntToStr(X + Y);其中,IntToStr(Value)把一個LongInt型式的數值轉化為字元串的值,ValueIntToStr唯一的參數,它可以是一個整形的值、變數、屬性或產生整形值的表達式。呼叫函數,必須把返回值賦給和此返回值型式相容的變數或屬性。

        有些函數返回一個TrueFalse的布爾量,用戶的程式可以根據返回值來決定跳轉。下文的例程講述了函數返回值為Boolean的判斷用法:

        在窗體中加入一個ColorDialog物件和一個Name屬性為ChangeColor的按鈕。為按鈕的OnClick事件建立事件處理過程如下: 

procedure TForm1.ChangeColorClick(Sender: TObject);

begin

if ColorDialog1.Execute then

Form1.Color := ColorDialog1.Color

else

Form1.Color := clRed;

end; 

        此事件處理過程使用一個返回Boolean值的Execute方法。按動按鈕,並在顏色對話方塊中選擇一個顏色。如果按動OK按鈕,ColorDialog.Execute方法將返回True,則Form1.Color將被賦值為ColorDialog1.Color,窗體顯現您選用的顏色;如果按動顏色對話方塊的Cancel按鈕,方法將返回False值,窗體將變為紅色。


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