?? 009.htm
字號(hào):
<p>DataGrid1:TDataGrid;</p>
<p>Database1:TDatabase;</p>
<p>TableSet1:TTableSet;</p>
<p>VisibleSession1:TVisibleSession;</p>
<p>private</p>
<p>{<font face="宋體" lang="ZH-CN">私有域說(shuō)明}</font></p>
<p>public</p>
<p>{<font face="宋體" lang="ZH-CN">公有域說(shuō)明}</font> </p>
<p>end; </p>
<p>var</p>
<p>AForm:TForm;</p>
<p>DataForm:TDataForm;</p>
<p><font face="宋體" lang="ZH-CN"> 因?yàn)?lt;/font>TDataForm<font
face="宋體" lang="ZH-CN">是</font>TForm<font face="宋體" lang="ZH-CN">類型的后代,所以</font>Dataform<font
face="宋體" lang="ZH-CN">是</font>AForm<font face="宋體" lang="ZH-CN">的后代,因此下面的賦值語(yǔ)句是合法的:</font></p>
<p>AForm :=DataForm;</p>
<p><font face="宋體" lang="ZH-CN">
這一點(diǎn)在</font>Delphi<font face="宋體"
lang="ZH-CN">中是極為重要的。讓我們來(lái)看一下應(yīng)用程序調(diào)用事件處理過(guò)程的過(guò)程,下面是一個(gè)按鈕部件的</font>OnClick<font
face="宋體" lang="ZH-CN">事件處理過(guò)程:</font></p>
<p>procedure TForm1.Button1Click(Sender:TObject);</p>
<p>begin</p>
<p>end;</p>
<p><font face="宋體" lang="ZH-CN">
您可以看到</font>TObject<font
face="宋體" lang="ZH-CN">類在</font>Delphi<font face="宋體" lang="ZH-CN">的</font>Visual
Component Library<font face="宋體" lang="ZH-CN">的頂部,這就意味著所有的</font>Delphi<font
face="宋體" lang="ZH-CN">對(duì)象都是</font>TObject<font face="宋體" lang="ZH-CN">的后代。因?yàn)?lt;/font>Sender<font
face="宋體" lang="ZH-CN">是</font>TObject<font face="宋體" lang="ZH-CN">類型,所以任何對(duì)象都可以賦值給它。雖然您沒(méi)有看見(jiàn)賦值的程序代碼,但事實(shí)上發(fā)生事件的部件或控制部件已經(jīng)賦給</font>Sender<font
face="宋體" lang="ZH-CN">了,這就是說(shuō)</font>Sender<font face="宋體" lang="ZH-CN">的值是響應(yīng)發(fā)生事件的部件或控制部件的。</font></p>
<p><font face="宋體" lang="ZH-CN">
您可以使用保留字</font>is<font face="宋體"
lang="ZH-CN">來(lái)測(cè)試</font>Sender<font face="宋體" lang="ZH-CN">以便找到調(diào)用這個(gè)事件處理過(guò)程的部件或控制部件的類型。</font>Delphi<font
face="宋體" lang="ZH-CN">中的一個(gè)顯示</font>drag-and-drop<font face="宋體"
lang="ZH-CN">的</font>DRAGDROP.DPR<font face="宋體" lang="ZH-CN">工程。加載它,可以查閱到</font>DROPFONT.PAS<font
face="宋體" lang="ZH-CN">庫(kù)單元的代碼,在</font>Memo1DragOver<font face="宋體"
lang="ZH-CN">方法中檢查了一個(gè)對(duì)象變量的類型。在這種情形下,參數(shù)是</font>Source<font
face="宋體" lang="ZH-CN">而不是</font>Sender<font face="宋體" lang="ZH-CN">。 </p>
</font><p>procrdure TForm1.Memo1DragOver(SenderSource:TObject;X,Y:integer;</p>
<p>State:TDragState;var Accept:Boolean);</p>
<p>begin</p>
<p>Accept :=Source is TLabel;</p>
<p>end; </p>
<p> Source<font face="宋體" lang="ZH-CN">參數(shù)也是</font>TObject<font
face="宋體" lang="ZH-CN">類型,</font>Source<font face="宋體" lang="ZH-CN">被賦值為那個(gè)被拖曳的對(duì)象。用</font>Memo1DragOver<font
face="宋體" lang="ZH-CN">方法的目的是確保只有標(biāo)簽可以被拖曳。</font>Accept<font
face="宋體" lang="ZH-CN">是布爾型參數(shù),如果</font>Accept<font face="宋體"
lang="ZH-CN">為</font>True<font face="宋體" lang="ZH-CN">,那么用戶選擇的部件可以被拖曳;反之當(dāng)</font>Accept<font
face="宋體" lang="ZH-CN">的值為</font>False<font face="宋體" lang="ZH-CN">時(shí),用戶就不可以拖曳選擇控制部件。</font>is<font
face="宋體" lang="ZH-CN">保留字檢查</font>Source<font face="宋體" lang="ZH-CN">是否</font>TLabel<font
face="宋體" lang="ZH-CN">的類型,所以</font>Accept<font face="宋體" lang="ZH-CN">只有在用戶拖曳一個(gè)標(biāo)簽時(shí)才為真,并作為變參輸出到函數(shù)之外。</font></p>
<p><font face="宋體" lang="ZH-CN">下面的</font>drag-and-drop<font face="宋體"
lang="ZH-CN">展示的</font>Memo1DragDrop<font face="宋體" lang="ZH-CN">事件處理過(guò)程中也使用了</font>Source<font
face="宋體" lang="ZH-CN">參數(shù)。這個(gè)方法是為了把</font>Memo<font face="宋體"
lang="ZH-CN">部件的字型改變成和放入這個(gè)備注控制部件的標(biāo)簽一樣的字型: </p>
</font><p>procedure TForm1.Memo1DragDrop(SenderSource:TObject;</p>
<p>X,Y:Integer);</p>
<p>begin</p>
<p>Memo1.Font := (Source as TLabel).Font; </p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">
當(dāng)您在這個(gè)事件處理過(guò)程中編寫(xiě)賦值語(yǔ)句時(shí),開(kāi)發(fā)人員并不知道用戶會(huì)放入哪一個(gè)標(biāo)簽,只有通過(guò)參考這個(gè)標(biāo)簽的名稱</font>(Source
as TLabel)<font face="宋體" lang="ZH-CN">用戶才能知道,并把標(biāo)簽類型賦給</font>Memo1.TFont<font
face="宋體" lang="ZH-CN">。</font>Source<font face="宋體" lang="ZH-CN">包含了用戶拖放控制部件的名稱,只有當(dāng)</font>Source<font
face="宋體" lang="ZH-CN">是一個(gè)標(biāo)簽時(shí),這個(gè)事件處理過(guò)程才允許這個(gè)賦值發(fā)生。</p>
<p>2.2.7 建立非可視化對(duì)象 </p>
</font><p><font face="宋體" lang="ZH-CN">
您在</font>Delphi<font face="宋體"
lang="ZH-CN">中使用的大部分對(duì)象都是您在設(shè)計(jì)和運(yùn)行期間可以看見(jiàn)的部件,例如編輯框、按鈕等;一些部件,如通用對(duì)話框</font>(Common
dialog box)<font face="宋體" lang="ZH-CN">等,在設(shè)計(jì)時(shí)看不見(jiàn),而在運(yùn)行時(shí)可以看見(jiàn);另外有些部件,例如計(jì)時(shí)器</font>(Timer)<font
face="宋體" lang="ZH-CN">、數(shù)據(jù)源</font>(Data Source)<font face="宋體"
lang="ZH-CN">部件等,在程序的運(yùn)行期間沒(méi)有任何可視化的顯示,但您卻可以在您的應(yīng)用程序中使用它們。 </p>
</font><p>2.2.7.1<font face="宋體" lang="ZH-CN">說(shuō)明一個(gè)非可視化對(duì)象 </p>
</font><p><font face="宋體" lang="ZH-CN">
下面,通過(guò)一個(gè)簡(jiǎn)單的例子講述如何建立自己的非可視化對(duì)象:</font></p>
<p><font face="宋體" lang="ZH-CN">
您可以用如下的方法,建立一個(gè)自己的</font>TEmployee<font
face="宋體" lang="ZH-CN">非可視化對(duì)象: </p>
</font><p>type </p>
<p>Temployee = class(TObject);</p>
<p>Name := String[25];</p>
<p>Title := String[25];</p>
<p>HourlyPayRate : Double;</p>
<p>function CalculatePayAmount:Double;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">
在這種情況下,</font>TEmployee<font
face="宋體" lang="ZH-CN">從</font>TObject<font face="宋體" lang="ZH-CN">繼承下來(lái),且包含三個(gè)域和一個(gè)方法。把您建立的類型說(shuō)明放在庫(kù)單元中的說(shuō)明部分,并和窗體說(shuō)明放在一起。在這個(gè)程序庫(kù)單元的變量說(shuō)明部分,說(shuō)明一個(gè)新類型的變量: </p>
</font><p>var</p>
<p>Employee : TEmployee; </p>
<p>2.2.7.2<font face="宋體" lang="ZH-CN">用</font>Create<font face="宋體"
lang="ZH-CN">方法建立對(duì)象實(shí)例 </p>
</font><p> TEmployee<font face="宋體"
lang="ZH-CN">只是一個(gè)對(duì)象類型。除非通過(guò)一個(gè)構(gòu)造函數(shù)的調(diào)用從而被實(shí)例取代或創(chuàng)建,否則一個(gè)對(duì)象并不存儲(chǔ)在內(nèi)存中。構(gòu)造函數(shù)是一個(gè)方法,它為新對(duì)象配置內(nèi)存并且指向這個(gè)新的對(duì)象。這個(gè)新的對(duì)象也被稱為這個(gè)對(duì)象類型的一個(gè)實(shí)例。</font></p>
<p><font face="宋體" lang="ZH-CN">
建立一個(gè)對(duì)象的實(shí)例,需要調(diào)用</font>Create<font
face="宋體" lang="ZH-CN">方法,然后構(gòu)造函數(shù)把這個(gè)實(shí)例賦給一個(gè)變量。如果您想說(shuō)明一個(gè)</font>TEmployee<font
face="宋體" lang="ZH-CN">類型的實(shí)例,在您訪問(wèn)這個(gè)對(duì)象的任何域之前,您的程序代碼必須調(diào)用</font>Create<font
face="宋體" lang="ZH-CN">。</p>
</font><p>Employee := TEmployee.Create; </p>
<p> Create<font face="宋體" lang="ZH-CN">方法并沒(méi)有在</font>TEmployee<font
face="宋體" lang="ZH-CN">類型中說(shuō)明,它繼承自</font>TObject<font face="宋體"
lang="ZH-CN">類型。因?yàn)?lt;/font>TEmployee<font face="宋體" lang="ZH-CN">是</font>TObject<font
face="宋體" lang="ZH-CN">的子類,所以它可以調(diào)用</font>Create<font
face="宋體" lang="ZH-CN">方法而創(chuàng)建一個(gè)</font>TEmployee<font face="宋體"
lang="ZH-CN">實(shí)例。然后把它賦給</font>Employee<font face="宋體" lang="ZH-CN">變量。在創(chuàng)建了一個(gè)這樣的對(duì)象后,您就可以象使用其他的</font>Delphi<font
face="宋體" lang="ZH-CN">對(duì)象一樣訪問(wèn)</font>Employee<font face="宋體"
lang="ZH-CN">對(duì)象了。 </p>
</font><p>2.2.7.3 <font face="宋體" lang="ZH-CN">撤銷對(duì)象 </p>
</font><p><font face="宋體" lang="ZH-CN">
當(dāng)您使用完對(duì)象后,您應(yīng)該及時(shí)撤銷它,以便把這個(gè)對(duì)象占用的內(nèi)存釋放出來(lái)。您可以通過(guò)調(diào)用一個(gè)注銷方法來(lái)撤銷您的對(duì)象,它會(huì)釋放分配給這個(gè)對(duì)象的內(nèi)存。</font></p>
<p> Delphi<font face="宋體" lang="ZH-CN">的注銷方法有兩個(gè):</font>Destroy<font
face="宋體" lang="ZH-CN">和</font>Free<font face="宋體" lang="ZH-CN">。</font>Delphi<font
face="宋體" lang="ZH-CN">建議使用</font>Free<font face="宋體" lang="ZH-CN">,因?yàn)樗?lt;/font>Destroy<font
face="宋體" lang="ZH-CN">更為安全,同時(shí)調(diào)用</font>Free<font face="宋體"
lang="ZH-CN">會(huì)生成效率更高的代碼。</font></p>
<p><font face="宋體" lang="ZH-CN">
您可以用下列的語(yǔ)句釋放用完的</font>Employee<font
face="宋體" lang="ZH-CN">對(duì)象: </p>
</font><p>Employee.Free; </p>
<p><font face="宋體" lang="ZH-CN"> 和</font>Create<font
face="宋體" lang="ZH-CN">方法一樣,</font>Free<font face="宋體" lang="ZH-CN">方法也是</font>TEmployee<font
face="宋體" lang="ZH-CN">從</font>TObject<font face="宋體" lang="ZH-CN">中繼承過(guò)來(lái)的。把您的注銷放在</font>try<font
face="宋體" lang="ZH-CN">…</font>finally<font face="宋體" lang="ZH-CN">程序模塊的</font>finally<font
face="宋體" lang="ZH-CN">部分,而把對(duì)象的程序代碼放在</font>try<font
face="宋體" lang="ZH-CN">部分是編程的好習(xí)慣。這樣,即使您的程序代碼在使用對(duì)象時(shí)發(fā)生了異常事件,也會(huì)確保您為這個(gè)對(duì)象分配的內(nèi)存會(huì)被釋放。關(guān)于異常處理和</font>try<font
face="宋體" lang="ZH-CN">…</font>finally<font face="宋體" lang="ZH-CN">程序模塊的信息以及建立非可視化對(duì)象的例子,在后文中還將仔細(xì)講述。</font></p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="010.htm"><FONT style="FONT-SIZE: 9pt">后一頁(yè)</font></A><BR>
<A HREF="008.htm"><FONT style="FONT-SIZE: 9pt">前一頁(yè)</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁(yè)</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -