知识大全 基于Delphi的组件设计之简单实例
Posted 事件
篇首语:一锹挖不成水井,一天盖不成罗马城。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于Delphi的组件设计之简单实例相关的知识,希望对你有一定的参考价值。
基于Delphi的组件设计之简单实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
这是一个可以计数的组件 为了简单 我以秒为单位 当开始时 他就从 开始增加 并显示出来 到 时 它又回到 如此循环 当然它也可以停止 暂停 继续 另外 他还有一个时间事件 即可以设定每隔多少时间来触发这个事件 这倒是一个好的功能 我们可以设半个小时触发事件 在事件处理函数中来一个声音 然后睡个觉 半个小时后 就由这个声音来提醒你起床了 我们一开始不要新建组件单元 而是把它当成一个工程中的一个类来应用 这样更易于调试 于是我们新建一个工程 又新建一个空白单元用于放置这个类 一 确定父类 接下来给这个类起名叫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); 分别表示十分钟到六十分钟 TimeLen TimeNum:integer;这两个用在类的时间事件发生的确定上 与外界隔绝 FTimeOut:TNotifyEvent;时间间隔事件的方法指针 通过调度方法实现他与外部的处理函数关联 我们要它能以秒为单位来计数 则要涉及到时间的应用 所以就有了这个最重要的成员 FTimer:TTimer; 这个成员对象要在类构造函数中实例化它 并赋与他的属性值 还要在析构函数在释放它 如下 //构造函数 继承父类的构造函数 并初始化类中的成员 constructor TTimeCount Create(AOwner:TComponent); //创建时间控件并设置相关的参数 procedure CreateTimer; begin FTimer:=TTimer Create(self); FTimer Enabled:=False; FTimer Interval:= ; 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 ; //计数值的只读属性 这个属性不能声明在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:= ; FTimer OnTimer:=FTimerTimer; end; //以下是设置外观的 procedure setView; begin Width:= ; Height:= ; Color:=$ ; Font Color:=$FFFFFF; Font Size:= ; Font Style:=[fsBold fsUnderline];; BevelOuter := bvLowered ; Caption:= ; end; begin inherited Create(AOwner); FCount:= ; FInterval:=TenM; FActive:=False; TimeLen:= ;//十分钟 六百秒 TimeNum:= ; 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:= ; TwentyM:TimeLen:= ; ThirtyM: TimeLen:= ; FortyM: TimeLen:= ; FiftyM:TimeLen:= ; SixtyM:TimeLen:= ; end; end; end; procedure TTimeCount SetActive(A:boolean); begin if FActive<>A then begin FActive:=A; TimeNum:= ; 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; FCoun cha138/Article/program/Delphi/201311/24697相关参考
基于Delphi的组件设计之概念[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Delph
基于Delphi的组件设计之概念[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 属性可以有
用Delphi2005学设计模式之简单工厂篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!工厂模式
用Delphi语言来学设计模式之简单工厂篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 
摘要当前在开发多用户信息管理系统时常用的数据库连接方法存在着不足当客户端较多时会在服务端建立过多的连接占用服务器很多宝贵的资源针对这种不足提出一种改进的方案结合单件设计模式的特点和组件的技术建立了
基于Delphi的条码打印系统设计与实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 引言
ASP.NET组件设计之传输机制浅析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ASPNET
用Delphi2005学设计模式之工厂方法篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本文完成
Delphi的组件读写机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一流式对象(Strea
知识大全 JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一