建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

永樂國際登錄網站樂在其中:第十九章Delphi自定義部件開發(一)(3)

?

19.2.1.5 編寫部件的面向工具技巧

部件應用者在Delphi情況中開拓,將碰到在包孕數據和措施的工具。他們將在設計階段和運行階段操作對象,而編寫部件將比他們必要更多的關于工具的常識,是以,你該當認識Delphi的面向工具的法度榜樣設計。

1. 建立部件

部件用戶和部件編寫者最基礎的差別是用戶處置懲罰工具的實例,而編寫者創建新的工具類型。這個觀點是面永樂國際登錄網站樂在其中向工具法度榜樣設計的根基。例如,用戶創建了一個包孕兩個按鈕的窗體,一個標為OK,另一個標為Cancel,每個都是TButton的實例,經由過程給Text、default和Cancel等屬性賦不合的值,給OnClick事故付與不合的處置懲罰歷程,用戶孕育發生了兩個不合的實例。

建立新部件一樣平常有兩個來由

● 改變類型的缺省環境,避免反復

● 為部件增添新的功能

目的都是為了建立可重用工具。假如從將來重永樂國際登錄網站樂在其中用的角度預先計劃和設計,能節省一大年夜堆將來的事情。

在法度榜樣設計中,避免不需要的重復是很緊張的。假如發明在代碼中一遍又一遍重寫相同的行,就該當斟酌將代碼放在子歷程或函數中,或干脆建立一個函數庫。

設計部件也是這個事理,假如老是改變相同的屬性或相同的措施調用,那應創建新部件。

創建新部件的另一個緣故原由是想給已有的部件增添新的功能。你可以從已有部件直接承襲(如ListBox)或從抽象工具類型承襲(如TComponent,TControl)。你雖然能為部件增添新功能,但不能將原有部件的屬性移走,假如要這樣做的話,就從該父工具的先人工具承襲。

2. 節制部件的訪向

Object Pascal說話為工具的各部分供給了四個級其余造訪節制。造訪節制讓你定義什么代碼能造訪工具的哪一部分永樂國際登錄網站樂在其中。經由過程描述造訪級別,定義了部件的接口。假如合理安排接口,將前進部件的可用性和重用性。

除非特地描述,否則加在工具里的域、措施和屬性的節制級別是published,這意味著任何代碼可以造訪全部工具。

下表列出各保護級別:

表19.2 工具定義中的保護級別

━━━━━━━━━━━━━━━━━━━

保護級 用場

───────────────────

private 暗藏實現細節

protected 定義開拓者接口

public 定義運行時接口

published 定義設計時接口

━━━━━━━━━━━━━━━━━━━

所有的保護級都在單元級起感化。假如工具的某一部分在庫單元中的一處可訪向,則在該庫單元隨意率性處都可訪向。

⑴ 暗藏實現細節

假如工具的某部分被聲明為private,將使其它庫單元的代碼無法造訪該部分,但包孕聲明的庫單元中的代碼可以造訪,就好象造訪public一樣,這是和C++不合的。

工具類型的private部分對付暗藏具體實現是很緊張的。既然工具的用戶不能造訪,private部分,你就能改變工具的實現而不影響用戶代碼。

下面是一個演示防止用戶造訪private域的例子:

unit HideInfo;

interface

uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms,

Dialogs;

type

TSecretForm = class(TForm) { 聲明新的窗體窗口 }

procedure F永樂國際登錄網站樂在其中ormCreate(Sender: TObject);

private { declare private part }

FSecretCode: Integer; { 聲明private域 }

end;

var

SecretForm: TSecretForm;

implementation

procedure TSecretForm.FormCreate(Sender: TObject);

begin

FSecretCode := 42;

end;

end.

unit TestHide; { 這是主窗體庫單元 }

interface

uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms,

Dialogs, HideInfo; { 應用帶TSecretForm聲明的庫單元 }

type

TTestForm = class(TForm)

procedure FormCreate(Sender: TObject);

end;

var

TestForm: TTestForm;

implementation

procedure TTestForm.FormCreate(Sender: TObject);

begin

SecretForm.FSecretCode := 13; {編譯歷程將以"Field identifier expected"差錯竣事}

end;

end.

⑵ 定義開拓者接口

將工具某部分聲明為protected,可使在包孕該部件聲明的庫單元之外的代碼無法造訪,就象private部分。protected部分的不合之處是,某工具承襲該工具,則包孕新工具的庫單元可以造訪protected部分,你能應用protected聲明定義開拓者的接口。也便是說。工具的用戶不能訪向protected部分,但開拓者經由過程承襲就可能做到,這意味著你能經由過程protected部分的可造訪性使部件編寫者改變工具事情要領,而又不應用戶見到這些細節。

⑶ 定義運行時接口

將工具的某一部分定義為public可使任何代碼造訪該部分。假如你沒有對域措施或屬性加以private、protected、public的造訪節制描述。那么該部分便是published。

由于工具的public部分可在運行時為任何代碼造訪,是以工具的public部分被稱為運行接口。運行時接口對那些在設計時沒故意義的項目,如寄托運行時信息的和只讀的屬性,是很有用的。那些設計用來供用戶調用的措施也應放在運行時接口中。

下例是一個顯示兩個定義在運行時接口的只讀屬性的例子:

type

T永樂國際登錄網站樂在其中SampleComponent = class(TComponent)

private

FTempCelsius: Integer; { 詳細實現是private }

function GetTempFahrenheit: Integer;

public

property TempCelsius: Integer read FTempCelsius; { 屬性是public }

property TempFahrenheit: Integer read GetTempFahrenheit;

end;

function GetTempFahrenheit: Integer;

begin

Result := FTempCelsius * 9 p 5 + 32;

end;

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
大富豪手机版官网 广东36选7 河北快3一定牛 7星彩18090开奖结果 u米彩票网站 福建快三讨论群 云南十一选五走势囹 紫金棋牌 球探篮球比分直播 河北快3中间值走势图