捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >界面 > 正文
8 2021.12

Delphi组件开发(6) 复合控件

点击次数:239 更新时间:2021-12-8 21:04:33  【打印此页

  复合控件是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('CxbControls', [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; // 作用是设定子控件的父控件,如果没有这一句则控件是无法显示的。

// 以下四句是设定控件在基板上的相对位置的,这里的Top,Left不是相对于窗体的,而是相对于基板的。
FEdit.Top := 0;
FEdit.Left := 0;
FEdit.Height := Height;
FEdit.Width := Width div 2;

FEdit.OnChange := OnEditChange; // 设定编辑框控件的OnChange(文字改变事件)的处理句柄为OnEditChange;

  3、用户有可能在设计时或运行时通过代码改变控件的大小,这时控件中子控件的顺序就会变得乱七八糟,所以需要相应控件的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;

 

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:239 更新时间:2021-12-8 21:04:33  【打印此页

上一条:Delphi自绘控件属性添加子属性

下一条:已经是最后一篇了

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修