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. 用Python编写一个ftb

    程序文件结构 具体代码实现 服务端: 执行文件bin/ftb_server import os,sys PATH = os.path.dirname(os.path.dirname(os.path.a ...

  2. 个人第二次作业-c++实现四则运算生成器

    c++实现四则运算生成器 GIT地址 Link Git用户名 Redwarx008 学号后五位 61128 博客地址 Link 作业链接 Link 环境配置 使用VS2019社区版,一键式安装,这里不 ...

  3. 2019 计蒜之道 初赛 第二场 A 百度AI小课堂-矩阵问题 ( 等差数列求和公式)

    题目背景 ​91029102 年 99 月 11 日,百度在 X 市 XX 中学举办了一场 AI 知识小课堂,本场 AI 知识小课堂老师教授了一些矩阵的相关知识,因为矩阵在 AI 人工智能中也有相当的 ...

  4. AlphaStar: Mastering the Real-Time Strategy Game StarCraft II 博客要点

    original blog:  https://deepmind.com/blog/alphastar-mastering-real-time-strategy-game-starcraft-ii S ...

  5. socket tcp clinet最简单测试程序

    // testsocketclient.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <winsock2.h> ...

  6. XNUCA 2019ezPHP

    ezPHP 源码很简单(感觉越简单的源码越不好搞),一个写文件的功能且只能写文件名为[a-z.]* 的文件,且文件内容存在黑名单过滤,并且结尾被加上了一行,这就导致我们无法直接写入.htaccess里 ...

  7. 【04】Python 深拷贝浅拷贝 函数 递归 集合

    1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b    比较两个对象的内容是否相等(可以是不同内存空间) a is b  比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...

  8. SpringCloud学习系列-Eureka服务注册与发现(4)

    actuator与注册微服务信息完善 1.主机名称:服务名称修改 当前问题 含有主机名称 修改修改microservicecloud-provider-dept-8001 的yml文件 修改内容 eu ...

  9. ES6数据结构Set、Map

    一.Set数据结构 Set是无序的不可重复的多个value的集合体,Set结构是类似于数组结构,但是Set中的值都不能重复 常用的属性和方法 size:返回set实例的成员总数 add():添加某个值 ...

  10. [CF938E]Max History题解

    题面 >CF传送门< >洛谷传送门< 解法 显而易见,对于一个数\(a_i\),若果它出现在\(f\)序列中,必定\(a_i\)之前的元素要小于\(a_i\),我们设\(cnt ...