?? 自定義過程與函數 .txt
字號:
自定義過程與函數
--------------------------------------------------------------------------------
作者:不詳 來源于:不詳 發(fā)布時間:2005-2-13 15:48:00
Pascal 過程與函數
Pascal中的例程有兩種形式:過程和函數。理論上說,過程是你要求計算機執(zhí)行的操作,函數是能返回值的計算。兩者突出的不同點在于:函數能返回計算結果,即有一個返回值,而過程沒有。兩種類型的例程都可以帶多個給定類型的參數。
不過實際上函數和過程差別不大,因為你可以調用函數完成一系列操作,跳過其返回值(用可選的出錯代碼或類似的東西代替返回值);也可以通過過程的參數傳遞計算結果(這種參數稱為引用,下一部分會講到)。
下例定義了一個過程、兩個函數,兩個函數的語法略有不同,結果是完全相同的。
procedure Hello;
begin
ShowMessage ('Hello world!');
end;
function Double (Value: Integer) : Integer;
begin
Double := Value * 2;
end;
// or, as an alternative
function Double2 (Value: Integer) : Integer;
begin
Result := Value * 2;
end;
流行的做法是用Result 給函數賦返回值,而不是用函數名,我認為這樣的代碼更易讀。
一旦定義了這些例程,你就可以多次調用,其中調用過程可執(zhí)行操作;調用函數能計算返回值。如下:
procedure TForm1.Button1Click (Sender: TObject);
begin
Hello;
end;
procedure TForm1.Button2Click (Sender: TObject);
var
X, Y: Integer;
begin
X := Double (StrToInt (Edit1.Text));
Y := Double (X);
ShowMessage (IntToStr (Y));
end;
注意:現在不必考慮上面兩個過程的語法,實際上它們是方法。只要把兩個按鈕(button)放到一個Delphi 窗體上,在設計階段單擊它們,Delphi IDE將產生合適的支持代碼,你只需要填上begin 和end 之間的那幾行代碼就行。編譯上面的代碼,需要你在窗體中加一個Edit控件。
現在回到我前面提到過的代碼封裝概念。當你調用Double 函數時,你不需要知道該函數的具體實現方法。如果以后發(fā)現了更好的雙倍數計算方法,你只需要改變函數的代碼,而調用函數的代碼不必改變(盡管代碼執(zhí)行速度可能會加快!)。Hello 過程也一樣,你可以通過改變這個過程的代碼,修改程序的輸出,Button2Click 方法會自動改變顯示結果。下面是改變后的代碼:
procedure Hello;
begin
MessageDlg ('Hello world!', mtInformation, [mbOK]);
end;
提示:當調用一個現有的Delphi 函數、過程或任何VCL方法時,你應該記住參數的個數及其數據類型。不過,只要鍵入函數或過程名及左括號,Delphi 編輯器中會出現即時提示條,列出函數或過程的參數表供參考。這一特性被稱為代碼參數(Code Parameters) ,是代碼識別技術的一部分。
引用參數
Pascal 例程的傳遞參數可以是值參也可以是引用參數。值參傳遞是缺省的參數傳遞方式:即將值參的拷貝壓入棧中,例程使用、操縱的是棧中的拷貝值,不是原始值。
當通過引用傳遞參數時,沒有按正常方式把參數值的拷貝壓棧(避免拷貝值壓棧一般能加快程序執(zhí)行速度),而是直接引用參數原始值,例程中的代碼也同樣訪問原始值,這樣就能在過程或函數中改變參數的值。引用參數用關鍵字var 標示。
參數引用技術在大多數編程語言中都有,C語言中雖沒有,但C++中引入了該技術。在C++中,用符號 &表示引用;在VB中,沒有ByVal 標示的參數都為引用。
下面是利用引用傳遞參數的例子,引用參數用var關鍵字標示:
procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;
在這種情況下,參數既把一個值傳遞給過程,又把新值返回給調用過程的代碼。當你執(zhí)行完以下代碼時:
var
X: Integer;
begin
X := 10;
DoubleTheValue (X);
x變量的值變成了20,因為過程通過引用訪問了X的原始存儲單元,由此改變了X的初始值。
通過引用傳遞參數對有序類型、傳統(tǒng)字符串類型及大型記錄類型才有意義。實際上Delphi總是通過值來傳遞對象,因為Delphi對象本身就是引用。因此通過引用傳遞對象就沒什么意義(除了極特殊的情況),因為這樣相當于傳遞一個引用到另一個引用。
Delphi 長字符串的情況略有不同,長字符串看起來象引用,但是如果你改變了該字符串的串變量,那么這個串在更新前將被拷貝下來。作為值參被傳遞的長字符串只在內存使用和操作速度方面才象引用,但是如果你改變了字符串的值,初始值將不受影響。相反,如果通過引用傳遞長字符串,那么串的初始值就可以改變。
Delphi 3增加了一種新的參數:out。out參數沒有初始值,只是用來返回一個值。out參數應只用于COM過程和函數,一般情況下最好使用更有效的var參數。除了沒有初始值這一點之外,out參數與var參數相同。
常量參數
除了引用參數外,還有一種參數叫常量參數。由于不允許在例程中給常量參數賦新值,因此編譯器能優(yōu)化常參的傳遞過程。編譯器會選用一種與引用參數相似的方法編譯常參(C++術語中的常量引用),但是從表面上看常參又與值參相似,因為常參初始值不受例程的影響。
事實上,如果編譯下面有點可笑的代碼,Delphi將出現錯誤:
function DoubleTheValue (const Value: Integer): Integer;
begin
Value := Value * 2; // compiler error
Result := Value;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -