程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第二章-Delphi面向對象的編程方法(四)(3)

第二章-Delphi面向對象的編程方法(四)(3)

編輯:Delphi

2.2.6 對象變量的賦值 

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

Form2 :=Form1;

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

type

TDataForm = class(TForm)

Button1:TButton;

Edit1:TEdit;

DataGrid1:TDataGrid;

Database1:TDatabase;

TableSet1:TTableSet;

VisibleSession1:TVisibleSession;

private

{私有域說明}

public

{公有域說明}

end;

var

AForm:TForm;

DataForm:TDataForm;

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

AForm :=DataForm;

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

procedure TForm1.Button1Click(Sender:TObject);

begin

end;

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

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

procrdure TForm1.Memo1DragOver(SenderSource:TObject;X,Y:integer;

State:TDragState;var Accept:Boolean);

begin

Accept :=Source is TLabel;

end;  

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

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

procedure TForm1.Memo1DragDrop(SenderSource:TObject;

X,Y:Integer);

begin

Memo1.Font := (Source as TLabel).Font;

end; 

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

2.2.7 建立非可視化對象 

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

2.2.7.1說明一個非可視化對象 

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

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

type

Temployee = class(TObject);

Name := String[25];

Title := String[25];

HourlyPayRate : Double;

function CalculatePayAmount:Double;

end; 

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

var

Employee : TEmployee; 

2.2.7.2用Create方法建立對象實例 

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

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

Employee := TEmployee.Create; 

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

2.2.7.3 撤銷對象 

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

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

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

Employee.Free; 

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved