Delphi控件开发浅入深出(四)

news/2024/7/4 0:48:55 标签: delphi, string, 文本编辑, object, interface, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

class="MsoNormal">四、对特定字符串敏感的Edit控件

class="MsoNormal">我们这个控件将演示控件的自定义事件的书写。这个控件有一个类型为class="tags" href="/tags/STRING.html" title=string>stringSensitiveText属性,当用户在输入框中输入的文字为InvalidText时就会触发OnSensitiveText事件。按照惯例,我先把源码展示给大家:

class="MsoNormal">unit TextSenseEdit;

class="MsoNormal"> 

class="MsoNormal">class="tags" href="/tags/INTERFACE.html" title=interface>interface

class="MsoNormal"> 

class="MsoNormal">uses

class="MsoNormal">  SysUtils, Classes, Controls, StdCtrls;

class="MsoNormal">type

class="MsoNormal">  TSensitiveTextEvent = procedure(AText: class="tags" href="/tags/STRING.html" title=string>string) of class="tags" href="/tags/OBJECT.html" title=object>object;//方法指针

class="MsoNormal">  TTextSenseEdit = class(TEdit)

class="MsoNormal">  private

class="MsoNormal">    FSensitiveText: class="tags" href="/tags/STRING.html" title=string>string;

class="MsoNormal">    FOnSensitiveText: TSensitiveTextEvent;

class="MsoNormal">    procedure SetSensitiveText(AValue: class="tags" href="/tags/STRING.html" title=string>string);

class="MsoNormal">  protected

class="MsoNormal">    procedure Change;override;

class="MsoNormal">  public

class="MsoNormal">  published

class="MsoNormal">    property SensitiveText: class="tags" href="/tags/STRING.html" title=string>string read FSensitiveText write SetSensitiveText;

class="MsoNormal">    property OnSensitiveText: TSensitiveTextEvent read FOnSensitiveText write FOnSensitiveText;

class="MsoNormal">  end;

class="MsoNormal"> 

class="MsoNormal">procedure Register;

class="MsoNormal"> 

class="MsoNormal">implementation

class="MsoNormal"> 

class="MsoNormal">procedure Register;

class="MsoNormal">begin

class="MsoNormal">  RegisterComponents('Linco', [TTextSenseEdit]);

class="MsoNormal">end;

class="MsoNormal">procedure TTextSenseEdit.Change;

class="MsoNormal">begin

class="MsoNormal">  inherited;

class="MsoNormal">  if Text = SensitiveText then

class="MsoNormal">    if Assigned(OnSensitiveText) then

class="MsoNormal">      OnSensitiveText(Text);

class="MsoNormal">end;

class="MsoNormal"> 

class="MsoNormal">procedure TTextSenseEdit.SetSensitiveText(AValue: class="tags" href="/tags/STRING.html" title=string>string);

class="MsoNormal">begin

class="MsoNormal">  FSensitiveText := AValue;

class="MsoNormal">end;

class="MsoNormal">end.

class="MsoNormal">代码解释:

class="MsoNormal">1)、SensitiveText属性的添加方法大家已经熟悉了,这里不多解释。

class="MsoNormal">2)、正如大家猜测的,Change方法正是编辑框文字发生变化时的调度方法,它将引起OnChange事件。我们可以在这个方法中监控编辑框文字发生的变化,当文字等于SensitiveText就触发OnSensitiveText事件(具体的实现方法在后边解释)。

class="MsoNormal">3)、Delphi中的控件的事件机制是通过方法指针来实现的。声明方法指针的格式为:

class="MsoNormal">方法指针名称 = procedure(参数列表) of class="tags" href="/tags/OBJECT.html" title=object>object;

class="MsoNormal">声明事件属性的方法与声明普通属性的方法相同。在我们这个例子中,我们首先声明一个FOnSensitiveText: TSensitiveTextEvent;私有变量,然后property OnSensitiveText: TSensitiveTextEvent read FOnSensitiveText write FOnSensitiveText; 声明事件属性。这样注册控件后,当用户把控件放到窗体中后,就会在Object InspectorEvnets页中出现OnSensitiveText事件,我们就可以像使用其他事件一样使用这个事件了。

class="MsoNormal">  但是我们现在只是声明了一个事件属性,并没有书写任何代码来激发这个事件。我们应该在合适的时候激发此事件,显而易见我们应该在Change方法中激发此事件:

class="MsoNormal">procedure TTextSenseEdit.Change;

class="MsoNormal">begin

class="MsoNormal">  inherited;

class="MsoNormal">  if Text = SensitiveText then

class="MsoNormal">    if Assigned(OnSensitiveText) then

class="MsoNormal">      OnSensitiveText(Text);

class="MsoNormal">end;

class="MsoNormal">if Text = SensitiveText时就判断控件使用者是否为OnSetSensitiveText写代码了(准确的说是是否为OnSetSensitiveText事件句柄赋值了),如果写代码了则调用OnSetSensitiveText(Text);来激发OnSetSensitiveText事件,并把控件的Text传递给方法的Avalue参数。正如“方法指针”这个名字一样,被声明为方法指针类型的变量可以当作方法使用,用来激发事件。VCL已经为我们预定义了一些常用的事件句柄,我们直接拿来使用:TnotifyEventTmouseEventTmouseMoveEventTkeyPressEvent等,具体可以参考VCL源码。

class="MsoNormal">思考题:

class="MsoNormal">1、做一个支持累加运算的class="tags" href="/tags/WenBenBianJi.html" title=文本编辑>文本编辑框控件,用户可以在编辑框中输入正整数。当用户按回车时,如果编辑框中输入的不是正整数(为负数、小数或一般字符串)则触发控件的OnError事件;如果输入的是正整数,则开始计算从1到用户输入的那个正整数中所有整数的和(用123+……这种累加的办法实现,不要用(1+n)*n/2这种直接计算的方法),并且在计算工程中如果发现计算的中间结果位数是5,则触发OnTailFive事件。

 

http://www.niftyadmin.cn/n/1413626.html

相关文章

zlib压缩一个文件为gzip格式

网上有很多针对zlib的总结,但是很零散,自己经过总结,实现了用zlib压缩一个文件为gzip格式,似的可以直接使用winr工具解压。 具体方法是使用zlib的deflate系列函数,将buffer压缩为gzip格式,deflateInit2的参…

判断某一天是否是这个月的倒数第二天

方法一: if (date.AddDays(1).Month date.Month && date.AddDays(2).Month date.AddMonths(1).Month) 方法二: int day date.Day;if(day date.AddDays(1-day).AddMonths(1).AddDays(-2).Day) 转载于:https://www.cnblogs.com/zhangchaoran/p…

九大算法排序汇总

一、算法说明 数据结构中经常需要用到各种排序算法,故参考网上代码,将九个排序算法整合在一起,以便日后使用。算法运行时,可以选择所要采用的排序算法,并会输出每一趟的排序过程,更利于对排序算法的理解。…

Delphi控件开发浅入深出(六)

六、控件手拉手――控件关联的实现 控件的关联在Delphi中也是很常见的,我们可以设定一个控件的某个属性指向另一个控件。比如我们在窗体上放上Tedit,TpopupMenu两个控件,然后设定Tedit的PopupMenu属性为TpopupMenu控件,运行后在Tedit点击右键…

Xcode HeaderDoc 教程(2)

Code Snippets,让一切变得更简单:这真的非常easy,不是吗?但还能更简单一些吗?本站以前介绍过 code snippets。请看这里。Code snippets 在 Xcode 中扮演着无名英雄的角色。一个snippet 是一个能够重用的代码块(存储在 …

Delphi控件开发浅入深出(五)

五、复合控件 复合控件是Delphi控件中非常重要的一种控件,复合控件就是将两个或两个以上的控件重新组合成一个新的控件。例如TspinEdit、TlabeledEdit、TDBNavigator等就是复合控件,TDBNavigator其实就是在一个Panel放上若干个Button而已。制作一个复合…

P4219 [BJOI2014]大融合

传送门 动态维护森林 显然考虑 $LCT$ 但是发现询问求的是子树大小,比较不好搞 维护 $sum[x]$ 表示节点 $x$ 的子树大小,$si[x]$ 表示 $x$ 的子树中虚儿子的子树大小和 那么 $pushup$ 可以这样写: inline void pushup(int x) { sum[x]sum[c[x]…

Delphi控件开发浅入深出(七)

对话框控件的制作 Delphi中有很多对话框组件,例如TopenDialog、TfontDialog等。这些控件的特点就是虽然是不可视控件,但是在运行时都有一个可视化的效果,比如TopenDialog的可视化效果就是一个打开对话框。我们这次将开发一个日期对话框控件&…