复合控件复合控件是Delphi控件中非常重要的一种控件,复合控件就是将两个或两个以上的控件重新组合成一个新的控件。
例如TspinEdit、TlabeledEdit、TDBNavigator等就是复合控件,TDBNavigator其实就是在一个Panel放上若干个Button而已。
制作一个复合控件时,我们一般从TwinControl派生控件。我们这次做的控件是拥有一个Edit编辑框和一个Button按钮的复合控件,
在用户在编辑框中输入文字的过程中,Button将随时显示编辑框中文字的长度。我们把控件的源码先展示给大家。

unit EditButton;

interface

uses SysUtils, Classes, Controls, StdCtrls, Messages;

type
TEditButton = class(TWinControl)
private
FEdit: TEdit;
FButton: TButton;
FText: string;
procedure FSetText(AValue: string);
procedure OnEditChange(Sender: TObject);
protected
procedure WMSize(var Msg: TMessage);message WM_SIZE;
public
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
published
property Text: string read FText write FSetText;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Linco', [TEditButton]);
end;

constructor TEditButton.Create(AOwner: TComponent);
begin
inherited;
FEdit := TEdit.Create(nil);
FEdit.Parent := self;
FEdit.Top := 0;
FEdit.Left := 0;
FEdit.Height := Height;
FEdit.Width := Width div 2;
FEdit.OnChange := OnEditChange;

FButton := TButton.Create(nil);
FButton.Parent := self;
FButton.Top := 0;
FButton.Left := Width div 2;
FButton.Height := Height;
FButton.Width := Width div 2;
end;

destructor TEditButton.Destroy;
begin
FEdit.Free;
FButton.Free;
inherited;
end;

procedure TEditButton.FSetText(AValue: string);
begin
FEdit.Text := AValue;
end;

procedure TEditButton.OnEditChange(Sender: TObject);
begin
FButton.Caption := IntToStr(Length(FEdit.Text));
end;

procedure TEditButton.WMSize(var Msg: TMessage);
begin
FEdit.Height := Height;
FEdit.Width := Width div 2;
FButton.Left := Width div 2;
FButton.Height := Height;
FButton.Width := Width div 2;
end;

end.

代码解释:
(1)、我们首先定义了两个变量
FEdit: TEdit; FButton: TButton; 分别代表复合控件中的文字编辑框和按钮。
(2)所谓复合控件说简单一点就是在一个共同的基板上将组成复合控件的各个控件(可以叫做子控件)画出来。
所以我们在构造函数中建立各个子控件,然后分别设定它们的位置等属性。
以文字编辑框为例:FEdit := TEdit.Create(nil);的作用是建立编辑框控件。
如果Create的参数指定为nil,则子控件在设计状态是可以响应用户的操作的;
而如果设定为self(即设定子控件的父控件为基板),则子控件在设计时时不可响应用户操作的,
如果设定为self则析构函数中就不用Fedit.Free来销毁对象了,对象会自动销毁。
FEdit.Parent := self;的作用是设定子控件的父控件,如果没有这一句则控件是无法显示的。
FEdit.Top := 0;
FEdit.Left := 0;
FEdit.Height := Height;
FEdit.Width := Width div 2;这四句是设定控件在基板上的相对位置的,这里的Top,Left不是相对于窗体的,而是相对于基板的。
FEdit.OnChange := OnEditChange;则是设定编辑框控件的OnChange(文字改变事件)的处理句柄为OnEditChange;

(1) 用户有可能在设计时或运行时通过代码改变控件的大小,这时控件中子控件的顺序就会变得乱七八糟,
所以需要相应控件的WM_SIZE事件(控件大小发生变化的事件)重新设定子控件的位置,大小等。函数WMSize的作用就是这样的。

安装控件后发现控件已经可以正确运行了,但是还有一个问题,就是这个控件没有了Onclick,Onchange等必须的属性。
我们只要为控件增加事件处理句柄属性,然后把事件处理句柄属性的读写方法都指向子控件的事件处理句柄属性即可。
例如我们为控件增加OnClick事件,这个事件发生在用户单击按钮时,我么只要在Pulished部分增加如下代码:

property OnClick: TnotifyEvent read GetOnClick write SetOnClick

在Private中增加如下方法声明:

function GetOnclick: TnotifyEvent;
procedure SetOnclick(AValue: TnotifyEvent);

这两个方法的实现分别为:
function TeditButton. GetOnclick: TnotifyEvent;
begin
result := Fbutton.Onclick;
end;

procedure TeditButton.SetOnclick(AValue: TnotifyEvent);
begin
Fbutton.OnClick := Avalue;
end;

---------------------

本文来自 cml2030 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/cml2030/article/details/3166634?utm_source=copy

Delphi控件-复合控件【转】的更多相关文章

  1. Delphi控件-复合控件

     http://blog.csdn.net/cml2030/article/details/3166634 Delphi控件-复合控件 标签: delphidestructorbuttonstring ...

  2. Delphi 控件大全

    delphi 控件大全(确实很全)   delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar ...

  3. delphi控件属性大全-详解-简介

    http://blog.csdn.net/u011096030/article/details/18716713 button 组件: CAPTION 属性 :用于在按钮上显示文本内容 Cancel ...

  4. delphi 控件大全(确实很全)

    delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoC ...

  5. 对Delphi控件作用的新理解(控件本身的源代码就是一个很强的工业级源码)

    最近几天,对Delphi控件的含义有了一个新的理解.其实它不仅仅是给程序员提供功能的一个表层调用,控件本身的源代码就是一个很强的工业级源码.而且它的Main例子,往往就已经是半成品.而别的语言里没有那 ...

  6. Ehlib(Delphi控件) v9.2.024 D7-XE10.2 免费绿色特别版

    下载地址:https://www.jb51.net/softs/579413.html#downintro2 EHLib是一个DELPHI 下的非常棒的第三方Grid控件,比DELPHI自带的强大许多 ...

  7. delphi 控件集

    delphi  控件集: 1)RAIZE 控件包  :http://www.raize.com/devtools/rzcomps/   被收购 Raize Components has been ac ...

  8. DELPHI控件属性事件说明

    常用DELPHI控件属性事件设置说明 常用DELPHI控件属性设置说明目录TForm Class TPanel组件 TToolBar Class TToolButton Class TTimer Cl ...

  9. Delphi控件大全

    首先来大体上为控件分一下类,以方便我们后面的讨论.   但因为控件的种类太多,所以就粗略的分为如下几个类别∶   ---界面风格类   ---Shell外观类   ---Editor类   ---Gr ...

随机推荐

  1. 【HNOI2011】卡农

    题面 题解 将无序化为有序,最后答案除以$m!$. 设$f[i]$表示选出了$i$个子集,并且满足所有的限制的方案数. 因为转移困难,所以考虑容斥 限制了每个数的出现次数为偶数,所以如果前$i - 1 ...

  2. 【LG3295】[SCOI2016]萌萌哒

    [LG3295][SCOI2016]萌萌哒 题面 洛谷 题解 考虑现在我们如果一次只是限定两个位置相等该怎么做, 直接将这些位置用并查集并起来然后答案就是 \[ ans= \begin{cases} ...

  3. 【fake题解】[NOI2013]向量内积

    [fake题解][NOI2013]向量内积 做法1 大暴力.哪里不会T哪里. 做法2 所有数都%=k不影响结果.(废话 k的取值只有2和3,所以肯定是要分类讨论的.k=2肯定简单些啦. k=2 出现的 ...

  4. MIUI 10 已连接 但无法访问互联网 的解决方案

    wifi为 DHCP 时,我发现得到的总是已经有机器在用的 192.168.1.9  这台机器, 所以只需要手动配置一下ip就行了,随便指定一个,然后ping一下,ping不通的话就配上,然后再重新连 ...

  5. 办公区公网Ip访问不到阿里云ECS

    办公区公网Ip访问不到阿里云ECS 工作中遇见这样的问题, Hadoop 部署在办公区内网, 而应用有些的数据在阿里云ECS主机中,现在hadoop 访问ECS 却访问不到ESC ,最终电话咨询阿里云 ...

  6. HALCON视觉算子相关函数中文说明System(2)

    16.6  Parameters get_system_ 功能:根据HALCON系统参数获取关于当前的信息. set_system 功能:HALCON系统参数的设置. 16.7  Serial cle ...

  7. python通讯录系统

    ---恢复内容开始--- 对于一般的通讯录系统,主要有两个参数:姓名和电话号码,所以可以利用python编程里面的字典来进行建立之间的所属关系, 可以利用以下代码简单实现: print('|--- 欢 ...

  8. numpy技巧

    矩阵旋转: mat_array = np.array([[1,2],[4,3]]) rotate_90 = np.zeros((2,2), np.uint8) rotate_180 = np.zero ...

  9. Python浮点算术:争议和限制

    浮点数在计算机硬件中表示为以 2 为基数(二进制)的小数.举例而言,十进制的小数 0.125 等于 1/10 + 2/100 + 5/1000 ,同理,二进制的小数 0.001 等于0/2 + 0/4 ...

  10. 分析(function(window, undefined) {})(window)

    有的时候,我们会在JS框架中看到这行 (function(window, undefined) {})(window) ,它是做什么用的,我们来分析下它 首先这就是一个匿名函数,立即执行它 (func ...