按需要给部件的其它属性赋值
假设你想测试名为TNewComponent类型的新部件库单元名为NewTest窗体库单元应该是这样的
unit Unitl;
interface
uses SysUtils Windows Messages Classes Grophics Controls Forms Dialogs
Newtest;
type
Tforml = class(TForm)
procedure FormCreate(Sender: TObject)
private
{ private申 明 }
public
{ public申 明 }
NewComponent: TNewComponent;
end;
var
Forml: TForml;
implementation
{$R *DFM }
procedure TFormlFormCreate ( Sender: TObject ) ;
begin
NewComponent := TNewComponentCreate ( Self )
NewCompanentParent := Self;
NewCompanentLeft := ;
end;
end
编写部件的面向对象技术
部件使用者在Delphi环境中开发将遇到在包含数据和方法的对象他们将在设计阶段和运行阶段操作对象而编写部件将比他们需要更多的关于对象的知识因此你应当熟悉Delphi的面向对象的程序设计
建立部件
部件用户和部件编写者最基本的区别是用户处理对象的实例而编写者创建新的对象类型这个概念是面向对象程序设计的基础例如用户创建了一个包含两个按钮的窗体一个标为OK另一个标为Cancel每个都是TButton的实例通过给Textdefault和Cancel等属性赋不同的值给OnClick事件赋予不同的处理过程用户产生了两个不同的实例
建立新部件一般有两个理由
● 改变类型的缺省情况避免反复
● 为部件增加新的功能
目的都是为了建立可重用对象如果从将来重用的角度预先计划和设计能节省一大堆将来的工作
在程序设计中避免不必要的重复是很重要的如果发现在代码中一遍又一遍重写相同的行就应当考虑将代码放在子过程或函数中或干脆建立一个函数库
设计部件也是这个道理如果总是改变相同的属性或相同的方法调用那应创建新部件
创建新部件的另一个原因是想给已有的部件增加新的功能你可以从已有部件直接继承(如ListBox)或从抽象对象类型继承(如TComponentTControl)你虽然能为部件增加新功能但不能将原有部件的属性移走如果要这样做的话就从该父对象的祖先对象继承
控制部件的访向
Object Pascal语言为对象的各部分提供了四个级别的访问控制访问控制让你定义什么代码能访问对象的哪一部分通过描述访问级别定义了部件的接口如果合理安排接口将提高部件的可用性和重用性
除非特地描述否则加在对象里的域方法和属性的控制级别是published这意味着任何代码可以访问整个对象
下表列出各保护级别
表 对象定义中的保护级别
━━━━━━━━━━━━━━━━━━━
保护级 用处
───────────────────
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 FormCreate(Sender: TObject)
private { declare private part }
FSecretCode: Integer; { 声明private域 }
end;
var
SecretForm: TSecretForm;
implementation
procedure TSecretFormFormCreate(Sender: TObject)
begin
FSecretCode := ;
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 TTestFormFormCreate(Sender: TObject)
begin
SecretFormFSecretCode := ; {编译过程将以Field identifier expected错误停止}
end;
end
⑵ 定义开发者接口
将对象某部分声明为protected可使在包含该部件声明的库单元之外的代码无法访问就象private部分protected部分的不同之处是某对象继承该对象则包含新对象的库单元可以访问protected部分你能使用protected声明定义开发者的接口也就是说对象的用户不能访向protected部分但开发者通过继承就可能做到这意味着你能通过protected部分的可访问性使部件编写者改变对象工作方式而又不使用户见到这些细节
⑶ 定义运行时接口
将对象的某一部分定义为public可使任何代码访问该部分如果你没有对域方法或属性加以privateprotectedpublic的访问控制描述那么该部分就是published
因为对象的public部分可在运行时为任何代码访问因此对象的public部分被称为运行接口运行时接口对那些在设计时没有意义的项目如依靠运行时信息的和只读的属性是很有用的那些设计用来供用户调用的方法也应放在运行时接口中
[] [] [] []