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

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

編輯:Delphi

當您使用Object Inspector來改變對象(部件)的名稱時,這個名稱的改變會反映到程序中。例如,在Object Inspector中將Form1的Name屬性命名為ColorBox,您會發現在類型說明部分,會將前文的TForm1改為: 

TColorBox=class(TForm); 

並且在變量說明部分,會說明ColorBox為TColorBox類型的變量,由Delphi自動產生的事件處理過程名稱會自動改為TColorBox.Button1Click;但您自行編寫的實現部分的代碼卻不會被自動修改。因此,如果您在改變Name屬性前編寫了程序,則您必須將事件處理過程中的對象名稱進行改變。所以,原先的Form1.Color要改為ColorBox.Color。 

2.2.2 從一個對象中繼承數據和方法 

前面的TForm1類型是很簡單的,因為它只含有域Button1和方法Button1Click。但是在這個窗體上,您可以改變窗體的大小、加入或刪除窗體的最大最小化按鈕,或設置這個窗體為MDI界面。對於一個只包含一個域和方法的對象來講,您並沒有看到顯式的支持程序。在窗體上單擊鼠標或用Object Inspector的上端的Object Selector選中Form1對象,按動F1查閱它的在線幫助,您會在Properties和Method中找到它的繼承到的全部屬性和方法。這些是在TForm類型中說明的,TForm1是TForm的子類,直接繼承了它所有的域、方法、屬性和事件。例如窗體的顏色屬性Color就是在TForm中說明的。當您在工程中加入一個新窗體時,就等於加入了一個基本模型。通過不斷地在窗體中加入部件,您就自行定義了一個新的窗體。要自定義任何對象,您都將從已經存在的對象中繼承域和方法,建立一個該種對象的子類。例如對象TForm1就被說明為對象TForm的子類,擁有一個窗體部件的基本屬性或方法。只有當您在窗體中加入了部件或編寫了事件處理過程時,Form1才成為您自己的類型。

一個比較特殊的對象是從一個范圍較廣或較一般的對象中繼承下來的,它是這個特別對象的祖先,這個對象則稱為祖先的後代。一個對象只能有一個直接的祖先,但是它可以有許多後代。TForm是TForm1類型的祖先,所有的窗體對象都是TForm的後代。

用F1查閱窗體的在線幫助時,您會發現TForm被稱為component(部件)。這是因為所有的部件都是對象。

在這個結構中所有的部件都是對象。部件類型TComponent從TObject類型中繼承數據和程序代碼,並具有額外的可以用作特殊用途的屬性、方法、事件,所以部件可以直接和用戶打交道,記錄它的狀態並存貯到文件中等等。控制類型TControl從TComponent中繼承而來,又增加了新的功能,如它可以顯示一個對象。在上圖中,雖然TCheckBox不是直接由TObject繼承來的,但是它仍然有任何對象所擁有的屬性,因為在VCL結構中,TCheckBox終究還是從TObject 中繼承了所有功能的特殊對象,但它還有些自行定義的獨到的功能,如可以選擇記錄狀態等。 

2.2.3 對象的范圍 

2.2.3.1 關於對象的范圍 

一個對象的范圍決定了它的數據域、屬性值、方法的活動范圍和訪問范圍。在一個對象的說明部分說明的數據域、屬性值、方法都只是在這個對象的范圍中,而且只有這個對象和它的後代才能擁有它們。雖然這些方法的實際程序代碼可能是在這個對象之外的程序庫單元中,但這些方法仍然在這個對象的范圍內,因為它們是在這個對象的說明部分中說明的。

當您在一個對象的事件處理過程中編寫程序代碼來訪問這個對象的屬性值、方法或域時,您不需要在這些標識符之前加上這個對象變量的名稱。例如,如果您在一個新窗體上加入一個按鈕和一個編輯框,並為這個按鈕編寫OnClick事件處理過程: 

procedure TForm1.Button1Click(Sender:Tobject);

begin

Color :=clFuchsia;

Edit1.Color :=clLime;

end;  

其中的第一行語句是為整個窗體Form1著色。您也可以編寫如下:

Form1.Color :=clFuchsia; 

但您可以不必加上Form1.,因為Button1Click方法是在TForm1對象的范圍裡。當您在一個對象的范圍中時,您可以省略所有這個對象中的屬性值、方法、域之前的對象標識符。但是當您編寫第二個語句改變編輯框的底色時,因為此時您想訪問的是TEdit1對象的Color屬性,而不是TForm1類型的,所以您需要通過在屬性前面加上編輯框的名稱來指明Color屬性值的范圍。如果不指明,Delphi會象第一個語句一樣,將窗體的顏色變成綠色。因為Edit1部件是在窗體中的,它是窗體的一個數據域,所以您同樣不必指明其從屬關系。

如果Edit1是在其他窗體中,那麼您需要在編輯框之前加上這個船體對象的名稱了。例如,如果Edit1是在Form2之中,那它是Form2說明的一個數據域,並位於Form2的范圍中,那麼您需要將第二句改為: 

Form2.Edit1.Color := clLime; 

而且需要把Unit2加入Unit1的uses子句中。

一個對象的范圍擴展到這個對象的所有後代。TForm的所有屬性值、方法和事件都在TForm1的范圍中,因為TForm1是TForm的後代。您的應用程序不能說明和祖先的數據域重名的類型、變量等。如果Delphi顯示了一個標識符被重復定義的信息,就有可能是一個數據域和其祖先對象(例如TForm)的一個數據域有了相同的名稱。可以嘗試改變這個標識符的名稱。 

2.2.3.2 重載一個方法 

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

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

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

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

2.2.5 訪問對象的域和方法 

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

Edit1.Text := 'Welcome to Delphi';

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

Edit1.ClearSelection; 

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

procedure TForm1.Button1Click(Sender:TObject);

begin

ListBox1.Clear;

ListBox1.MultiSelect :=True;

ListBox1.Item.Add('One');

ListBox1.Item.Add('Two');

ListBox1.Item.Add('Three');

ListBox1.Sorted :=Ture;

ListBox1.FontStyle :=[fsBold];

ListBox1.Font.Color :=clPurple;

ListBox1.Font.Name :='Times New Roman';

ListBox1.ScaleBy(125,100);

end; 

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

procedure TForm1.Button1Click(Sender:TObject);

begin

with (ListBox1) do

begin

Clear;

MultiSelect :=True;

Item.Add('One');

Item.Add('Two');

Item.Add('Three');

Sorted :=Ture;

FontStyle :=[fsBold];

Font.Color :=clPurple;

Font.Name :='Times New Roman';

ScaleBy(125,100);

end;

end; 

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

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