现在位置:主页>基础知识> 文章内容

走进开发可视组件的大门

我要投稿更新日期:2008-07-02 点击:
可视的组件可以看成许多的可视组件拼装而成。例如一个ScrollBar,
可以看成是一个 条、两个按扭、一个滑快 拼装而成。而组成这个
Scrollbar的按扭等组件可以看成是“基本元素”,无法拼装实现,
这样的组件可以参考Delphi的源代码来写,这里主要介绍的是这种
“拼装”的组件。

为了安排这些组件,必须为这些组件找一个合适的载体,例如Panel就是
最常见的载体,但我们经常用的是从 TwinControl继承的类来做载体。

下面做一个拼装的可视组件,这个组件由两个Tmemo组成。

首先使用向导创建一个这个组件,起名为 Tmytest:
type
 TMyTest = class(TWinControl)
Private
Protected
Public
published
end;

好了,载体已经创建完毕,下面我们要在这个载体上生成两个Tmemo 组件。
这两个组件的声明我们要放在 Private 中。如下:
Private
Fmemo,FMemo2 : Tmemo;
只是声明当然不会显示出来,下面我们要重载TMyTest的构造函数,
声明构造函数:
Public
constructor Create(Aowner : Tcomponent);override;

实现部分:
constructor TMyTest.Create(Aowner : Tcomponent);
begin
inherited Create(Aowner);
Fmemo := Tmemo.create(self);
Fmemo.Parent := self;
Fmemo.visible := true;
Fmemo.BorderStyle := bsNone;
Fmemo.Enabled := False;
Fmemo.Color := clBlue;

FMemo2 := Tmemo.create(self);
FMemo2.Parent := self;
FMemo2.visible := true;
FMemo2.BorderStyle := bsNone;
FMemo2.MaxLength := 1;
FMemo2.WantReturns := False;
FMemo2.Color := clSkyBlue;
end;

好了,这样当我们的Tmytest组件出现在窗体上时,两个Memo也出现了。
可是我们会发现,尽管我们改变了Tmytest组件的大小,可是两个Memo不会
改变大小。这样我们改考虑重载TwinControl的某个方法了。查看TwinControl
的源码可以知道,有一个 AdjustSize方法是在调节大小时调用的,那我们就
重载这个方法。
声明:
protected
procedure AdjustSize;override;
实现:
procedure TMyTest.AdjustSize;
begin
inherited AdjustSize;
if(self.Height <50 ) then//为了显示两个Memo,高度要有个限制才好
 self.Height := 50;
SetMemoHeight;//调节两个Memo的高度的方法,下面有代码
end;

procedure TMyTest.SetMemoHeight; //调节两个Memo的高度的方法
begin
Fmemo.Height := self.Height-30;
FMemo2.Top := self.Height-30;
FMemo2.Height := 30;
end;

好了,现在我们看到在设计期间两个Memo的确是随着我们的组件的
改变而改变了(因为我们只改变了高度,所以Memo也只改变高度)。
但是我们一运行程序发现,Memo并不是设计时所看到的高度。
只好再去看看 TwinControl,我们发现TwinControl有一个CreateParams
方法,我们重载它。

声明:
protected
procedure CreateParams(var Params: TCreateParams);override;

实现:
procedure TMyTest.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
SetMemoHeight;//改变组件的高度的方法,上面已经介绍过
end;



好,再次运行,一切正常了。可见,编写复杂的可视组件不是高不可攀
的,很重要的一点是会查看Delphi的Vcl代码。有时如果你需要编写自己
的基本组件(如按扭),那么也可以看看Vcl里是如何写的,然后全部Copy,
只改关键的部分就可以。
这只是个简单的入门例子,具体的编写还有许多事情要做,但是只要有
耐心和毅力,一定能写出不错的组件。


代码:

unit MyTest;



interface



uses

 Windows, Messages, SysUtils, Classes, Controls,StdCtrls,Forms,

 Graphics;



type

 TMyTest = class(TWinControl)

 private

  { Private declarations }

  Fmemo,FMemo2 : Tmemo;

 protected

  { Protected declarations }

   procedure CreateParams(var Params: TCreateParams);override;

   procedure AdjustSize;override;

   procedure SetMemoHeight;

 public

  { Public declarations }

  constructor Create(Aowner : Tcomponent);override;

 published

  { Published declarations }

 end;



procedure Register;



implementation



procedure Register;

begin

 RegisterComponents('Samples', [TMyTest]);

end;



constructor TMyTest.Create(Aowner : Tcomponent);

begin

inherited Create(Aowner);

Fmemo := Tmemo.create(self);

Fmemo.Parent := self;

Fmemo.visible := true;

Fmemo.BorderStyle := bsNone;

Fmemo.Enabled := False;

Fmemo.Color := clBlue;



FMemo2 := Tmemo.create(self);

FMemo2.Parent := self;

FMemo2.visible := true;

FMemo2.BorderStyle := bsNone;

FMemo2.MaxLength := 1;

FMemo2.WantReturns := False;

上一页12 下一页
所有评论

评论列表


我也评论来评论! 点击此处参与本文评论

注意:本站采用匿名评论,请各位网友注意自己的言行