如何手动显式地产生一个事件,高分!!!
BCB的事件与Windows的消息是一一对应的吗?
有提供发送事件的函数吗?
还是要用SendMessage,PostMessage...
拜托。
问题点数:100、回复次数:12Top
1 楼kingcaiyao(aking)回复于 2002-07-29 23:44:15 得分 20
首先在BCB中,事件有两种类型:
一类是TNotifyEvent,这类事件通常是对WINDOWS消息的封装,它的定义是这样的:
typdef void __fastcall (__closure *TNoityEvent)(TObject *Sender);
它只有一个参数,即事件的发送者
另一类事件是自定义事件:
typedef void __fastcall (__closure TMyEvent(TObject *Sender,bool &Done)
BCB的事件处理是一种委托处理模型,即是说应用程序接受到消息后将对这个消息的处理交给事件处理函数来处理。事件处理函数是一个指针。
没有发送事件的函数,你发送相应的消息(比如说向当前活动窗体发送WM_LBUTTONDOWN,就会触发OnClick事件),就会触发相应的事件,如果没有事件与之对应,VCL会采用默认的处理。Top
2 楼gfh21cn(葛凤华)回复于 2002-07-30 07:21:20 得分 10
同意kingcaiyao(AKing)
事件函数是可以复制的。
你象OnKeyDown事件,我们可以做个函数myKeyDown();[参数要一样]
然后OnKeyDown=myKeyDown;
这样就相当于在WM_KEYDOWN的消息映射到我的那个函数里去了。
Top
3 楼lj_csdn(大笨蛋)回复于 2002-07-30 08:28:58 得分 0
直接执行也可以。
如定义了Button1click(Sendor)
某个地方要执行该动作
Button1click(NULL);Top
4 楼xiaoguoru(肖干)回复于 2002-07-30 08:41:11 得分 20
首先在窗体的头文件的Protected里声明一个如下结构:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND,TWMMenuSelect,SystemMenuCommand);
END_MESSAGE_MAP(TForm);//声明一个系统菜单操作消息.其中WM_SYSCOMMAND为一消息标识,TWMMenuSelect为一个对应的消息结构,SystemMenuCommand为自定义消息处理函数.它的声明也在Protected里,声明如下:
MESSAGE void __fastcall SystemMenuCommand(TWMMenuSelect &Msg);
它在.cpp文件里的实现如下
void __fastcall TfrmMain::SystemMenuCommand(TWMMenuSelect &Msg)
{
TForm::Dispatch(&Msg);
if(Msg.IDItem==200)
{
TfrmAbout *frmAbout=new TfrmAbout(this);
frmAbout->ShowModal();
delete frmAbout;
}
}Top
5 楼Bird1945(没有钱,我拿什么来爱你?)回复于 2002-07-30 08:44:49 得分 10
要用SendMessage和PostMessage
BCB没有提供发消息的函数.
Top
6 楼goldolphin(心向天空)回复于 2002-07-30 10:35:45 得分 0
如这个事件句柄,是自定义事件吧?怎么查到它的消息ID,帮助里没找到,要产生这样一个事件,该怎么办?
typedef void __fastcall (__closure *TGetSiteInfoEvent)(System::TObject
* Sender, TControl* DockClient, Types::TRect &InfluenceRect, const Types::TPoint &MousePos, bool &CanDock);Top
7 楼kingcaiyao(aking)回复于 2002-07-30 11:47:44 得分 20
没错,你上面写的事件是自定义事件。要产生这样一个事件,如果你在自已写控件时可以这样:
//定义一事件指针
typedef void __fastcall (__closure *TGetSiteInfoEvent)(System::TObject
* Sender, TControl* DockClient, Types::TRect &InfluenceRect, const Types::TPoint &MousePos, bool &CanDock);
class TMyControl::public TCustomControl
{
private:
TGetSiteInfoEvent FOnYourEvent;
// Other Fundamental members
public:
//public methods
protected:
virtual void __fastcall CreateWnd();
.....
virtual void __fastcall DoMyControl(TObject *Sender,TControl *DockClient,.......);
__published:
__property TGetSiteInfoEvent OnYourEvent={read=FOnYourEvent,write=FOnYourEvent};
}
//由上面定义的虚拟方法触发这个事件
void __fastcall DoMyControl(TObject *Sender,TControl *DockClient,....)
{
if(FOnYourEvent)
{
FOnYourEvent(this,DockClient,....);
}
}
Top
8 楼kingcaiyao(aking)回复于 2002-07-30 11:48:31 得分 0
没错,你上面写的事件是自定义事件。要产生这样一个事件,如果你在自已写控件时可以这样:
//定义一事件指针
typedef void __fastcall (__closure *TGetSiteInfoEvent)(System::TObject
* Sender, TControl* DockClient, Types::TRect &InfluenceRect, const Types::TPoint &MousePos, bool &CanDock);
class TMyControl::public TCustomControl
{
private:
TGetSiteInfoEvent FOnYourEvent;
// Other Fundamental members
public:
//public methods
protected:
virtual void __fastcall CreateWnd();
.....
virtual void __fastcall DoMyControl(TObject *Sender,TControl *DockClient,.......);
__published:
__property TGetSiteInfoEvent OnYourEvent={read=FOnYourEvent,write=FOnYourEvent};
}
//由上面定义的虚拟方法触发这个事件
void __fastcall DoMyControl(TObject *Sender,TControl *DockClient,....)
{
if(FOnYourEvent)
{
FOnYourEvent(this,DockClient,....);
}
}
Top
9 楼kingcaiyao(aking)回复于 2002-07-30 11:50:59 得分 0
没错,你上面写的事件是自定义事件。要产生这样一个事件,如果你在自已写控件时可以这样:
//定义一事件指针
typedef void __fastcall (__closure *TGetSiteInfoEvent)(System::TObject
* Sender, TControl* DockClient, Types::TRect &InfluenceRect, const Types::TPoint &MousePos, bool &CanDock);
class TMyControl::public TCustomControl
{
private:
TGetSiteInfoEvent FOnYourEvent;
// Other Fundamental members
public:
//public methods
protected:
virtual void __fastcall CreateWnd();
.....
virtual void __fastcall DoMyControl(TObject *Sender,TControl *DockClient,.......);
__published:
__property TGetSiteInfoEvent OnYourEvent={read=FOnYourEvent,write=FOnYourEvent};
}
//由上面定义的虚拟方法触发这个事件
void __fastcall DoMyControl(TObject *Sender,TControl *DockClient,....)
{
if(FOnYourEvent)
{
FOnYourEvent(this,DockClient,....);
}
}
Top
10 楼goldolphin(心向天空)回复于 2002-07-30 12:30:16 得分 0
还有一个问题,
MDI窗口,设为可停泊的,当把它拖到个DockSite如ControlBar上,则进行泊定。要实现的是将窗口中的一个控件如TTreeView合到ControlBar上,应该怎样操作。
当要把Treeview从ControlBar中拖出来,又该怎么操作。Top
11 楼goldolphin(心向天空)回复于 2002-07-30 18:21:52 得分 0
自己给自己UP!!!Top
12 楼mikesome()回复于 2002-07-30 20:01:14 得分 10
不要用SendMessage和PostMessage,当然这两个用起来也很简单,看看帮助即可。你如果要调用一个事件,那就直接写那个事件的对应函数名即可,参数可以为NULL,或自己特别设置Top
13 楼goldolphin(心向天空)回复于 2002-07-30 20:09:47 得分 0
楼上的错了我的意思了~~~~
如果要发生的事件不完全是我来响应,还要系统自动完成一些工作,那怎么办?比如仍以上面提到的泊定为例。窗口合并不在我的消息处理函数中。
但是我希望发送事件使系统对我的窗口进行合并等操作。Top
14 楼cdws222(二当家)回复于 2002-07-30 20:25:38 得分 10
直接执行它的方法就行了,比如点击按钮 Button1->Click();Top
相关问题
- C#的Socket编程问题,为何手动关闭Socket连接回导致一个接收数据事件的产生?
- C#中怎么样可以直接编写一个事件响应程序,象VB一样,而不必手动编写事件响应的声明部分。
- 如何手动触发dropdownlist的 SelectedIndexChanged事件啊
- 请教:可否在Button_Click后不产生Post事件?一定给分
- [请教高手]动态生成的RadioButton控件,触发事件的问题?
- DCOM 中怎么不能产生事件?
- VC++中,窗口的最大化,最小化和关闭,分别触发什么事件,如何判断这些事件是否产生
- 怎样在 onreadystatechange 事件中找到产生事件的对象?
- 大家好!请问结束任务时会产生什么事件?最后20分了!(寂寞寒冰)
- 菜鸟求救:关于动态产生的按钮怎样编辑它的点击事件,给分100




