回 帖 发 新 帖 刷新版面

主题:紧急求助:请问如何创建自定义事件以及激活

初级菜鸟,想自己定义一个事件,想知道如何触发事件、定义处理过程类型、声明事件以及调用事件,请各位前辈指教,呵呵,最好能有例子程序。 
 

回复列表 (共2个回复)

沙发

什么是事件

事件是联接发生的事情与某些代码的机制,或者说是方法指针,一个指向特定对象实例的特定方法的指针。从部件用户的角度,事件是与系统事件(如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;


板凳

自定义事件例:
 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;

我来回复

您尚未登录,请登录后再回复。点此登录或注册