`
javasogo
  • 浏览: 1833230 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

组件制作之二(一个简单组件的制作过程)

阅读更多

接下来要动手来做一个组件了,我想了一个计数器组件,功能方面是比较简单的,但这不是本章的重点,这一章的重点是说明一个组件的制作全过程。在其中可以学到很多组件制作的技巧,当然这些也是我从书上学得的。好了,开始制作吧:

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

这是一个可以计数的组件,为了简单,我以秒为单位,当开始时,他就从0开始增加,并显示出来,到3600时,它又回到0,如此循环。当然它也可以停止,暂停,继续。另外,他还有一个时间事件,即可以设定每隔多少时间来触发这个事件,这倒是一个好的功能,我们可以设半个小时触发事件,在事件处理函数中来一个声音,然后睡个觉,半个小时后,就由这个声音来提醒你起床了。

我们一开始不要新建组件单元,而是把它当成一个工程中的一个类来应用,这样更易于调试,于是我们新建一个工程,又新建一个空白单元用于放置这个类

一,确定父类:

接下来给这个类起名叫TTimeCount,那么它的父类应该是什么呢,它要能显示出来,得有一个容量来让他显示,TPanel是个不错的选择,我看了一下源码,发觉TPanel什么也没有做,只是把它的父类TCustomPanel的属性显化出来(这个等一下讲),TCustomPanel把好多的属性声明为Protected,为他的子类提供了选择,他的子类如果要使这些属性能在对象察看器中看到,可以在Published重新声明一下,如果不想,则不用去理会他。而我们的计数器组件正好不用那么多属性,正好合适。于是我决定用TCusomPanel为父类

类建立如下:

TTimeCount=class(TCustomPanel)

private

protected

public

published

end;

二,确定成员,方法和属性和事件

FCount; 只读私有成员,保存计数值

FActive:Boolean; /确定是否发生类的时间间隔事件

FInterval:TInterval; 这个可以设置时间事件触发间隔,本来用整型值会好一些,但会了学习起见,这里用了一个枚举形的,在Type中声明如下:

TInterval=(TenM,TwentyM,ThirtyM,FortyM,FiftyM,SixtyM);

分别表示十分钟到六十分钟。

TimeLenTimeNum:integer;这两个用在类的时间事件发生的确定上,与外界隔绝。

FTimeOut:TNotifyEvent;时间间隔事件的方法指针,通过调度方法实现他与外部的处理函数关联。

我们要它能以秒为单位来计数,则要涉及到时间的应用,所以就有了这个最重要的成员:

FTimer:TTimer;

这个成员对象要在类构造函数中实例化它,并赋与他的属性值,还要在析构函数在释放它。

如下:

//构造函数,继承父类的构造函数,并初始化类中的成员。

constructor TTimeCount.Create(AOwner:TComponent);

//创建时间控件并设置相关的参数

procedure CreateTimer;

begin

FTimer:=TTimer.Create(self);

FTimer.Enabled:=False;

FTimer.Interval:=1000;

FTimer.OnTimer:=FTimerTimer;

end;

begin

inherited Create(AOwner);

CreateTimer;

end;

//析构函数,先释放时间控件,再继承父类的析构函数

destructor TTimeCount.Destroy;

begin

FTimer.Free;

inherited Destroy;

end;

构造函数中还要设置该组件的外观和默认值,这里把它删去,到源代码再贴出来。

其中

FTimerTimer;是很重要的函数,在该类中有声明:

procedure FTimerTimer(Sender:Tobject);//时间控件的事件处理函数

在这个处理函数中,实现了计数值的递增并显示到容器中,此外,还在判断类的时间事件是否有足够条件触发了,如果有则调用DoTimeOut;过程,这个就是事件的调度函数啦:

//事件调度函数,将外部的事件处理函数和该类的事件方法指针联系起来

procedure TTimeCount.DoTimeOut;

begin

if Assigned(FTimeOut) then

FTimeOut(Self);

end;

而属性则是根据私有成员来设定了:

public

property Count:Integer read FCount default 0; //计数值的只读属性,这个属性不能声明在Published中,因为它是只读的,只在程序运行时通过它来得到计数值。

published

property Interval:TInterval read FInterval write SetInterval Default TenM;

property Active:boolean read FActive write SetActive default false;

property OnTimeOut:TNotifyEvent read FTimeOut write FTimeOut;

此外还有几个自定义方法即

procedure pause; //暂停计数

procedure Resume;//从暂停的计数开始计数。

procedure stop;//停止

procedure start;//开始计数

都比较简单。

三,父类属性的显化:

TCustomPanel及其父类有好多的属性设为Protected,使其子类可以有更灵活的选择,是否把这些属性显示到对象察看器中,如果想,则到Published中重新声明这些属性就可以,我参考了一下TPanel的源码,并按需要选择了其中的一些属性声明到Published中,注意哦,事件也是属性,只要你把它显化出来,就可以设置处理事件了。

四.以下是计数组件的源码,相信有了上面的讲解,应该不会很难了:

unit CountUnit;

interface

uses

SysUtils,Classes,Graphics,Controls,ExtCtrls;

type

//用于设置时间事件发生的间隔

TInterval=(TenM,TwentyM,ThirtyM,FortyM,FiftyM,SixtyM);

TTimeCount=class(TCustomPanel)

private

FTimer:TTimer;

FCount:integer; //只读私有成员,计数值

FInterval:TInterval; //时间事件发生的间隔

FActive:Boolean; //决定是否发生间隔事件

TimeLen:Integer;//发生事件的时间长度,以秒为单位。

TimeNum:integer;//计数值,和TimeLen一起有用,以判断是否事件该发生了

FTimeOut:TNotifyEvent;//事件的方法指针

procedure SetInterval(I:TInterval);

procedure SetActive(A:boolean);

procedure FTimerTimer(Sender:Tobject);//时间控件的事件处理函数

protected

procedure DoTimeOut;dynamic; //调度方法,用于关联事件。

public

procedure pause; //暂停计数

procedure Resume;//从暂停的计数开始计数。

procedure stop;//停止

procedure start;//开始计数

constructor Create(AOwner:TComponent);override;

destructor Destroy;override;

property Count:Integer read FCount; //计数值的只读属性

published

property Interval:TInterval read FInterval write SetInterval Default TenM;

property Active:boolean read FActive write SetActive default false;

property OnTimeOut:TNotifyEvent read FTimeOut write FTimeOut;

//显式祖先类的一些属性在对象察看器中

property BevelInner;

property BevelOuter;

property BevelWidth;

property Color;

property Font;

property PopupMenu;

property ShowHint;

property TabOrder;

property TabStop;

property Visible;

property OnClick;

property OnDblClick;

property OnMouseDown;

property OnMouseMove;

property OnMouseUp;

end;

implementation

//构造函数,继承父类的构造函数,并初始化类中的成员。

constructor TTimeCount.Create(AOwner:TComponent);

//创建时间控件并设置相关的参数

procedure CreateTimer;

begin

FTimer:=TTimer.Create(self);

FTimer.Enabled:=False;

FTimer.Interval:=1000;

FTimer.OnTimer:=FTimerTimer;

end;

//以下是设置外观的

procedure setView;

begin

Width:=100;

Height:=50;

Color:=$000000;

Font.Color:=$FFFFFF;

Font.Size:=14;

Font.Style:=[fsBold,fsUnderline];;

BevelOuter := bvLowered ;

Caption:='0';

end;

begin

inherited Create(AOwner);

FCount:=0;

FInterval:=TenM;

FActive:=False;

TimeLen:=600;//十分钟,六百秒

TimeNum:=0;

CreateTimer;

setView;

end;

//析构函数,先释放时间控件,再继承父类的析构函数

destructor TTimeCount.Destroy;

begin

FTimer.Free;

inherited Destroy;

end;

//设置时间事件发生间隔,财时要赋相应的间隔秒数

procedure TTimeCount.SetInterval(I:TInterval);

begin

if FInterval<>I then

begin

FInterval:=I;

case FInterval of

TenM: TimeLen:=600;

TwentyM:TimeLen:=1200;

ThirtyM: TimeLen:=1800;

FortyM: TimeLen:=2400;

FiftyM:TimeLen:=3000;

SixtyM:TimeLen:=3600;

end;

end;

end;

procedure TTimeCount.SetActive(A:boolean);

begin

if FActive<>A then

begin

FActive:=A;

TimeNum:=0;

end;

end;

procedure TTimeCount.pause;

begin

if FTimer.Enabled then

FTimer.Enabled:=False;

end;

procedure TTimeCount.Resume;

begin

if not FTimer.Enabled then

FTimer.Enabled:=True;

end;

procedure TTimeCount.stop;

begin

FTimer.Enabled:=False;

FCount:=0;

TimeNum:=0;

caption:='0'

end;

procedure TTimeCount.start;

begin

if (not FTimer.Enabled)and(TimeNum=0) then

FTimer.Enabled:=True;

end;

//最重要的时间函数,用于调用该类的事件触发高度函数。

//以及在容器中显示计数值

procedure TTimeCount.FTimerTimer(Sender:TObject);

begin

inc(FCount);

if (FCount mod 3600)=0 then FCount:=0;

Caption:=InttoStr(FCount);//这个就是显示计数值

inc(TimeNum);

if (TimeNum=TimeLen)and(FActive) then

begin

DoTimeOut;

TimeNum:=0;

end;

end;

//事件调度函数,将外部的事件处理函数和该类的事件方法指针联系起来

procedure TTimeCount.DoTimeOut;

begin

if Assigned(FTimeOut) then

FTimeOut(Self);

end;

end.

五,组件注册安装与删除。

组件类编写完毕,接着就要测试了,这个从略,可以在刚才的工程中动态创建它,设置相应属性,指定时间事件,看看是否正确。上面是经过测试的。

到确定正确后,就要来看看装组件的步骤了:

首先,我们要把组件单元放在一个指定的文件夹中,以便以后管理,和IDE统一指定路径。

我在Delphi目录下新建了MyCom文件夹,用来存放组件单元

然后选:

Component—>New Component;

启动Component Wizard

Ancestor type(父类):中填TCustomPanel

Class Name(你的组件类名)中填:TimeCount

Palette Page,默认为Samples,我就用这个吧,当然也可以自己创建一个。

Unit File Name(组件类所在的单元名),就写TimeCount吧。

Search Path(搜索路径),必须把上面所建的文件夹路径包含进去,编译时才能能过。

点击旁边的”…”按钮,出现一个对话框,里面的编辑框旁边又有一个”…“按钮,点击它出现浏览文件夹框,在其中选中上面建的文件夹的路径,点确定,再点OK,回去New Component;

这时再点下面的OK就行啦,出现代码如下:

unit TimeCount;

interface

uses

messages, SysUtils,Classes,Graphics,Controls,ExtCtrls;

type

TTimeCount=class(TCustomPanel)

private

published

public

published

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('Samples', [TTimeCount]); //注册控件用的函数,自动帮你生成

end;

end.

这时再把上面的组件类替换掉这个类就行啦(当然上面的注册函数可要保留呀)。然后保存到上面所建的文件夹中。

接着就要安装组件了,点Component->install Component

对话框中第一项Unit file Name,是组件单元.pas文件的路径名字。其他只要按缺省。

记得第三项的。。\delphi7\Lib\dclusr.dpk,这个就是存放组件的包名,等一下删除组件时用到的

接下来点OK,就可以了,看看Samples是不是有了一个新组件啦。

不过面板上的组件图标似乎不好看,应该给他一个新的图标了:

但之前应该把它先从面板删除,File->Open…打开dclusr.dpk.

选中其中的Contains下的TimeCount.pas,点上面的Remove。将其删除

然后再点Compile,重新将包编译一次。就行啦。Samples上的新组件就消失了。

接下来是做组件图标:

打开Image Eidtor,新建一个DCR文件,在其中建一个24×24的位图,画上你喜欢的图标,将位图的名字起为组件类名一样,而且用大写,即:TTIMECOUNT

DCR文件起名为组件类所在单元名一样,而且大写,即:TIMECOUNT

保存文件到单元所在的文件夹中,

最后依上面的方法再装一次,看是不是有一个漂亮的图标啦

六,讲完了,大家应该有一个清楚的概念了吧,其中涉及到了好多的技巧。在以后的篇章中将不再讲这些内容了,只把主要精力花在组件实现技术上。因为我们这个组件还是比较简单,没有涉及到多少高级的主题。但没有关系,跟着我慢慢地做下来,你们会了解组件制作的方方面面的。
分享到:
评论

相关推荐

    网站头广告排制作,很好用的一个组件

    "网站头广告排制作"这个组件为用户提供了一个方便、高效的解决方案,帮助他们轻松创建吸引眼球的头部广告条。本文将深入探讨这个组件的功能、优势以及如何集成到系统中。 首先,我们要理解头广告排的作用。它能够...

    DELPHI中自定义组件的制作方法介绍

    #### 二、自定义组件制作的基本步骤 自定义组件的制作流程包括以下几个关键步骤: 1. **编写组件单元(Unit)**:这是组件开发的基础,其中包含了组件的声明和实现代码。组件单元的设计需要考虑到组件的属性、事件...

    VC调用matlab中的com组件制作一个简易加法器

    标题“VC调用matlab中的com组件制作一个简易加法器”所描述的是一个使用Microsoft Visual C++(VC++)应用程序来调用MATLAB生成的COM(Component Object Model)组件,实现一个简单的加法计算的过程。这个过程涉及到...

    幕墙构件及组件的加工制作记录.pdf

    幕墙构件及组件的加工制作记录.pdf

    ATL制作COM组件

    3. **简单对象**:ATL中的简单对象是指那些只实现一个或几个基本接口的组件,例如,IUnknown和IDispatch。通过ATL的宏,如 DECLARE_IUNKNOWN 和 DECLARE_IDISPATCH,可以快速实现这些接口。 4. **事件接收**:在ATL...

    用VB制作ASP组件

    总的来说,用VB制作ASP组件是一项将VB的强大力量引入Web开发的过程,通过自定义组件可以实现更复杂的功能,提高代码复用性和可维护性。然而,这也需要开发者具备扎实的VB基础,对ASP的工作原理有深入理解,并能熟练...

    应用MATLAB制作COM组件

    例如,创建一个简单的MATLAB脚本,然后尝试使用COM Builder将其转换为COM组件。 #### 五、制作COM组件 制作COM组件的具体步骤如下: 1. **准备MATLAB脚本**:编写包含所需功能的MATLAB脚本。 2. **生成COM组件**...

    一种齿轮盒、导风组件以及空调器的制作方法.docx

    《一种齿轮盒、导风组件以及空调器的制作方法》 该技术方案涉及空调技术领域,具体地,是一项关于齿轮盒、导风组件以及空调器的创新制作工艺。当前市场上的中高端空调普遍采用全封闭出风口设计,这种设计可以精确...

    axure组件RPLIB 扁平化网页制作组件 组件丰富 适用7.0 8.0 8.5

    在给定的标题和描述中,我们关注的是“axure组件RPLIB”和“扁平化网页制作组件”,这表明这是一个专门针对扁平化设计风格的Axure组件库。 扁平化设计是一种流行的设计趋势,它摒弃了过度的装饰元素,强调简洁、...

    vs2019 Com组件初探之简单的COM编写及实现跨语言调用的方法

     2、编写一个简单的以DLL形式展现的Com组件  3、通过 VBS 实现跨语言调用COM 1、Com组件概念及原理  什么是COM:  引用百度百科:COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的...

    XPE制作驱动组件教程图解

    在XPE中,驱动组件是一个包含驱动程序和相关配置信息的独立单元。 - **组件化**:XPE中的驱动组件可以单独添加、删除或更新,使得定制过程更加灵活。 2. **驱动分类** - **WHQL驱动**:通过了微软WHQL(Windows ...

    C#常用函数和动态组件制作

    3. AppDomain:AppDomain是.NET框架中的一个概念,代表了一个独立的代码执行环境。可以在不同的AppDomain中加载和卸载组件,实现代码的隔离和安全控制。 三、C#自定义控件的制作 自定义控件在C# UI开发中非常常见,...

    c#中串口组件的使用方法总结及上位机制作方法

    添加SerialPort组件 设置串口属性 串口操作(打开关闭) private void btn_open_Click(object sender, EventArgs e) { if (btn_open.Text == "打开串口") { btn_open.Text = "关闭串口"; serialPort1.Open(); }...

    微信&支付宝移动端与小程序官方组件库 (Axure制作).zip

    本作品是一套微信&支付宝官方原生风格的移动端与小程序组件模板库,主要内容由设计组件列表、常用矢量图标、交互示例和模板等几个部分组成,其中的设计组件根据官方提供的各类素材进行梳理制作,而相关的交互示例和...

    微信小程序-海报生成组件

    总结来说,“微信小程序-海报生成组件”是一个高效且易用的工具,它简化了微信小程序中海报图片的制作流程,通过提供丰富的配置选项,满足各种设计需求。结合微信小程序的自定义组件机制,开发者可以快速构建出富有...

    自制作COM组件的实现和调用

    在本例"自制作COM组件的实现和调用"中,我们将学习如何创建一个简单的COM组件,以及如何在Win32控制台应用中使用这个组件。首先,我们需要理解COM组件的核心概念: 1. **接口(Interface)**:COM组件通过接口与...

    delphi第三方组件安装、删除和制作简介

    如果希望创建一个新的包,可以选择`Into New Package`并在`Package File Name`栏中输入新的包名。 - 点击`Unit File Name`后面的“Browse”按钮,选择要安装的组件文件(*.DCU),然后点击“打开”。 - 点击“OK”...

    PB调用PB自己制作的COM组件

    1、文件夹A下用COM的向导制作了一个不可视的object,制作了最简单的函数,最后打包成dll文件。 2、利用regsvr32注册了这个dll。 3、文件夹B下用ole方式调用这个dll,并调用里面的方法,测试正常。 注意要点:经过...

    文本框组件制作的简单计算器

    本项目是一个使用Delphi的文本框组件来构建的简单计算器,虽然功能可能不全,但仍然可以为我们提供关于Delphi编程和GUI设计的基础知识。 首先,Delphi的组件库是其核心特性之一,其中包含了各种用于创建用户界面的...

    制作Android天气预报的组件:日期组件和天气组件源码.rar

    制作Android天气预报的组件:日期组件和天气组件源码,我把Android中的一个天气组件和一个日期组件写在了一个VIEW组件中,我自己觉得用着挺方便,可以在用的时候,直接拖放到你的项目中。本实例包的源码是一个包括了...

Global site tag (gtag.js) - Google Analytics