快捷搜索:  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;

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: