可视的组件可以看成许多的可视组件拼装而成。例如一个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 下一页
可以看成是一个 条、两个按扭、一个滑快 拼装而成。而组成这个
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;
上一篇:用DELPHI开发简繁体应用软件的技巧 下一篇:谈Delphi编程中“流”的应用






评论列表