delphi控件-复合控件

railgunman railgunman     2023-01-01     734

关键词:

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

Android 片段与复合控件

】Android片段与复合控件【英文标题】:Androidfragmentsvscompoundcontrols【发布时间】:2011-09-0701:43:06【问题描述】:为什么要使用Android3.0片段而不是复合控件?可以一次创建一个View继承器或复合控件,然后在任何地方使用它。我已... 查看详情

webform(简单控件复合控件)

一、简单控件:1.label控件<asp:LabelID="Label1"runat="server"Text="账号:"></asp:Label>被编译为:<spanid="Label1">账号:</span>属性:Text:文本ForeColor:字体颜色Visible:是否可见CssClass:即HTML的class2.Literal类似lab 查看详情

如何验证复合控件

】如何验证复合控件【英文标题】:howtovalidatecompositecontrols【发布时间】:2012-12-0217:03:15【问题描述】:好吧,这有点复杂。我有一个包含文本框、必填字段验证器和一个按钮的复合控件。它公开了一个名为ValidationGroup的属性。... 查看详情

表单元素,简单控件,复合控件

十二个表单元素:文本类:<inputtype="text"/>//普通的文本框<inputtype="password"/>//密码框<textarea><textarea/>//可多行编辑的文本域<inputtype="hidden"/>//隐藏域选择类:<inputtype="radio"id="i"/><label 查看详情

1014简单控件和复合控件

简单控件Label-被Html编译成<span>Literal-什么元素都没有,只会在位置上将Text内容完全展示出来,可以形成jsTextBox-下面有详细介绍Button-就是按钮ImageButton-图片按钮LinkButton-超链接样式的按钮因为程序安装在客户端,所以js执行顺序... 查看详情

复合控件选择类

复合控件:  多选框:checkbox-CheckBoxList      属性:RepeatLayout:Table 按表格排布  Flow流排布       RepeatDirection:Vertical垂直排布  Horizontal水平排布       RepeatColumns:每一行有几列&nb... 查看详情

2017-5-19复合控件

(一)复合控件1.RadioButtonList 每一行数据都是一个ListItemRadioButtonList的属性:      RepeatDirection---排列方式    RepeatColumns---每一行中需要展示的个数    RepeatLayout ---页面中生成什么样的代码List... 查看详情

复合控件

RadioButtonList--单选RadioButtonList1.DataSource= 等于一个集合   --指向数据源 RadioButtonList1.DataTextField="NationName";  --网页中显示的内容       &n 查看详情

复合控件:选择类(代码片段)

复合控件:  多选框:checkbox-CheckBoxList      属性:RepeatLayout:Table 按表格排布  Flow流排布       RepeatDirection:Vertical垂直排布  Horizontal水平排布       RepeatColumns:每一行有几列&nb... 查看详情

java示例代码_当鼠标进入组件控件时,阻止SWT复合控件触发MouseExit事件

java示例代码_当鼠标进入组件控件时,阻止SWT复合控件触发MouseExit事件 查看详情

wpf复合控件焦点设置

参考技术A定义一个密码框的复合控件,最外层是Border,内部有三个控件分别是Image,GridSplitter,PasswordBox.当键盘输入完账号通过tab键跳转到密码框,会发现焦点不在PasswordBox上而是跑到了GridSplitter上,并有虚框。那为什么Image没有获... 查看详情

2017-5-19复合控件ispostback

(一)复合控件1.RadioButtonList 每一行数据都是一个ListItem属性:RepeatDirection---排列方式    RepeatColumns---每一行中需要展示的个数    RepeatLayout ---页面中生成什么样的代码    Enable ---是否启用    sele... 查看详情

复合控件

1、label。后台编译Span(1)ForeColor字体颜色(2)设置label的Height,Width之前,必须先设置:Display=“inLine-block”;(3)Text:文本内容。(4)visible:权限使用(5)CssClass:使用的样式表2、Literal。后台编译啥也没有(1)Text:文本内容。但是可以对L... 查看详情

复合控件

1、CheckBox(在网页中被编译成<inputtype="checkbox">)<asp:CheckBoxID="CheckBox1"runat="server"/Text="呵呵">(CheckBox中有text属性,“呵呵”在网页中被编译成“<labelfor="CheckBox1">呵呵</label>”)取值:if(CheckBox1.C 查看详情

webform复合控件

DropDownList下拉列表会被编译为selectoptionps.name服务端常用,id客户端常用一般用法:一、将数据放进去  方法一:同WinForm相同,给定数据源,然后绑定数据DropDownList1.DataSource=newNationData().Select();//数据源指向DropDownList1.DataText... 查看详情

2017-5-20传值基础复合控件

Repeater-重复器 LabelLiteral //表单元素所对应的控件文本类<inputtype="text"> -TextBoxpassword           TextBoxTextMode="password"textarea&nb 查看详情

2017-5-19复合控件ispostback跨页面传值

(一)复合控件1.RadioButtonList 每一行数据都是一个ListItem属性:RepeatDirection---排列方式    RepeatColumns---每一行中需要展示的个数    RepeatLayout ---页面中生成什么样的代码    Enable ---是否启用    sele... 查看详情

自定义复合控件在添加回 VGROUP 后仅 0.5-1 秒无法正确呈现

】自定义复合控件在添加回VGROUP后仅0.5-1秒无法正确呈现【英文标题】:CustomCompositeControlnotrenderingcorrectlyforonly0.5-1secafterbeingaddedbackintoaVGROUP【发布时间】:2012-06-1900:47:28【问题描述】:我正在远离MXML,并在ActionScript中构建了一... 查看详情