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

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

2013-11-23 17:43:24  來源: Delphi編程 

  重載一個方法 

       您可以重載(Override)一個方法通過在後代對象中說明一個與祖先對象重名的方法就可以重載一個方法如果想使這個方法在後代對象中作和祖先對象中一樣的工作但是使用不同的方式時您就可以重載這個方法Delphi不推薦您經常重載方法除非您想建立一個新的部件重載一個方法Delphi編譯器不會給出錯誤或警告提示信息

   對象公有域和私有域的說明 

       當使用Delphi的環境來建立應用程序時您可以在一個TForm的後代對象中加入數據域和方法也可以通過直接修改對象類型說明的方法來為一個對象加上域和方法而不是把一個部件加入窗體或事件處理過程中

       您可以在對象的Public或Private部分加入新的數據域和方法Public和Private是Object Pascal的保留字當您在工程中加入新的窗體時Delphi開始建立這個新窗體對象每一個新的對象都包含public和private指示以便您在代碼中加入數據域和方法在public部分中說明其它庫單元中對象的方法也可以訪問的數據域或方法在private部分的說明有訪問的限制如果您在private中說明域和方法那麼它在說明這個對象的庫單元外是不透明的而且不能被訪問private中可以說明只能被本庫單元方法訪問的數據域和本庫單元對象訪問的方法過程或函數的程序代碼可以放在庫單元的implementation部分 

   訪問對象的域和方法 

  當您想要改變一個窗體對象的一個域的某個屬性或是調用它的一個方法時您必須在這個屬性名稱或調用方法之前加上這個對象的名稱例如如果您的窗體上有一個編輯框部件而您需要在運行中改變它的Text屬性需要編寫下列的代碼 

  EditText := Welcome to Delphi;

  同樣清除編輯框部件中選中的文本可以調用TEdit部件的相應方法 

  EditClearSelection; 

       如果您想改變一個窗體對象中一個對象域的多個屬性或調用多個方法時使用with語句可以簡化您的程序with語句在對象中可以和在記錄中一樣方便地使用下面的事件處理過程在響應OnClick事件時會對一個列表框作多個調整 

  procedure TFormButtonClick(Sender:TObject);
  begin
  ListBoxClear;
  ListBoxMultiSelect :=True;
  ListBoxItemAdd(One);
  ListBoxItemAdd(Two);
  ListBoxItemAdd(Three);
  ListBoxSorted :=Ture;
  ListBoxFontStyle :=[fsBold];
  ListBoxFontColor :=clPurple;
  ListBoxFontName :=Times New Roman;
  ListBoxScaleBy();
  end; 

  如果使用了With語句則程序如下 

  procedure TFormButtonClick(Sender:TObject);
  begin
  with (ListBox) do
  begin
  Clear;
  MultiSelect :=True;
  ItemAdd(One);
  ItemAdd(Two);
  ItemAdd(Three);
  Sorted :=Ture;
  FontStyle :=[fsBold];
  FontColor :=clPurple;
  FontName :=Times New Roman;
  ScaleBy();
  end;
  end; 

       使用with語句您不必在每一個屬性或方法前加上ListBox標識符在With語句之內所有的屬性或調用方法對於ListBox這個對象而言都是在它的范圍內的 

   對象變量的賦值 

       如果兩個變量類型相同或兼容您可以把其中一個對象變量賦給另一個對象變量例如對象TForm和TForm都是從TForm繼承下來的類型而且Form和Form已被說明過那麼您可以把Form賦給Form:

  Form :=Form;

       只要賦值的對象變量是被賦值的對象變量的祖先類型您就可以將一個對象變量賦給另一個對象變量例如下面是一個TDataForm的類型說明在變量說明部分一共說明了兩個變量AForm和DataForm 

  type
  TDataForm = class(TForm)
  Button:TButton;
  Edit:TEdit;
  DataGrid:TDataGrid;
  Database:TDatabase;
  TableSet:TTableSet;
  VisibleSession:TVisibleSession;
  private{私有域說明}
  public{公有域說明}
  end;
  var
  AForm:TForm;
  DataForm:TDataForm;

       因為TDataForm是TForm類型的後代所以Dataform是AForm的後代因此下面的賦值語句是合法的

  AForm :=DataForm;

       這一點在Delphi中是極為重要的讓我們來看一下應用程序調用事件處理過程的過程下面是一個按鈕部件的OnClick事件處理過程

  procedure TFormButtonClick(Sender:TObject);
  begin
  end;

       您可以看到TObject類在Delphi的Visual Component Library的頂部這就意味著所有的Delphi對象都是TObject的後代因為Sender是TObject類型所以任何對象都可以賦值給它雖然您沒有看見賦值的程序代碼但事實上發生事件的部件或控制部件已經賦給Sender了這就是說Sender的值是響應發生事件的部件或控制部件的

       您可以使用保留字is來測試Sender以便找到調用這個事件處理過程的部件或控制部件的類型Delphi中的一個顯示draganddrop的DRAGDROPDPR工程加載它可以查閱到DROPFONTPAS庫單元的代碼在MemoDragOver方法中檢查了一個對象變量的類型在這種情形下參數是Source而不是Sender 

  procrdure TFormMemoDragOver(SenderSource:TObject;XY:integer;
  State:TDragState;var Accept:Boolean);
  begin
  Accept :=Source is TLabel;
  end;  

       Source參數也是TObject類型Source被賦值為那個被拖曳的對象用MemoDragOver方法的目的是確保只有標簽可以被拖曳Accept是布爾型參數如果Accept為True那麼用戶選擇的部件可以被拖曳反之當Accept的值為False時用戶就不可以拖曳選擇控制部件is保留字檢查Source是否TLabel的類型所以Accept只有在用戶拖曳一個標簽時才為真並作為變參輸出到函數之外

  下面的draganddrop展示的MemoDragDrop事件處理過程中也使用了Source參數這個方法是為了把Memo部件的字型改變成和放入這個備注控制部件的標簽一樣的字型 

  procedure TFormMemoDragDrop(SenderSource:TObject;XY:Integer);
  begin
  MemoFont := (Source as TLabel)Font;
  end; 

       當您在這個事件處理過程中編寫賦值語句時開發人員並不知道用戶會放入哪一個標簽只有通過參考這個標簽的名稱(Source as TLabel)用戶才能知道並把標簽類型賦給MemoTFontSource包含了用戶拖放控制部件的名稱只有當Source是一個標簽時這個事件處理過程才允許這個賦值發生

   建立非可視化對象 

       您在Delphi中使用的大部分對象都是您在設計和運行期間可以看見的部件例如編輯框按鈕等一些部件如通用對話框(Common dialog box)等在設計時看不見而在運行時可以看見另外有些部件例如計時器(Timer)數據源(Data Source)部件等在程序的運行期間沒有任何可視化的顯示但您卻可以在您的應用程序中使用它們 

  說明一個非可視化對象 

       下面通過一個簡單的例子講述如何建立自己的非可視化對象

       您可以用如下的方法建立一個自己的TEmployee非可視化對象 

  type
  Temployee = class(TObject);
  Name := String[];
  Title := String[];
  HourlyPayRate : Double;
  function CalculatePayAmount:Double;
  end; 

       在這種情況下TEmployee從TObject繼承下來且包含三個域和一個方法把您建立的類型說明放在庫單元中的說明部分並和窗體說明放在一起在這個程序庫單元的變量說明部分說明一個新類型的變量 

  var
  Employee : TEmployee; 

  用Create方法建立對象實例 

       TEmployee只是一個對象類型除非通過一個構造函數的調用從而被實例取代或創建否則一個對象並不存儲在內存中構造函數是一個方法它為新對象配置內存並且指向這個新的對象這個新的對象也被稱為這個對象類型的一個實例

       建立一個對象的實例需要調用Create方法然後構造函數把這個實例賦給一個變量如果您想說明一個TEmployee類型的實例在您訪問這個對象的任何域之前您的程序代碼必須調用Create

  Employee := TEmployeeCreate; 

       Create方法並沒有在TEmployee類型中說明它繼承自TObject類型因為TEmployee是TObject的子類所以它可以調用Create方法而創建一個TEmployee實例然後把它賦給Employee變量在創建了一個這樣的對象後您就可以象使用其他的Delphi對象一樣訪問Employee對象了 

   撤銷對象 

       當您使用完對象後您應該及時撤銷它以便把這個對象占用的內存釋放出來您可以通過調用一個注銷方法來撤銷您的對象它會釋放分配給這個對象的內存

       Delphi的注銷方法有兩個Destroy和FreeDelphi建議使用Free因為它比Destroy更為安全同時調用Free會生成效率更高的代碼

        您可以用下列的語句釋放用完的Employee對象 

  EmployeeFree; 

       和Create方法一樣Free方法也是TEmployee從TObject中繼承過來的把您的注銷放在try…finally程序模塊的finally部分而把對象的程序代碼放在try部分是編程的好習慣這樣即使您的程序代碼在使用對象時發生了異常事件也會確保您為這個對象分配的內存會被釋放關於異常處理和try…finally程序模塊的信息以及建立非可視化對象的例子在後文中還將仔細講述


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