http://blog.csdn.net/cml2030/article/details/3166634

Delphi控件-复合控件

2008-10-28 13:48 1835人阅读 评论(0) 收藏 举报

版权声明:本文为博主原创文章,未经博主允许不得转载。

复合控件
复合控件是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;

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

  1. Delphi控件-复合控件【转】

    复合控件复合控件是Delphi控件中非常重要的一种控件,复合控件就是将两个或两个以上的控件重新组合成一个新的控件.例如TspinEdit.TlabeledEdit.TDBNavigator等就是复合控 ...

  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. PowerEdge T630服务器安装机器学习环境(Ubuntu18.04、Nvidia 1080Ti驱动、CUDA及CUDNN安装)

    安装步骤 在开始安装之前,我要说明一下,这个Ubuntu18.04系统的安装,使用的连接线(就是服务器和电脑显示器的连接线)必须两头都是VGA连接线,不能使用VGA转HDMI连接线,也不能用DVI转D ...

  2. Centos安装 Apache2.4提示 APR not found的解决办法

    在安装apache2.2.22版本的时候没有任何问题,可直接使用命令编译安装. 但是,在apache 2.4.12版本,./configure 进行配置时, 提示 configure: error: ...

  3. 图解Qt安装(Linux平台)

    http://c.biancheng.net/view/3886.html Linux 发行版虽然众多,但 Qt 安装过程大同小异,本节以 CentOS 7 为例来演示 Qt 的安装. 在<Qt ...

  4. Linux服务器安装系统之1-LSI阵列卡raid5配置方法

  5. PAT Advanced 1058 A+B in Hogwarts (20 分)

    If you are a fan of Harry Potter, you would know the world of magic has its own currency system -- a ...

  6. Comet OJ - Contest #0 A题 解方程 (数学)

    题目描述 小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的: 给定自然数 nn,确定关于 x, y, zx,y,z 的不定方程 \displaystyle \sqrt{x - \sqrt{n ...

  7. VMware使用自带工具vmware-vdiskmanager精简占用磁盘空间

    https://blog.csdn.net/xcl113/article/details/50715943 vmware-vdiskmanager压缩磁盘大小,验证有效 一 .sudo apt-get ...

  8. 对postcss-plugin-px2rem的研究

    1.安装postcss-plugin-px2rem 2.配置 css: { loaderOptions: { postcss: { plugins: [ require('postcss-plugin ...

  9. 快速掌握Eclipse Plugin / RCP开发思想

    本文转载:https://my.oschina.net/drjones/blog/280337 引言 本文不是快速入门的文章,只面向有一定基础的开发人员,至少看这篇文章之前你应该了解什么是Eclips ...

  10. DNS域名解析系统

    1.DNS的组成 DNS系统是为解析域名为IP地址而存在的,它是由域名空间.资源记录.名称服务器和解析器组成. 域名空间是包含一个树状结构,用于存储资源记录的空间. 资源记录是与域名相关的数据,如IP ...