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;
Delphi控件-复合控件相关推荐
- 计算机等级delphi取消,计算机二级DELPHI控件:DELPHI过滤记录的实现方法
所谓过滤就是从表中选取满足特定条件的部分记录.过滤记录首先要通过Filter.属性设置过滤条件,然后将Filtered属性设置为True,即可从数据集组件连接的表中过滤出满足条件的记录. 1.Filt ...
- delphi 控件大全(确实很全)
delphi 控件查询:Torry's Delphi Pages http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoCk ...
- delphi 控件大全
delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoC ...
- 如何隐藏TPageControl Delphi控件的选项卡
The TPageControl Delphi control displays a set of pages used to make a multiple-page dialog box. Eac ...
- Delphi 控件开发步骤
delphi 控件开发步骤 Delphi控件开发步骤 1.使用Delphi IDE的 Component -> New Component 菜单 2.按照向导逐步完成 3.控件工程文件 4.控件 ...
- Delphi控件开发浅入深出(一)
有人说过"不会开发控件的Delphi程序员不是真正的程序员".Delphi正是由于高度的可扩展性和大量的第三方控件的支持才能吸引无数程序员挑剔的目光.即使是由于工作需要使用其他开发 ...
- 实现一个模拟CMD.exe命令编辑模式执行与显示的Delphi控件
cmd.exe这个东西是Windows系统自带的执行Dos的一个灰常好的人机命令交互的执行方式,现在很多脚本语言也都带有这种即时解释的人机模式.当下由于工程的需要,也要做一个类似命令解释显示的编辑器, ...
- Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)...
最近在开发中使用到了UpDown这个控件,但是因为之前没有使用过,所以很不熟悉,于是就编写了一个简单的demo来学习UpDown以及其结合TEdit的用法. 初步的常用功能的简介 目前(2015.08 ...
- Delphi控件的“拿来主义”
"一个优秀的Delphi程序员,不仅要会写控件,还要会使用控件." 我还是一个半瓢水的程序员,因此目前为止我所能努力达到的境界是: 一个半瓢水的程序员,管他会不会写控件,只要能拿来 ...
最新文章
- 请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。...
- Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
- oracle数据磊导入数据,可传输表空间记载
- 自然语言处理NLP-100例 | 第二篇:在线课程评论情感分析-本科毕设实战案例
- wpf的listbox循环数据滚动_滚动版 CentOS Stream 和 Fedora 的关系
- CCIE-LAB-SDN-第一篇-修改交换机管理IP
- 什么是掼蛋游戏呼叫中心
- 带你自学Python系列(十五):Python中类的用法(一)
- 【SpringCloud】Spring cloud Alibaba Sentinel 热点规则
- java 485通讯_CAKJ-963U3-KT带485通讯上下限报警智能型仪表
- JSP的3种方式实现radio ,checkBox,select的默认选择值
- cygwin下载可以用的服务器
- 190113每日一句
- 优秀课件笔记——财政学1
- 【如何制作电子书】云展网教程 | 编辑纯文本阅读页面功能(有利于SEO收录)
- Java开发常用在线工具
- 免费开源的几款Web服务器软件简介
- DWCS6搭建jsp开发环境及使用ajax实现用户注册(基于文件)
- 银河麒麟踩坑笔记——打包QT程序
- 一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码
热门文章
- Java-8-Collectors类
- IDEA打包jar包,以及exe应用程序。
- Linux共享打印机手机打印,[分享]让linux和linux之间共享打印机
- linux debian vi,debian系统中常用的vi命令使用和讲解
- 实验四 串行通信实验
- cocos2d-x初探学习笔记(29)-cocosBuilder
- XAML与XML的区别
- 钰泰ETA2821,42V/1.5A降压转换器,集成OVP功能防浪涌
- js 你知道为什么[]==![]是成立的吗(强制类型转换)
- 《OpenDRIVE1.6规格文档》3