主题:紧急求助:请问如何创建自定义事件以及激活
代菲蔡鸟
[专家分:0] 发布于 2006-07-18 09:06:00
初级菜鸟,想自己定义一个事件,想知道如何触发事件、定义处理过程类型、声明事件以及调用事件,请各位前辈指教,呵呵,最好能有例子程序。
回复列表 (共2个回复)
沙发
wealthy [专家分:1840] 发布于 2006-07-21 09:59:00
什么是事件
事件是联接发生的事情与某些代码的机制,或者说是方法指针,一个指向特定对象实例的特定方法的指针。从部件用户的角度,事件是与系统事件(如OnClick)有关的名称,用户能给该事件赋特定的方法供调用。例如,按钮Buttonl有OnClick方法,缺省情况下Delphi在包含该按钮的窗体中产生一个为ButtonlClick的方法,并将其赋给OnClick。当一个Click事件发生在按钮上时,按钮调用赋给OnClick的方法ButtonlClick:
部件用户将事件看作是由用户编写的代码,而事件发生时由系统调用的处理办法。
从部件编写者角度事件有更多的含义。最重要的是提供了一个让用户编写代码响应特定事情的场所。
要编写一个事件,应当理解:
● 事件和方法指针
● 事件是属性
● 事件处理过程类型
⑴ 事件是方法指针
Delphi使用方法指针实现事件。一个方法指针是指向特定对象实例的特定方法的特定指针。作为部件编写者,能将方法指针作为一种容器。你的代码一发现事情发生,就调用由用户定义的方法。
方法指针的工作方式就象其它的过程类型,但它们保持一个隐含的指向对象实例的指针。所有的控制都继承了一个名为Click的方法,以处理Click事件。Click方法调用用户的Click事件处理过程。
procedure TControl.Click;
begin
if Assigned(OnClick ) then OnClick( Self );
end;
如果用户给Control的OnClick事件赋了处理过程(Handle),那鼠标点按Control时将导致方法被调用。
⑵ 事件是属性
部件采用属性的形式实现事件。不象大多数其它属性,事件不使用方法来使实现read和write部分。事件属性使用了相同类型的私有对象域作为属性。按约定域名在属性名前加“F”。例如OnClick方法的指针,存在TNotifyEvent类型FOnClick域中。OnClick事件属性的声明如下:
type
TControl=class ( TComponent )
private
FOnClick: TNofiFyEvent; { 声明保存方法指针的域 }
protected
property OnClick: TNotifyEvent read FOnClick write FOnClick;
end;
象其它类型的属性一样,你能在运行时设置和改变事件的值。将事件做成属性的主要好处是部件用户能在设计时使用Object Inspector设置事件处理过程。
⑶ 事件处理过程类型
因为一个事件是指向事件处理过程的指针,因此事件属性必须是方法指针类型,被用作事件处理过程的代码,必须是相应的对象的方法。
所有的事件方法都是过程。为了与所给类型的事件兼容,一个事件处理过程必须有相同数目和相同类型的相同顺序的参数。Delphi定义了所有标准事件处理过程的方法类型,当你创建自己的事件时,你能使用已有的事件类型,或创建新的。虽然不能用函数做事件处理过程,但可以用var参数得到返回信息。
在事件处理过程中传递var参数的典型例子是TKeyPressEvent类型的KeyPressed事件。TKeyPressEvent定义中含有两个参数。一个指示哪个对象产生该事件。另一个指示那个键按下:
type
TKeyPressEvent=procedure( Sender: TObject; var key: char) of Object;
通常key参数包含用户按下键的字符。在某些情况下,部件的用户可能想改变字符值。例如在编辑器中强制所有字符为大写,在这种情况下,用户能定义下列的事件处理过程:
procedureTForml.EditlKeyPressed( Sender: TObject; var key: char);
begin
key := Upcase( key );
end;
板凳
wealthy [专家分:1840] 发布于 2006-07-21 10:21:00
自定义事件例:
public
//声明自定义事件
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TForm1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
m_frm2 := TForm2.Create(Self);
//指定当m_frm2的自定义事件发生时的处理程序
m_frm2.OnSelectionChanged := frm2_SelectionChanged;
end;
destructor TForm1.Destroy;
begin
m_frm2.Free;
inherited Destroy;
end;
我来回复