星辰日月00

欲多则心散,心散则志衰,志衰则思不达也!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  为什么我们点击按钮,就会执行按钮的onclick事件?这个事件是怎么和我们自己的代码关联起来的。相信很多人都有这个疑问。那么我们就通过一个自定义事件来了解这里面得运行原理。以乘法运算来显示,如果乘数大于100,就提示用户,太大了。这个事件用自定义事件定义。 大家先看一下最终效果,

      我添加了三个文本框,一个按钮,当第一或者第二个文本框的数>100时,点求积按钮,提示Too Big 对话框。

      完成自定义事件需要5步来做:

1.定义TNotifyEvent类型私有变量

1 FTooBig:TNotifyEvent;

FTooBig是一个指针,它可以保持事件方法的调用地址。

2.公布一个属性

1 published
2   property OnTooBig:TNotifyevent read FTooBig write FTooBig;

OnTooBig这个属性用来操作FTooBig这个私有变量,因为FTooBig是个函数指针,所以但读这个变量时,也就调用了函数。

3.定义事件处理函数

1 procedure TooBigEvent(Sender: TObject);
2 
3 procedure TForm1.TooBigEvent(Sender: TObject);
4 begin
5     Application.MessageBox('Too Big','Test Event!',MB_OK);
6 end;

这是当文本框数太大时执行的方法。

4. 把事件处理函数赋值给TNotifyEvent私有变量

         FTooBig := TooBigEvent;

5. 当条件符合时执行事件处理函数

 1 procedure TForm1.Button1Click(Sender: TObject);
 2 var
 3    val1 : integer;
 4    val2 : integer;
 5    res  : integer;
 6 begin
 7   val1 := StrToInt(Edit1.Text);
 8   val2 := StrToInt(Edit2.Text);
 9   if(val1<100)and(val2<100) then
10   begin
11     res := val1*val2;
12     Edit3.Text := IntToStr(res);
13   end
14   else
15     if assigned(FTooBig) then OnTooBig(Self);
16 end;

 下面贴出全部代码:

View Code
 1 Code
 2 unit Unit1;
 3 
 4 interface
 5 
 6 uses
 7   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 8   Dialogs, StdCtrls;
 9 
10 type
11   TForm1 = class(TForm)
12     Edit1: TEdit;
13     Edit2: TEdit;
14     Edit3: TEdit;
15     Button1: TButton;
16     procedure TooBigEvent(Sender: TObject);
17     procedure Button1Click(Sender: TObject);
18     procedure FormCreate(Sender: TObject);
19   private
20 
21      FTooBig:TNotifyEvent; 
22     { Private declarations }
23   public
24     { Public declarations }
25   published
26     property OnTooBig:TNotifyevent read FTooBig write FTooBig;
27 end;
28 
29 var
30   Form1: TForm1;
31 
32 implementation
33 
34 {$R *.dfm}
35 
36 procedure TForm1.Button1Click(Sender: TObject);
37 var
38   val1 : integer;
39   val2 : integer;
40   res  : integer;
41 begin
42  val1 := StrToInt(Edit1.Text);
43  val2 := StrToInt(Edit2.Text);
44  if(val1<100)and(val2<100) then
45  begin
46  res := val1*val2;
47  Edit3.Text := IntToStr(res);
48  end
49  else
50  if assigned(FTooBig) then OnTooBig(Self);
51 end;
52 procedure TForm1.TooBigEvent(Sender: TObject);
53 begin
54 Application.MessageBox('Too Big','Test Event!',MB_OK);
55 end;
56 
57 
58 procedure TForm1.FormCreate(Sender: TObject);
59 begin
60 FTooBig := TooBigEvent;
61 end;
62 
63 end.

 

 

posted on 2012-07-07 09:12  星辰日月00  阅读(360)  评论(0)    收藏  举报