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

原文地址:https://www.cnblogs.com/railgunman/p/9686893.html

时间: 2024-10-06 18:49:23

Delphi控件-复合控件【转】的相关文章

Delphi控件-复合控件

http://blog.csdn.net/cml2030/article/details/3166634 Delphi控件-复合控件 标签: delphidestructorbuttonstringdivconstructor 2008-10-28 13:48 1835人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 复合控件复合控件是Delphi控件中非常重要的一种控件,复合控件就是将两个或两个以上的控件重新组合成一个新的控件.例如TspinEdit.Tla

DELPHI控件:DBLookupComboBOX组件的使用方法

在许多数据表中,数据是以代码方式存放的,如在班级编码数据表tB03(表5.5)中,系部字段TB0309采用编码方式存放,系部真实名称则存放在系部编码表TB06.使用代码的好处是,用户可在编码表TB06中改变TB0602字段的系部名称,而不会影响使用该编码的其他数据表(如TB03)的运行6其缺点是当用户输人数据编码时,必须查询编码所表示的含义,如"OO"代表"基础部"."1 O"表示"机械系"等,这给数据录入带来很大的麻烦.最好

delphi控件属性大全-详解-简介

button 组件: CAPTION 属性 :用于在按钮上显示文本内容Cancel     属性:是否设置成默认的取消按钮,当设置为真的时候(true) 按ESC触发改按钮的事件!Default 属性:是否设置成默认的确认按钮,当设置为真的时候 按ENTER键的时候触发事件Hint 属性:设置当鼠标在按钮上短暂停留是显示的提示内容.Showhint 属性: 是否显示提示内容默认为假! Bitbtn 组件Kind 属性: 他的值就是位图按钮组件上所显示的图标!GLYPH 属性: 用于在位图按钮上显

对Delphi控件作用的新理解

最近几天,对Delphi控件的含义有了一个新的理解.其实它不仅仅是给程序员提供功能的一个表层调用,控件本身的源代码就是一个很强的工业级源码.而且它的Main例子,往往就已经是半成品.而别的语言里没有那么多控件——换句话说,就是没有那么多工业级项目的源代码(往往都是通用工具类型)供你使用和学习(两层意思).这是我们Delphier独一无二的优势.不得不说,当年设计Delphi的两位老兄Anders Hejlsberg和Chuck Jazdzewski真是双剑合璧,无敌于天下——当然,只是产品无敌于

Delphi控件大全

首先来大体上为控件分一下类,以方便我们后面的讨论.   但因为控件的种类太多,所以就粗略的分为如下几个类别∶   ---界面风格类   ---Shell外观类   ---Editor类   ---Grid类   ---DB类   ---Report类   ---图形类   ---综合类   约定的前提是∶All FreeWare,All source.至于那些要花钱购买的商业控件,我将在后面另外进行讨论.对于文中我们所讨论的每一个控件,都会给出一个品质得分,商业控件和免费控件一视同仁,不以价格论

delphi控件安装与删除

附带通用控件安装方法:----------基本安装1.对于单个控件,Componet-->install component..-->PAS或DCU文件-->install;2.对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可:3.对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可:4.如果以上Install按钮为失效的话,试试Compile按钮:5.是run t

delphi控件属性和事件

常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大小 BiDiMode:(所有组件) 为从右向左写的语言提供支持 BoundsRect:定义组件边框矩形(只适用于运行时) Borderwidth:(窗口化组件)边框的宽度 BorberStyle:设置组件边框形状(样式) Brush:可确定组件的风格和颜色 Caption:使用该属性可指定标注组件的

手动升级Delphi控件时,修改inc文件的办法

以MustangPeakCommonLib.exe控件为例,想让它支持Delphi2010,就需要在D:\Program Files\Common Library\Mustangpeak\Common Library\Source\Compilers.inc文件里手动增加: {$ifdef VER210} {$define COMPILER_14} {$endif VER210} {$ifdef COMPILER_14} {$define COMPILER_1_UP} {$define COMP

[转]Delphi 控件属性和事件

常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大小 BiDiMode:(所有组件) 为从右向左写的语言提供支持 BoundsRect:定义组件边框矩形(只适用于运行时) Borderwidth:(窗口化组件)边框的宽度 BorberStyle:设置组件边框形状(样式) Brush:可确定组件的风格和颜色 Caption:使用该属性可指定标注组件的