Delphi控件开发浅入深出(六)

news/2024/7/4 1:43:42 标签: delphi, 设计模式, interface, object, class, 任务
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

class="MsoNormal">六、控件手拉手――控件关联的实现

class="MsoNormal">控件的关联在Delphi中也是很常见的,我们可以设定一个控件的某个属性指向另一个控件。比如我们在窗体上放上Tedit,TpopupMenu两个控件,然后设定TeditPopupMenu属性为TpopupMenu控件,运行后在Tedit点击右键就会弹出刚才设定的那个TpopupMenu菜单,也就是说Tedit,TpopupMenu联手完成了任务。再比如TDBEdit控件的DataSource属性就可以指向一个TdataSource控件,这样就可以在TDBEdit控件中显示TdataSource输出的某个字段的值了。

class="MsoNormal">  下面我们将写一个简单的实现控件关联的控件。这个控件派生于Tedit,它可以与一个Tlabel控件关联,在控件的编辑框中输入文字时,与它关联的Tlabel控件的文字将随着它而变化。代码如下:

class="MsoNormal">unit MyEdit;

class="MsoNormal">class="tags" href="/tags/INTERFACE.html" title=interface>interface

class="MsoNormal">uses

class="MsoNormal">  SysUtils, Classes, Controls, StdCtrls;

class="MsoNormal">type

class="MsoNormal">  TMyEdit = class(TEdit)

class="MsoNormal">  private

class="MsoNormal">    FLinkLabel: TLabel;

class="MsoNormal">    procedure FSetLinkLabel(AValue: TLabel);

class="MsoNormal">  protected

class="MsoNormal">    procedure Notification(AComponent: TComponent;Operation: TOperation);

class="MsoNormal">          override;

class="MsoNormal">    procedure Change;override;

class="MsoNormal">  public

class="MsoNormal">  published

class="MsoNormal">    property LinkLabel: TLabel read FLinkLabel write FSetLinkLabel;

class="MsoNormal">  end;

class="MsoNormal"> 

class="MsoNormal">procedure Register;

class="MsoNormal"> 

class="MsoNormal">implementation

class="MsoNormal">procedure Register;

class="MsoNormal">begin

class="MsoNormal">  RegisterComponents('Linco', [TMyEdit]);

class="MsoNormal">end;

class="MsoNormal">procedure TMyEdit.Change;

class="MsoNormal">begin

class="MsoNormal">  inherited;

class="MsoNormal">  if LinkLabel <> nil then

class="MsoNormal">    LinkLabel.Caption := Text;

class="MsoNormal">end;

class="MsoNormal"> 

class="MsoNormal">procedure TMyEdit.FSetLinkLabel(AValue: TLabel);

class="MsoNormal">begin

class="MsoNormal">  FLinkLabel := AValue;

class="MsoNormal">  if AValue <> nil then

class="MsoNormal">    FLinkLabel.FreeNotification(self);

class="MsoNormal">end;

class="MsoNormal"> 

class="MsoNormal">procedure TMyEdit.Notification(AComponent: TComponent;

class="MsoNormal">  Operation: TOperation);

class="MsoNormal">begin

class="MsoNormal">  inherited;

class="MsoNormal">  if (Operation = opRemove) and (AComponent = LinkLabel) then

class="MsoNormal">    LinkLabel := nil;

class="MsoNormal">end;

class="MsoNormal">end.

class="MsoNormal">代码解释:

class="MsoNormal">1)、我们只要将控件的任意一个属性的类型设定为另外一个控件的类名称,那么我们就可以在控件的Object Inspector中将这个属性指向那个控件(或那个控件的派生控件)的一个实例。比如本例中我们增加了LinkLabel属性,它的类型为 Tlabel,所以我们就可以把LinkLabel属性指向一个标签控件。

class="MsoNormal">2)、请注意FsetLinkLabel中的这段代码:

class="MsoNormal"> if AValue <> nil then

class="MsoNormal">FLinkLabel.FreeNotification(self);

class="MsoNormal">如果我们将控件关联属性指向了一个控件,可是后来又将被指向的控件删除了,那么我们的控件关联属性是不会自动删除的,这样就会造成控件关联属性指向的控件不存在的现象。我们必须自动感知被关联控件的删除并重新设定控件关联属性为不指向任何控件,这样就避免了错误的发生。

class="MsoNormal">FLinkLabel.FreeNotification(self);的作用就是这样的。它调用控件的FreeNotification方法(在Tcomponent中定义)向被指向的控件注册一个“消息”,当被指向控件被删除时,会向所有向他注册的控件发送一个它被删除的消息,此时向他注册的控件就会触发Notification方法,这样我们就可以自动感知被指向控件的状态了。这是class="tags" href="/tags/SheJiMoShi.html" title=设计模式>设计模式中Observer(观察者)模式的典型应用。

class="MsoNormal">既然向他注册的控件就会触发Notification方法,我们就覆盖父类的Notification方法,写出如下的代码:

class="MsoNormal">  if (Operation = opRemove) and (AComponent = LinkLabel) then

class="MsoNormal">    LinkLabel := nil;

class="MsoNormal">这句话的意思是:如果控件被删除并且被删除的控件(因为我们的控件可能向多个控件注册了消息)是LinkLabel,那么我们就设定LinkLabel属性不指向任何控件。

class="MsoNormal">3)覆盖父类的Change调度方法。在此方法里为连接的LinkLabelCaption赋值就达到我们的目的了。

class="MsoNormal">思考题:

class="MsoNormal">1、做一个Label控件,给它增加一个DataSource属性,该属性可以指向一个TdataSource类型的控件,它有一个GetRecordCount方法。当调用此方法时,就在Label控件中显示这个DataSource对应的数据集中的记录的条数。

 

http://www.niftyadmin.cn/n/1413622.html

相关文章

Xcode HeaderDoc 教程(2)

Code Snippets&#xff0c;让一切变得更简单:这真的非常easy&#xff0c;不是吗&#xff1f;但还能更简单一些吗&#xff1f;本站以前介绍过 code snippets。请看这里。Code snippets 在 Xcode 中扮演着无名英雄的角色。一个snippet 是一个能够重用的代码块&#xff08;存储在 …

Delphi控件开发浅入深出(五)

五、复合控件 复合控件是Delphi控件中非常重要的一种控件&#xff0c;复合控件就是将两个或两个以上的控件重新组合成一个新的控件。例如TspinEdit、TlabeledEdit、TDBNavigator等就是复合控件&#xff0c;TDBNavigator其实就是在一个Panel放上若干个Button而已。制作一个复合…

P4219 [BJOI2014]大融合

传送门 动态维护森林 显然考虑 $LCT$ 但是发现询问求的是子树大小&#xff0c;比较不好搞 维护 $sum[x]$ 表示节点 $x$ 的子树大小&#xff0c;$si[x]$ 表示 $x$ 的子树中虚儿子的子树大小和 那么 $pushup$ 可以这样写&#xff1a; inline void pushup(int x) { sum[x]sum[c[x]…

Delphi控件开发浅入深出(七)

对话框控件的制作 Delphi中有很多对话框组件&#xff0c;例如TopenDialog、TfontDialog等。这些控件的特点就是虽然是不可视控件&#xff0c;但是在运行时都有一个可视化的效果&#xff0c;比如TopenDialog的可视化效果就是一个打开对话框。我们这次将开发一个日期对话框控件&…

航母级app手机淘宝是如何炼成的丨独家解密

2019独角兽企业重金招聘Python工程师标准>>> 由左到右&#xff1a;青云、南天、蒋凡 2015年9月&#xff0c;手机淘宝日活跃用户达到1.1亿人&#xff0c;成为全球少数亿级app。 《天下网商》采访团队进入位于杭州西溪的淘宝城&#xff0c;贴身采访手机淘宝团队&…

Delphi控件开发浅入深出(八)

八、数据敏感控件的制作。 Delphi的一大亮点就是它的数据库开发能力。而数据敏感组件则在这中间起着很重要的作用。在Delphi的Data Control页面下的控件都是用于显示和编辑数据库中的数据的。相信大家已经体会到数据敏感控件的好处了。我们这一节就给大家演示一下数据敏感控件…

Jekyll学习:基本使用方法

Jekyll是一个简单的博客、静态网站生成工具。利用它可以快速的搭建一个网站。并且完全免费的在 GitHub 上发布网站 — 自定义域名。 一、环境搭建 apt-get install jekyll jekyll new mysite cd mysite jekyll serve 这样一个网站就搭建好了&#x…

详谈基于JSON的高级AJAX开发技术

本文将解释如何使用AJAX和JSON分析器在客户端和服务器之间创建复杂的JSON数据传输层。 一、 引言 毫无疑问&#xff0c;AJAX已经成为当今Web开发中一种强有力的用户交互技术&#xff0c;但是它的许多可能性应用仍然鲜为人知。在本文中&#xff0c;我们将来共同探讨如何 使用Jav…