⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 047.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<p> </p>
<p>var</p>
<p>Forml: TForml; </p>
<p> </p>
<p>implementation</p>
<p> </p>
<p>{$R *.DFM }</p>
<p> </p>
<p>procedure TForml.FormCreate ( Sender: TObject ) ;</p>
<p>begin</p>
<p>NewComponent := TNewComponent.Create ( Self );</p>
<p>NewCompanent.Parent := Self;</p>
<p>NewCompanent.Left := 12;</p>
<p>end;</p>
<p> </p>
<p>end.</p>
<p> </p>
<p>19.2.1.5 </font><font face="宋体" lang="ZH-CN" size="3">编写部件的面向对象技术</p>
<p> </p>
<p>  部件使用者在</font><font face="Arial" size="3">Delphi</font><font
face="宋体" lang="ZH-CN" size="3">环境中开发,将遇到在包含数据和方法的对象。他们将在设计阶段和运行阶段操作对象,而编写部件将比他们需要更多的关于对象的知识,因此,你应当熟悉</font><font
face="Arial" size="3">Delphi</font><font face="宋体" lang="ZH-CN" size="3">的面向对象的程序设计。</p>
<p>  </font><font face="Arial" size="3">1. </font><font face="宋体" lang="ZH-CN"
size="3">建立部件</p>
<p>  部件用户和部件编写者最基本的区别是用户处理对象的实例,而编写者创建新的对象类型。这个概念是面向对象程序设计的基础。例如,用户创建了一个包含两个按钮的窗体,一个标为</font><font
face="Arial" size="3">OK</font><font face="宋体" lang="ZH-CN" size="3">,另一个标为</font><font
face="Arial" size="3">Cancel</font><font face="宋体" lang="ZH-CN" size="3">,每个都是</font><font
face="Arial" size="3">TButton</font><font face="宋体" lang="ZH-CN" size="3">的实例,通过给</font><font
face="Arial" size="3">Text</font><font face="宋体" lang="ZH-CN" size="3">、</font><font
face="Arial" size="3">default</font><font face="宋体" lang="ZH-CN" size="3">和</font><font
face="Arial" size="3">Cancel</font><font face="宋体" lang="ZH-CN" size="3">等属性赋不同的值,给</font><font
face="Arial" size="3">OnClick</font><font face="宋体" lang="ZH-CN" size="3">事件赋予不同的处理过程,用户产生了两个不同的实例。</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3">建立新部件一般有两个理由</p>
<p> </font><font face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN" size="3">●</font><font
face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN" size="3">改变类型的缺省情况,避免反复</p>
<p> </font><font face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN" size="3">●</font><font
face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN" size="3">为部件增加新的功能</p>
<p> </p>
<p>  目的都是为了建立可重用对象。如果从将来重用的角度预先计划和设计,能节省一大堆将来的工作。</p>
<p>  在程序设计中,避免不必要的重复是很重要的。如果发现在代码中一遍又一遍重写相同的行,就应当考虑将代码放在子过程或函数中,或干脆建立一个函数库。</p>
<p>  设计部件也是这个道理,如果总是改变相同的属性或相同的方法调用,那应创建新部件。</p>
<p>  创建新部件的另一个原因是想给已有的部件增加新的功能。你可以从已有部件直接继承(如</font><font
face="Arial" size="3">ListBox</font><font face="宋体" lang="ZH-CN" size="3">)或从抽象对象类型继承(如</font><font
face="Arial" size="3">TComponent</font><font face="宋体" lang="ZH-CN" size="3">,</font><font
face="Arial" size="3">TControl</font><font face="宋体" lang="ZH-CN" size="3">)。你虽然能为部件增加新功能,但不能将原有部件的属性移走,如果要这样做的话,就从该父对象的祖先对象继承。</p>
<p>  </font><font face="Arial" size="3">2. </font><font face="宋体" lang="ZH-CN"
size="3">控制部件的访向</p>
<p>  </font><font face="Arial" size="3">Object Pascal</font><font face="宋体"
lang="ZH-CN" size="3">语言为对象的各部分提供了四个级别的访问控制。访问控制让你定义什么代码能访问对象的哪一部分。通过描述访问级别,定义了部件的接口。如果合理安排接口,将提高部件的可用性和重用性。</p>
<p>  除非特地描述,否则加在对象里的域、方法和属性的控制级别是</font><font
face="Arial" size="3">published</font><font face="宋体" lang="ZH-CN" size="3">,这意味着任何代码可以访问整个对象。</p>
<p>  下表列出各保护级别:</p>
<p> </p>
<p> </font><font face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3">表</font><font face="Arial" size="3">19.2
</font><font face="宋体" lang="ZH-CN" size="3">对象定义中的保护级别</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> </font><font face="Arial" size="3">
</font><font face="宋体" lang="ZH-CN" size="3">━━━━━━━━━━━━━━━━━━━</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> 保护级      </font><font
face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN" size="3">用处</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3">  </font><font face="Arial"
size="3"> </font><font face="宋体" lang="ZH-CN" size="3">───────────────────</font><font
face="Arial" size="3"></p>
<p>private </font><font face="宋体" lang="ZH-CN" size="3">隐藏实现细节</font><font
face="Arial" size="3"></p>
<p>protected</font><font face="宋体" lang="ZH-CN" size="3">    </font><font
face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN" size="3">定义开发者接口</font><font
face="Arial" size="3"></p>
<p>public </font><font face="宋体" lang="ZH-CN" size="3">定义运行时接口</font><font
face="Arial" size="3"></p>
<p>published </font><font face="宋体" lang="ZH-CN" size="3">定义设计时接口</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> </font><font face="Arial" size="3">
</font><font face="宋体" lang="ZH-CN" size="3">━━━━━━━━━━━━━━━━━━━</p>
<p> </font><font face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3">所有的保护级都在单元级起作用。如果对象的某一部分在库单元中的一处可访向,则在该库单元任意处都可访向。</p>
<p>  ⑴</font><font face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN"
size="3">隐藏实现细节</p>
<p>  如果对象的某部分被声明为</font><font face="Arial" size="3">private</font><font
face="宋体" lang="ZH-CN" size="3">,将使其它库单元的代码无法访问该部分,但包含声明的库单元中的代码可以访问,就好象访问</font><font
face="Arial" size="3">public</font><font face="宋体" lang="ZH-CN" size="3">一样,这是和</font><font
face="Arial" size="3">C++</font><font face="宋体" lang="ZH-CN" size="3">不同的。</p>
<p>  对象类型的</font><font face="Arial" size="3">private</font><font
face="宋体" lang="ZH-CN" size="3">部分对于隐藏详细实现是很重要的。既然对象的用户不能访问,</font><font
face="Arial" size="3">private</font><font face="宋体" lang="ZH-CN" size="3">部分,你就能改变对象的实现而不影响用户代码。</p>
<p>  下面是一个演示防止用户访问</font><font face="Arial" size="3">private</font><font
face="宋体" lang="ZH-CN" size="3">域的例子:</p>
<p> </font><font face="Arial" size="3"></p>
<p>unit HideInfo;</p>
<p> </p>
<p>interface</p>
<p> </p>
<p>uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, </p>
<p>Dialogs;</p>
<p> </p>
<p>type</p>
<p>TSecretForm = class(TForm) { </font><font face="宋体" lang="ZH-CN" size="3">声明新的窗体窗口</font><font
face="Arial" size="3"> }</p>
<p>procedure FormCreate(Sender: TObject);</p>
<p>private { declare private part }</p>
<p>FSecretCode: Integer; { </font><font face="宋体" lang="ZH-CN" size="3">声明</font><font
face="Arial" size="3">private</font><font face="宋体" lang="ZH-CN" size="3">域</font><font
face="Arial" size="3"> }</p>
<p>end;</p>
<p> </p>
<p>var</p>
<p>SecretForm: TSecretForm;</p>
<p> </p>
<p>implementation</p>
<p> </p>
<p>procedure TSecretForm.FormCreate(Sender: TObject);</p>
<p>begin</p>
<p>FSecretCode := 42; </p>
<p>end;</p>
<p> </p>
<p>end. </p>
<p> </p>
<p>unit TestHide; { </font><font face="宋体" lang="ZH-CN" size="3">这是主窗体库单元</font><font
face="Arial" size="3"> }</p>
<p> </p>
<p>interface</p>
<p> </p>
<p>uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms,</p>
<p>Dialogs, HideInfo; { </font><font face="宋体" lang="ZH-CN" size="3">使用带</font><font
face="Arial" size="3">TSecretForm</font><font face="宋体" lang="ZH-CN" size="3">声明的库单元</font><font
face="Arial" size="3"> }</p>
<p>type</p>
<p>TTestForm = class(TForm)</p>
<p>procedure FormCreate(Sender: TObject);</p>
<p>end;</p>
<p> </p>
<p>var</p>
<p>TestForm: TTestForm;</p>
<p> </p>
<p>implementation</p>
<p> </p>
<p>procedure TTestForm.FormCreate(Sender: TObject);</p>
<p>begin</p>
<p>SecretForm.FSecretCode := 13; {</font><font face="宋体" lang="ZH-CN" size="3">编译过程将以</font><font
face="Arial" size="3">&quot;Field identifier expected&quot;</font><font face="宋体"
lang="ZH-CN" size="3">错误停止}</font><font face="Arial" size="3"></p>
<p>end;</p>
<p> </p>
<p>end. </p>
<p> </font><font face="宋体" lang="ZH-CN" size="3"></p>
<p>  ⑵</font><font face="Arial" size="3"> </font><font face="宋体" lang="ZH-CN"
size="3">定义开发者接口</p>
<p>  将对象某部分声明为</font><font face="Arial" size="3">protected</font><font
face="宋体" lang="ZH-CN" size="3">,可使在包含该部件声明的库单元之外的代码无法访问,就象</font><font
face="Arial" size="3">private</font><font face="宋体" lang="ZH-CN" size="3">部分。</font><font
face="Arial" size="3">protected</font><font face="宋体" lang="ZH-CN" size="3">部分的不同之处是,某对象继承该对象,则包含新对象的库单元可以访问</font><font

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -