在C++ Builder中定义事件

原创 2003年02月12日 11:00:00

在C++ BUILDER中,事件是一种委托模型,它是对消息的封装。如果你用过VC,你就知道在VC中并不存在什么事件,而只有消息处理函数,而在C++ BUILDER中则是由事件处理函数来负责响应消息。同是,事件本身也是一指针,它是一个闭包,通常在C++ BUILDER中有两种事件:通知类型事件(即TNOTIFYEVENT,对WINDOWS消息的封装)和自定义事件。除此之外,我们也知道事件是通过一个虚拟函数来点燃的,比如说ONEXIT事件是由DOEXIT虚拟函数点燃的,下面我写一个自定义事件,很明显以下我写的代码中的事件将是对WM_MYMESSAGE消息的封装.
.h File
#include <....>
.....
#define WM_MYMESSAGE WM_USER+100
typedef void __fastcall (__closure *TMyEvent)(TObject *Sender,Param1,Param2,......);

class TMyControl:public TWinControl
{
private:
   TMyEvent FOnMyEvent;//保存指向事件的指针.
   void __fastcall DoSomething(TMessage &Message);
public:
   BEGIN_MESSAGE_MAP
      VCL_MESSAGE_HANDLER(WM_MYMESSAGE,TMessage,DoSomething);
   END_MESSAGE_MAP(TControl);  
protected:
   virtual void __fastcall DoMyEvent(Param1,........);//由这个虚拟函数来触发事件
   virtual void __fastcall WndProc(TMessage &Message);
__published:
    .........  
    __property TMyEvent OnMyEvent={read=FOnMyEvent,write=FOnMyEvent};
    .....  
};

.cpp File

//Omiting constructor and deconstructor
//Virtual function,which will spring the event:TMyEvent
void __fastcall TMyControl::DoMyEvent(Param1,.....)
{
   if(FOnMyEvent)
   {
       FOnMyEvent(this,Param1,Param2,.....Paramn);
   }
}
//Message Handler
void __fastcall TMyControl::DoSomething
{
  //TODO:Add your code here....
}
void __fastcall TMyControl::WndProc(TMessage &Message)
{
    if(Message.Msg==WM_MYMESSAGE)
    {
          DoMyEvent(Message.WParam,.....);
    }
    ......
}
按照上而的代码,我们就会在OBJECT INSPECTOR中看到一个ONMYEVENT事件,和其它事件一样,用户只要将代码写到这里来就可以响应消息并根据应用的需求来给出这个事件触发时的行为,上面代码是随手写的,请各位自已加以调整.

C++ 自定义事件机制2

eventdispatcher.h #pragma once #include #include #include "myevent.h" #include #include "eventit...
  • kakaxi2222
  • kakaxi2222
  • 2015年06月16日 08:59
  • 354

转载 在C++ Builder中定义事件

在C++   Builder中定义事件         kingcaiyao(原作)             在C++   BUILDER中,事件是一种委托模型,它是对消息的封装。如果你用过VC,你就...
  • wanyuehan
  • wanyuehan
  • 2008年03月28日 14:56
  • 491

在C++Builder中定义全局变量

好象很多新手不知道如何在C++Builder中定义全局变量,一般在一个MDI的程序中会多次用到她,希望看完这篇文章后会对你有所帮助。    定义一个全局变量可以分为三步来完成,分别为:定义,重新声明...
  • binnygoal
  • binnygoal
  • 2013年02月19日 21:26
  • 1335

c++builder字符串使用

AnsiString temp = "Update Image process:1%"; AnsiString temp2 = temp.SubString(22,4); ...
  • lz465350
  • lz465350
  • 2014年11月06日 14:38
  • 1017

c++ builder里四种处理“鼠标离开窗体”事件的方法

       在处理窗体消息的时候,我想不少人都会碰到鼠标离开窗体的消息(下面称之为MouseLeave)。在C++ Builder里,并没有直接提供处理这种消息的方法,需要我们自己动手来做。通过参考...
  • hhdsq
  • hhdsq
  • 2002年11月19日 14:55
  • 1408

c++builder隐藏程序任务栏图标 .

1. void __fastcall TfrmLogHook::FormCreate(TObject *Sender) { DWORD dwExStyle=GetWindowLong(A...
  • anyqu
  • anyqu
  • 2013年09月19日 13:25
  • 1554

C++ Builder初学问与答

一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另...
  • wozengcong
  • wozengcong
  • 2014年01月04日 16:44
  • 1533

C++ Builder 全部API

1. API 之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建...
  • wjj715211
  • wjj715211
  • 2013年10月21日 22:52
  • 2083

让程序响应组合键(c++builder&c#)

 c++builder中让FORM响应组合键:1.首先要设置form的keypreview==true,如果一个Form上有Edit、Memo。它们都有OnKeyPress事件,那么当Form的Key...
  • wesleyluo
  • wesleyluo
  • 2008年12月31日 09:21
  • 2234

C++ Builder高手进阶 (四)动态显示任务栏图标

C++ Builder高手进阶  (四)动态显示任务栏图标nxyc_twz@163.com      在应用程序运行时,有时可能会因为要处理的数据量很大而暂时失去反应,这样给用户的感觉极其不好,影响了...
  • nxyc_twz
  • nxyc_twz
  • 2003年01月29日 13:58
  • 1612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C++ Builder中定义事件
举报原因:
原因补充:

(最多只允许输入30个字)