熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi面向對象的編程方法(五)

2013-11-11 21:05:56  來源: Delphi編程 

  過程和函數的語句部分 

  過程或函數的語句部分由begin開始end結束函數需要一個返回值可以將返回值賦給函數名稱也可以將返回值賦給Result變量下面的例程將返回值賦給函數名稱 

  function CalculateInterest(PrincipalInterestRate: Double):Double;
  begin
  CalculateInterest := Principal * InterestRate;
  end; 

  將返回值賦給Result變量也是可以的則上面的程序改為 

  Result := Principal*InterestRate;

  下面是這個函數的調用方法

  InterestEarned :=CalculateInterest();

  在Implementation後面的過程和函數可以且只能被此庫單元的事件處理過程使用要讓過程和函數可以被其他的程序庫單元使用則需要將過程或函數的標題部分放在庫單元中的interface部分而把含標題的整個過程或函數放在庫單元的inplementation部分並在要訪問這個過程或函數的庫單元的uses子句中加入說明這個過程或函數的庫單元名稱 

  函數的遞歸調用 

       在Object Pascal中過程或函數必須先說明再調用上文的NoValue函數必須在使用它的事件處理過程之前說明和執行否則程序會報告一個未知標識符的錯誤

       以上規則在遞歸調用時是例外情況所謂遞歸調用是指函數A調用函數B而函數B又調用函數A的情況在遞歸調用中函數要進行前置即在函數或過程的標題部分最後加上保留字forword下文的例程是一個遞歸調用的典型例子 

  implementation
  var
  alpha:Integer;
  procedure Test(var A:Integer):forword;
  {Test被說明為前置過程}
  procedure Test(var A:Integer);
  begin
  A :=A;
  if A> then
  test(A); {經前置說明調用未執行的過程Test}
  writeln(A);
  end;
  procedure Test(var A:Integer);{經前置說明的Test的執行部分}
  begin
  A :=A div ;
  if A> rhen
  test(A); {在Test中調用已執行的過程Test}
  end; 
  procedure TFormButtonClick(Sender:TObject);
  begin
  Alpha := ; {給Alpha賦初值}
  Test(Alpha); { 第一次調用Test遞歸開始}
  end; 

  按鈕的OnClick事件處理過程給Alpha賦初值並實現先減再除的循環遞歸調用直到Alpha小於為止 

  過程和函數的參數 

       當您的程序代碼在調用一個過程或函數時通常用參數傳遞數據到被調用的過程或函數中最常用的參數有數值參數變量參數和常量參數三種

       由被調用過程或函數定義的參數為形參而由調用過程或函數指明的參數叫實參在NoValue函數中說明函數體中的AnEditBox是形參而調用時在if NoValue(Edit)…中Edit是實參

       數值參數在運行過程中只改變其形參的值不改變其實參的值即參數的值不能傳遞到過程的外面試看下面的例程 

  procedure Calculate(CalNo:Integer);
  begin
  CalNo := CalNo*;
  end; 

  用以下例程調用Calculate函數

  Number := StrToInt(EditText);
  Calculate(Number);
  EditText := IntToStr(Number);

  Number接受由編輯框輸入的數值經Calculate過程運算它是一個數值型實參在進入Calculate函數後會把Number實參拷貝給形參CalNo在過程中CalNo增大十倍但並未傳遞出來因此Number值並未改變在編輯框中顯示仍然是編輯框中的輸入值形參和實參占用不同的內存地址在過程或函數被調用時將實參的值復制到形參占用的內存中因此出了過程或函數後形參和實參的數值是不同的但實參的值並不發生變化

  如果您想改變傳入的參數值就需要使用變量參數即在被調用程序的參數表中的形參前加上保留字var例如 

  procedure Calculate(var CalNo : Integer); 

       則CalNo並不在內存中占據一個位置而是指向實參Number當一個變參被傳遞時任何對形參所作的改變會反映到實參中這是因為兩個參數指向同一個地址將上一個例程中過程頭的形參CalNo前面加上var再以同樣的程序調用它則在第二個編輯框中會顯示計算的結果把第一個編輯框中的數值放大十倍這時形參CalNo和實參Number的值都是Nnmber初始值的

       如果當過程或函數執行是要求不改變形參的值最保險的辦法是使用常量參數在參數表的參數名稱前加上保留字const可以使一個形參成為常量參數使用常量參數代替數值參數可以保護您的參數使您在不想改變參數值時不會意外地將新的值賦給這個參數

  定義新的數據類型 

       Object Pascal有一些系統預定義的數據類型中已經對它們作了介紹您可以利用這些數據類型以建立新的數據類型來滿足程序的特定需要下面簡單地敘述了您能建立的主要數據類型如枚舉型子界型數組型集合型記錄型對象型等 

  枚舉類型 

       一個枚舉型的說明列出了所有這種類型可以包括的值 

  type
  Tdays=( Sunday MondayTuesdayWednesdayThursdayFridaySaturday);  

       可以定義上述枚舉類型的變量

  var
  DayOfWeek:TDays;  

       在枚舉型中括號中的每一個值都有一個由說明它的位置決定的整形值例如Sunday有整形值Monday有整形值您可以把DayOfWeek說明為一個整形變量並將一星期的每一天賦一個整形值以達到相同的效果但用枚舉型會使得程序可讀性好編寫容易當您在枚舉型中列出值時您同時說明了這個值是一個標識符例如您的程序中如果已經含有TDays類型且說明了DayOfWeeks變量則程序中便不能使用Monday變量因為它已經被說明為標識符了  

  子界類型 

       子界型是下列這些類型中某范圍內的值整形布爾量字符型或枚舉型在您想限制一個變量的取值范圍時子界型是非常有用的 

  type
  Thours = ;
  TValidLetter = A F;
  TDays = ( Sunday MondayTuesdayWednesdayThursday
  FridaySaturday); {枚舉型}
  TWorkDay = MondayFriday; {一個TDays型的子界} 

        子界型限定了變量的可能取值范圍當范圍檢查打開時(在庫單元的Implementation後面有{$R*DFM}字樣表示范圍檢查打開否則您可以在Options|Project|Complier Options中選擇Range Cheking來打開范圍檢查)如果變量取到子界以外的值會出現一個范圍檢查錯誤 

  數組類型 

        數組是某種數據類型的有序組合其中每一個元素的值由其相對位置來指定您可以在數組的某個位置上放置數據並在需要時使用這些數據下面的類型說明了一個Double型的數組變量

  var
  Check : array [] of Double; 

       它表示Check指向一個含有個Double型元素的數據串列代表每一個元素的是之間的數字稱為索引數組的每一項由數組名稱加上[]中的索引來表示Check包含個變量Check[]表示第一個變量您也可以把數組定義成類型

  type
  TCheck = array[] of Double;

  則變量說明改為

  var
  Check :TCheck; 

       您可以通過給數組賦值等方法來使用數組下面的語句將賦給Check數組中的所有元素 

  for J := to do
  Check[J] := ;

       數組也可以是多維的下面的類型定義了一個列的數組

  type
  Ttable = array[] of Double;
  var
  table:TTable; 

       想將這一表格的所有數據初始化為您可以使用for循環 

  var
  ColRow:Integer;
  for Col := to do
  for Row := to do
  Table[ColRow] := ;


From:http://tw.wingwit.com/Article/program/Delphi/201311/8494.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.