2.2.6 對(duì)象變量的賦值
如果兩個(gè)變量類型相同或兼容,您可以把其中一個(gè)對(duì)象變量賦給另一個(gè)對(duì)象變量。例如,對(duì)象TForm1和TForm2都是從TForm繼承下來的類型,而且Form1和Form2已被說明過,那么您可以把Form1賦給Form2:
Form2 :=Form1;
只要賦值的對(duì)象變量是被賦值的對(duì)象變量的祖先類型,您就可以將一個(gè)對(duì)象變量賦給另一個(gè)對(duì)象變量。例如,下面是一個(gè)TDataForm的類型說明,在變量說明部分一共說明了兩個(gè)變量: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;
因?yàn)門DataForm是TForm類型的后代,所以Dataform是AForm的后代,因此下面的賦值語句是合法的:
AForm :=DataForm;
這一點(diǎn)在Delphi中是極為重要的。讓我們來看一下應(yīng)用程序調(diào)用事件處理過程的過程,下面是一個(gè)按鈕部件的OnClick事件處理過程:
procedure TForm1.Button1Click(Sender:TObject);
begin
end;
您可以看到TObject類在Delphi的Visual Component Library的頂部,這就意味著所有的Delphi對(duì)象都是TObject的后代。因?yàn)镾ender是TObject類型,所以任何對(duì)象都可以賦值給它。雖然您沒有看見賦值的程序代碼,但事實(shí)上發(fā)生事件的部件或控制部件已經(jīng)賦給Sender了,這就是說Sender的值是響應(yīng)發(fā)生事件的部件或控制部件的。
您可以使用保留字is來測(cè)試Sender以便找到調(diào)用這個(gè)事件處理過程的部件或控制部件的類型。Delphi中的一個(gè)顯示drag-and-drop的DRAGDROP.DPR工程。加載它,可以查閱到DROPFONT.PAS庫(kù)單元的代碼,在Memo1DragOver方法中檢查了一個(gè)對(duì)象變量的類型。在這種情形下,參數(shù)是Source而不是Sender。
procrdure TForm1.Memo1DragOver(SenderSource:TObject;X,Y:integer;
State:TDragState;var Accept:Boolean);
begin
Accept :=Source is TLabel;
end;
Source參數(shù)也是TObject類型,Source被賦值為那個(gè)被拖曳的對(duì)象。用Memo1DragOver方法的目的是確保只有標(biāo)簽可以被拖曳。Accept是布爾型參數(shù),如果Accept為True,那么用戶選擇的部件可以被拖曳;反之當(dāng)Accept的值為False時(shí),用戶就不可以拖曳選擇控制部件。is保留字檢查Source是否TLabel的類型,所以Accept只有在用戶拖曳一個(gè)標(biāo)簽時(shí)才為真,并作為變參輸出到函數(shù)之外。
下面的drag-and-drop展示的Memo1DragDrop事件處理過程中也使用了Source參數(shù)。這個(gè)方法是為了把Memo部件的字型改變成和放入這個(gè)備注控制部件的標(biāo)簽一樣的字型:
procedure TForm1.Memo1DragDrop(SenderSource:TObject;
X,Y:Integer);
begin
Memo1.Font := (Source as TLabel).Font;
end;
當(dāng)您在這個(gè)事件處理過程中編寫賦值語句時(shí),開發(fā)人員并不知道用戶會(huì)放入哪一個(gè)標(biāo)簽,只有通過參考這個(gè)標(biāo)簽的名稱(Source as TLabel)用戶才能知道,并把標(biāo)簽類型賦給Memo1.TFont。Source包含了用戶拖放控制部件的名稱,只有當(dāng)Source是一個(gè)標(biāo)簽時(shí),這個(gè)事件處理過程才允許這個(gè)賦值發(fā)生。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |