Delphi 自定义事件的例子

2023-05-16

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

unit TextSenseEdit;

interface

uses

  SysUtils, Classes, Controls, StdCtrls;

type

  TSensitiveTextEvent = procedure(AText: string) of object;//方法指针

  TTextSenseEdit = class(TEdit)

  private

    FSensitiveText: string;

    FOnSensitiveText: TSensitiveTextEvent;

    procedure SetSensitiveText(AValue: string);

  protected

    procedure Change;override;

  public

  published

    property SensitiveText: string read FSensitiveText write SetSensitiveText;

    property OnSensitiveText: TSensitiveTextEvent read FOnSensitiveText write FOnSensitiveText;

  end;

procedure Register;

implementation

procedure Register;

begin

  RegisterComponents('Linco', [TTextSenseEdit]);

end;

procedure TTextSenseEdit.Change;

begin

  inherited;

  if Text = SensitiveText then

    if Assigned(OnSensitiveText) then

      OnSensitiveText(Text);

end;

procedure TTextSenseEdit.SetSensitiveText(AValue: string);

begin

  FSensitiveText := AValue;

end;

end.

代码解释:

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

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

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

方法指针名称 = procedure(参数列表) of object;

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

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

procedure TTextSenseEdit.Change;

begin

  inherited;

  if Text = SensitiveText then

    if Assigned(OnSensitiveText) then

      OnSensitiveText(Text);

end;

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

思考题:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi 自定义事件的例子 的相关文章

随机推荐

  • onDraw什么时候被调用?

    1 onDraw是在View初化完成之后开始调用 2 postInvalidate 是重绘的 xff0c 也就是调用postInvalidate 后系统会重新调用onDraw方法画一次 onDraw实例 xff1a Java code 64
  • Android 动态绘制曲线等各种图形

    Android 中动态的绘制有两种方法 xff0c 一种是用OpenGL ES xff0c 它主要用来做3D图形开发 xff0c 对于一般的应用 xff0c 我们会采取自定义一个View xff0c 然后覆盖onDraw 的方法 xff0c
  • Android 曲线图绘制

    最近项目里要做一个简单的曲线图来标识数据 xff0c 开始以为很简单 xff0c android已经有那么多的开源图表库了 xff0c 什么achartenginee hellochart xff0c mpandroidchart等等 xf
  • android中在代码中动态布按钮和画板局并绘制曲线

    strong 绘图面板基类继承View strong package com mytest myapplication Utility import android graphics Color import android util Lo
  • html5 div布局与table布局

    div布局 xff1a html 43 css实现简单布局 container中height不能写成百分数 xff0c 必须为具体高度 lt DOCTYPE html gt lt html gt lt head lang 61 34 en
  • andorid程序UI线程下开启子线程闪退错误解决

    android view ViewRootImpl CalledFromWrongThreadException Only the original 运行时报 android view ViewRootImpl CalledFromWron
  • Android子线程更新UI的方法总结

    消息机制 xff0c 对于Android开发者来说 xff0c 应该是非常熟悉 对于处理有着大量交互的场景 xff0c 采用消息机制 xff0c 是再好不过了 有些特殊的场景 xff0c 比如我们都知道 xff0c 在Android开发中
  • android中多线程绘制曲线图实例

    画板基类继承view package com mytest myapplication Utility import android graphics Color import android util Log import android
  • InterlockedCompareExchangePointer 的作用和例子

    PVOID InterlockedCompareExchangePointer in out PVOID volatile Destination in PVOID Exchange in PVOID Comperand Interlock
  • java读取xml文件的四种方法

    Xml代码 1 lt xml version 61 34 1 0 34 encoding 61 34 GB2312 34 gt 2 lt RESULT gt 3 lt VALUE gt 4 lt NO gt A1234 lt NO gt 5
  • Android多线程之同步锁的使用

    本文主要介绍了Android多线程之同步锁的使用 xff0c 分享给大家 xff0c 具体如下 xff1a 一 同步机制关键字synchronized 对于Java来说 xff0c 最常用的同步机制就是synchronized关键字 xff
  • C#使用 System.Net.Mail发送邮件功能

    C 使用 System Net Mail发送邮件功能 NET 里包含了很多很丰富的邮件发送与接受的API在 System Net Mail命名空间里 xff0c 使得我们开发发送和接受邮件相关功能变得简单 xff0c 下面是一个简单发送邮件
  • C#SMTP发邮件

    简单邮件传输协议 Simple Mail Transfer Protocol SMTP 是事实上的在Internet传输email的标准 C 邮件传输主要用到了 SmtpClient 和MailMessage 类 SmtpClient类是客
  • C#发送邮件实例

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • closehandle()函数

    引用自 百度百科 xff0c 用于解决今天遇到的close handle 后什么时候释放资源问题 xff1a 方法名称 xff1a CloseHandle 位置 xff1a Kernel32 dll BOOL CloseHandle HAN
  • c++清空串口缓冲区

    缓冲区控制 Win32通信API除了提供SetupComm 函数实现初始化的缓冲区控制外 xff0c 还提供了PurgeComm 函数和FlushFileBuffers 函数来进行缓冲区操作 PurgeComm 函数的声明如下 xff1a
  • C++ int与string的转化

    int本身也要用一串字符表示 xff0c 前后没有双引号 xff0c 告诉编译器把它当作一个数解释 缺省情况下 xff0c 是当成10进制 xff08 dec xff09 来解释 xff0c 如果想用8进制 xff0c 16进制 xff0c
  • c++中字符数组内存和指针问题示例解答

    char id 61 34 123456 34 char c 61 34 SN 61 34 unsigned char buffer 20 int j 61 0 for int i 61 0 i lt strlen c i 43 43 bu
  • c++中LPCTSTR,LPTSTR 解释

    char是C语言标准数据类型 xff0c 字符型 xff0c 至于由几个字节组成通常由编译器决定 xff0c 一般一个字节 Windows为了消除各编译器的差别 xff0c 重新定义了一些数据类型 xff0c 你提到了另外几个类型都是这样
  • Delphi 自定义事件的例子

    我们这个控件将演示控件的自定义事件的书写 这个控件有一个类型为string的SensitiveText属性 xff0c 当用户在输入框中输入的文字为InvalidText时就会触发OnSensitiveText事件 按照惯例 xff0c 我