Delphi控件-复合控件【转】
复合控件复合控件是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控件-复合控件【转】的更多相关文章
- Delphi控件-复合控件
http://blog.csdn.net/cml2030/article/details/3166634 Delphi控件-复合控件 标签: delphidestructorbuttonstring ...
- Delphi 控件大全
delphi 控件大全(确实很全) delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar ...
- delphi控件属性大全-详解-简介
http://blog.csdn.net/u011096030/article/details/18716713 button 组件: CAPTION 属性 :用于在按钮上显示文本内容 Cancel ...
- delphi 控件大全(确实很全)
delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoC ...
- 对Delphi控件作用的新理解(控件本身的源代码就是一个很强的工业级源码)
最近几天,对Delphi控件的含义有了一个新的理解.其实它不仅仅是给程序员提供功能的一个表层调用,控件本身的源代码就是一个很强的工业级源码.而且它的Main例子,往往就已经是半成品.而别的语言里没有那 ...
- Ehlib(Delphi控件) v9.2.024 D7-XE10.2 免费绿色特别版
下载地址:https://www.jb51.net/softs/579413.html#downintro2 EHLib是一个DELPHI 下的非常棒的第三方Grid控件,比DELPHI自带的强大许多 ...
- delphi 控件集
delphi 控件集: 1)RAIZE 控件包 :http://www.raize.com/devtools/rzcomps/ 被收购 Raize Components has been ac ...
- DELPHI控件属性事件说明
常用DELPHI控件属性事件设置说明 常用DELPHI控件属性设置说明目录TForm Class TPanel组件 TToolBar Class TToolButton Class TTimer Cl ...
- Delphi控件大全
首先来大体上为控件分一下类,以方便我们后面的讨论. 但因为控件的种类太多,所以就粗略的分为如下几个类别∶ ---界面风格类 ---Shell外观类 ---Editor类 ---Gr ...
随机推荐
- extern "C" 的用意
extern "C" 修饰符只有在C++代码的时候才用到. C++编译器通常会对变量名和函数名进行改编,这样在链接的时候会出现问题. 假如: 1.用C++编写的Dll,在编译成Dl ...
- 一目了然带你看lniux
第一部分 熟悉Linux基本操作 一.初识Linux 1.Linux特点 ◊ 开放性 ◊ 多用户 ◊ 多任务 ◊ 良好的用户界面 ◊ 设备独立性 ◊ 丰富的网络功能 ◊ 可靠的系统 ...
- python爬虫之图片懒加载、selenium和phantomJS
一.什么是图片懒加载 在网页中,常常需要用到图片,而图片需要消耗较大的流量.正常情况下,浏览器会解析整个HTML代码,然后从上到下依次加载<img src="xxx"> ...
- Node JS World
Node JS World Environment tested on Ubuntu Install nvm/node/npm/yarn nvm : node version manager node ...
- jmeter控制器(一)
简单控制器: 也就是最简单的控制器,里面没有任何内容的,如下图所示: 当我设置线程为循环10次时,运行简单控制器及下边的注册,设置如下图: 通过查看结果数得知,注册只成功了一次 ,再注册时出现邮箱已存 ...
- RPC之Jersey服务调用处理(一)
1.定义: 远程过程调用, 也叫远程函数调用, 最早出现在Sun公司和HP公司的运行Unix操作系统的计算机中,用于系统间通信的一种机制. RPC的基本通信模型是基于Cli ...
- django1.11入门
快速安装指南¶ 在使用Django之前,您需要安装它.我们有 完整的安装指南,涵盖所有可能性; 本指南将指导您进行简单,最小化的安装,在您完成介绍时可以正常工作. 安装Python¶ 作为一个Pyth ...
- 下一个时代的发展架构竟然是它!FaaaaaaaaS到底是个啥?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云serverless团队发表于云+社区专栏 导读:2018年7月6 - 7日,一年一度的技术圈盛会ArchSummit全球架构师 ...
- MySQL基础练习(二)
第一个例子我们编写一个 SQL 查询,列出所有超过或等于5名学生的课. 先建表 CREATE TABLE courses( student ) NOT NULL, class ) NOT NULL ) ...
- OGG 跳过事务(转)
http://blog.chinaunix.net/uid-26190993-id-3434074.html 在OGG运行过程中,通常会因为各种各样的原因导致容灾端的REPLICAT进程ABEN ...